diff options
| author | Juan Linietsky | 2014-09-15 11:33:30 -0300 |
|---|---|---|
| committer | Juan Linietsky | 2014-09-15 11:33:30 -0300 |
| commit | 8cab401d08f8e25aa9b2dc710204785858ff3dbb (patch) | |
| tree | 1a4cec868f937fb24d340ee33fbeba2f1c6fa9f2 /modules/gdscript/gd_parser.cpp | |
| parent | 1a2cb755e2d8b9d59178f36702f6dff7235b9088 (diff) | |
| download | godot-8cab401d08f8e25aa9b2dc710204785858ff3dbb.tar.gz godot-8cab401d08f8e25aa9b2dc710204785858ff3dbb.tar.zst godot-8cab401d08f8e25aa9b2dc710204785858ff3dbb.zip | |
Diffstat (limited to 'modules/gdscript/gd_parser.cpp')
| -rw-r--r-- | modules/gdscript/gd_parser.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/modules/gdscript/gd_parser.cpp b/modules/gdscript/gd_parser.cpp index 40c262c50..ef9e85a8c 100644 --- a/modules/gdscript/gd_parser.cpp +++ b/modules/gdscript/gd_parser.cpp @@ -256,6 +256,55 @@ GDParser::Node* GDParser::_parse_expression(Node *p_parent,bool p_static,bool p_ tokenizer->advance(); expr=constant; + } else if (tokenizer->get_token()==GDTokenizer::TK_PR_YIELD) { + + //constant defined by tokenizer + + tokenizer->advance(); + if (tokenizer->get_token()!=GDTokenizer::TK_PARENTHESIS_OPEN) { + _set_error("Expected '(' after 'yield'"); + return NULL; + } + + tokenizer->advance(); + + OperatorNode *yield = alloc_node<OperatorNode>(); + yield->op=OperatorNode::OP_YIELD; + + if (tokenizer->get_token()==GDTokenizer::TK_PARENTHESIS_CLOSE) { + expr=yield; + tokenizer->advance(); + } else { + + Node *object = _parse_and_reduce_expression(p_parent,p_static); + if (!object) + return NULL; + yield->arguments.push_back(object); + + if (tokenizer->get_token()!=GDTokenizer::TK_COMMA) { + + _set_error("Expected ',' after first argument of 'yield'"); + return NULL; + } + + tokenizer->advance(); + + Node *signal = _parse_and_reduce_expression(p_parent,p_static); + if (!signal) + return NULL; + yield->arguments.push_back(signal); + + if (tokenizer->get_token()!=GDTokenizer::TK_PARENTHESIS_CLOSE) { + + _set_error("Expected ')' after second argument of 'yield'"); + return NULL; + } + + tokenizer->advance(); + + expr=yield; + } + } else if (tokenizer->get_token()==GDTokenizer::TK_SELF) { @@ -1067,6 +1116,10 @@ GDParser::Node* GDParser::_reduce_expression(Node *p_node,bool p_to_const) { } return op; //don't reduce yet + + } else if (op->op==OperatorNode::OP_YIELD) { + return op; + } else if (op->op==OperatorNode::OP_INDEX) { //can reduce indices into constant arrays or dictionaries |
