diff --git a/addons/Wol/core/compiler/Parser.gd b/addons/Wol/core/compiler/Parser.gd index 526b569..beb2770 100644 --- a/addons/Wol/core/compiler/Parser.gd +++ b/addons/Wol/core/compiler/Parser.gd @@ -199,8 +199,10 @@ class Statement extends ParseNode: while parser.next_symbol_is([Constants.TokenType.TagMarker]): parser.expect_symbol([Constants.TokenType.TagMarker]) - var tag = parser.expect_symbol([Constants.TokenType.Identifier]).value - tags.append(tag) + + if parser.next_symbol_is([Constants.TokenType.Identifier]): + var tag = parser.expect_symbol([Constants.TokenType.Identifier]).value + tags.append(tag) if tags.size() > 0: self.tags = tags @@ -414,7 +416,8 @@ class ShortCutOption extends ParseNode: func _init(index, parent, parser).(parent, parser): parser.expect_symbol([Constants.TokenType.ShortcutOption]) - label = parser.expect_symbol([Constants.TokenType.Text]).value + if parser.next_symbol_is([Constants.TokenType.Text]): + label = parser.expect_symbol([Constants.TokenType.Text]).value # FIXME: Parse the conditional << if $x >> when it exists var tags = [] @@ -427,11 +430,11 @@ class ShortCutOption extends ParseNode: condition = ExpressionNode.parse(self, parser) parser.expect_symbol([Constants.TokenType.EndCommand]) - elif parser.next_symbol_is([Constants.TokenType.TagMarker]): + elif parser.next_symbols_are([Constants.TokenType.TagMarker, Constants.TokenType.Identifier]): parser.expect_symbol([Constants.TokenType.TagMarker]) - var tag = parser.expect_symbol([Constants.TokenType.Identifier]).value - tags.append(tag) - + if parser.next_token_is([Constants.TokenType.Identifier]): + var tag = parser.expect_symbol([Constants.TokenType.Identifier]).value + tags.append(tag) self.tags = tags # parse remaining statements @@ -508,9 +511,9 @@ class OptionStatement extends ParseNode: # NOTE: if there is a | get the next string if parser.next_symbol_is([Constants.TokenType.OptionDelimit]): parser.expect_symbol([Constants.TokenType.OptionDelimit]) - var t = parser.expect_symbol([Constants.TokenType.Text, Constants.TokenType.Identifier]) - - strings.append(t.value as String) + if parser.next_symbol_is([Constants.TokenType.Text, Constants.TokenType.Identifier]): + var t = parser.expect_symbol([Constants.TokenType.Text, Constants.TokenType.Identifier]) + strings.append(t.value as String) label = strings[0] if strings.size() > 1 else '' destination = strings[1] if strings.size() > 1 else strings[0] @@ -524,7 +527,7 @@ class OptionStatement extends ParseNode: return tab(indent_level, 'Option: -> %s' % destination) static func can_parse(parser): - return parser.next_symbol_is([Constants.TokenType.OptionStart]) + return parser.next_symbols_are([Constants.TokenType.OptionStart, Constants.TokenType.Text]) class IfStatement extends ParseNode: var clauses = []# @@ -944,8 +947,12 @@ class Assignment extends ParseNode: func _init(parent, parser).(parent, parser): parser.expect_symbol([Constants.TokenType.BeginCommand]) parser.expect_symbol([Constants.TokenType.Set]) - destination = parser.expect_symbol([Constants.TokenType.Variable]).value - operation = parser.expect_symbol(Assignment.valid_ops()).type + + if parser.next_symbol_is([Constants.TokenType.Variable]): + destination = parser.expect_symbol([Constants.TokenType.Variable]).value + if parser.next_symbol_is(Assignment.valid_ops()): + operation = parser.expect_symbol(Assignment.valid_ops()).type + value = ExpressionNode.parse(self, parser) parser.expect_symbol([Constants.TokenType.EndCommand])