【发布时间】:2020-03-14 11:02:43
【问题描述】:
我正在尝试在我的解析器中实现括号,但我的语法出现了冲突。 “语法冲突:当前瞻标记为 ) 时可能执行多个操作” 这是它的简化版本:
// 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
不带括号的函数调用视为语句,带括号的函数调用视为表达式。
我该如何解决这个冲突?
【问题讨论】:
-
您还在尝试实现 VBA 吗?还是这是一种类似于 VBA 但在所有细节上都不相同的语言?
-
@rici 仍在尝试实现 vba
-
我的理解是VBA不允许
Foo(a,b)形式的调用语句;只有Call Foo(a,b)或Foo a, b。至少,它是这么说的here -
" 如果使用 Call 关键字调用需要参数的过程,argumentlist 必须用括号括起来。如果省略 Call 关键字,则还必须省略argumentlist 周围的括号。"
-
@rici,不,您可以省略 call 关键字并同时使用 Foo(a,b) Foo a,b
标签: parsing bison yacc parser-generator jison