From a57f2193d91979fa12d002c6f726252436921b7b Mon Sep 17 00:00:00 2001 From: Bram Dingelstad Date: Tue, 7 Dec 2021 10:33:03 +0100 Subject: [PATCH] Fixed another crash --- addons/Wol/core/compiler/Compiler.gd | 3 +++ addons/Wol/core/compiler/Parser.gd | 20 +++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/addons/Wol/core/compiler/Compiler.gd b/addons/Wol/core/compiler/Compiler.gd index d705ec2..82996ff 100644 --- a/addons/Wol/core/compiler/Compiler.gd +++ b/addons/Wol/core/compiler/Compiler.gd @@ -412,6 +412,9 @@ func generate_assignment(node, assignment): emit(Constants.ByteCode.Pop, node) func generate_expression(node, expression): + if self.assert(expression != null, 'Wrong expression (perhaps unterminated command block ">>"?)'): + return false + match expression.type: Constants.ExpressionType.Value: generate_value(node, expression.value) diff --git a/addons/Wol/core/compiler/Parser.gd b/addons/Wol/core/compiler/Parser.gd index da66de5..526b569 100644 --- a/addons/Wol/core/compiler/Parser.gd +++ b/addons/Wol/core/compiler/Parser.gd @@ -25,7 +25,16 @@ func parse_node(): return WolNode.new('Start', null, self) func next_symbol_is(valid_types): - compiler.assert(tokens.size() != 0, 'Ran out of tokens looking for next symbol!') + if tokens.size() == 0: + var error_tokens = [] + for token in valid_types: + error_tokens.append(Constants.token_name(token)) + + if error_tokens == ['TagMarker']: + error_tokens.append('OptionEnd') + + compiler.assert(tokens.size() != 0, 'Ran out of tokens looking for next symbol "%s"!' % PoolStringArray(error_tokens).join(', ')) + return tokens.front() and tokens.front().type in valid_types # NOTE: 0 look ahead for `<<` and `else` @@ -734,7 +743,8 @@ class ExpressionNode extends ParseNode: #next token is parent - left next = parser.expect_symbol([Constants.TokenType.LeftParen]) - op_stack.push_back(next) + if next: + op_stack.push_back(next) elif next.type == Constants.TokenType.Comma: #resolve sub expression before moving on @@ -906,7 +916,11 @@ class ExpressionNode extends ParseNode: if parser.compiler.assert(Operator.is_op(_type), 'Unable to parse expression!'): return false - + + # FIXME: Make sure there can't be a Null value here + if parser.compiler.assert(operator_stack.back() != null, 'Something went wrong getting precedence'): + return false + var second = operator_stack.back().type if not Operator.is_op(second):