有问题的 Bison 语法不接受调用或调用之后的任何调用;
Problematic Bison grammar not accepting a call of a call or anything after a call other than ;
我有一些 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 shift/reduce 错误。
你的最后一部作品如下(没有那些无关紧要的动作):
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
顺便说一句,这与您为二元运算符编写产生式的方式非常相似。 (当然,二元运算符有一个右手操作数。)
我有一些 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 shift/reduce 错误。
你的最后一部作品如下(没有那些无关紧要的动作):
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
顺便说一句,这与您为二元运算符编写产生式的方式非常相似。 (当然,二元运算符有一个右手操作数。)