有问题的Bison语法不接受呼叫的呼叫或呼叫后除;之外的任何内容



我在Bison中有一些语法:https://pastebin.com/raw/dA2bypFR.它相当长,但不是很复杂。

问题是,在调用后,它不会接受除;之外的任何内容,例如a(b)(c)并且无效,a(b).c无效,这两种情况都只接受右括号后的分号。a(b)+c是好的。

我尝试将call_or_getattr分成2,其中.的优先级高于(,但这意味着a().b是无效语法。

我还尝试将callgetattr放入basic_operand的定义中,但这导致了536个移位/减少错误。

您的上一个产品如下所示(没有操作,这是一种无关的干扰(:

call_or_getattr:
basic_operand
|   basic_operand '(' csv ')'
|   basic_operand '.' T_ID

所以这些是后缀运算符,它们的参数必须是basic_operand。在a(b)(c)中,(c)参数列表没有应用于basic_operand,因此语法与之不匹配。

我想,你在寻找的是:

call_or_getattr:
basic_operand
|   call_or_getattr '(' csv ')'
|   call_or_getattr '.' T_ID

顺便说一句,这与为二进制运算符编写乘积的方式非常相似。(当然,二进制运算符有一个右侧操作数。(

相关内容

最新更新