Я пытаюсь использовать скобки в моем парсере, но у меня конфликт в моей грамматике. «Конфликт в грамматике: несколько действий возможны, когда токен lookahead равен ) » Вот его упрощенная версия:
// grammar
{
"Root": ["", "Body"],
"Body": ["Line", "Body TERMINATOR Line"],
"Line": ["Expression", "Statement"],
"Statement": ["VariableDeclaration", "Call", "With", "Invocation"],
"Expression": ["Value", "Parenthetical", "Operation", "Assign"],
"Identifier": ["IDENTIFIER"],
"Literal": ["String", "Number"],
"Value": ["Literal", "ParenthesizedInvocation"],
"Accessor": [". Property"],
"ParenthesizedInvocation": ["Value ParenthesizedArgs"],
"Invocation": ["Value ArgList"],
"Call": ["CALL ParenthesizedInvocation"],
"ParenthesizedArgs": ["( )", "( ArgList )"],
"ArgList": ["Arg", "ArgList , Arg"],
"Arg": ["Expression", "NamedArg"],
"NamedArg": ["Identifier := Value"],
"Parenthetical": ["( Expression )"],
"Operation": ["Expression + Expression", "Expression - Expression"]
}
//precedence
[
['right', 'RETURN'],
['left', ':='],
['left', '='],
['left', 'IF'],
['left', 'ELSE', 'ELSE_IF'],
['left', 'LOGICAL'],
['left', 'COMPARE'],
['left', '&'],
['left', '-', '+'],
['left', 'MOD'],
['left', '\\'],
['left', '*', '/'],
['left', '^'],
['left', 'CALL'],
['left', '(', ')'],
['left', '.'],
]
В моей реализации мне нужны такие вызовы функций (с круглыми скобками и запятой) разделены):
Foo(1, 2)
Foo 1, 2
И иметь возможность использовать обычные скобки для приоритета операций. Даже в вызовах функций (но только в вызовах функций, заключенных в скобки):
Foo(1, (2 + 4) / 2)
Foo 1, 2
Вызов функции без круглых скобок, рассматриваемых как оператор, вызов функции с круглыми скобками, рассматриваемый как выражение.
Как мне разрешить этот конфликт