我在Bison中有一些语法:https://pastebin.com/raw/dA2bypFR.它相当长,但不是很复杂。
问题是,在调用后,它不会接受除;
之外的任何内容,例如a(b)(c)
并且无效,a(b).c
无效,这两种情况都只接受右括号后的分号。a(b)+c
是好的。
我尝试将call_or_getattr
分成2,其中.
的优先级高于(
,但这意味着a().b
是无效语法。
我还尝试将call
和getattr
放入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
顺便说一句,这与为二进制运算符编写乘积的方式非常相似。(当然,二进制运算符有一个右侧操作数。(