feat: made parsing code more defensive
This commit is contained in:
parent
1e1bb8936f
commit
247f6b54c2
|
@ -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])
|
||||
|
||||
|
|
Reference in a new issue