Parsing 有问题的野牛语法不接受呼叫的呼叫或呼叫后的任何事情,除了;

Parsing 有问题的野牛语法不接受呼叫的呼叫或呼叫后的任何事情,除了;,parsing,syntax-error,bison,operator-precedence,Parsing,Syntax Error,Bison,Operator Precedence,我在Bison有一些语法:。 它相当长,但不是很复杂 问题是,在调用之后,它将不接受除之外的任何内容例如a(b)(c)无效,a(b).c无效,两者仅在右括号后接受分号。 a(b)+c也可以 我尝试将call\u或\u getattr分为2,其中的优先级高于(),但这意味着a().b是无效语法 我还尝试将call和getattr放入basic\u操作数的定义中,但这导致了536个移位/减少错误。您上一次生成的内容如下(没有操作,这是一个无关的干扰): 因此,这些后缀运算符的参数必须是基本操作数。在

我在Bison有一些语法:。 它相当长,但不是很复杂

问题是,在调用之后,它将不接受除
之外的任何内容例如
a(b)(c)
无效,
a(b).c
无效,两者仅在右括号后接受分号。
a(b)+c也可以

我尝试将
call\u或\u getattr
分为2,其中
的优先级高于
),但这意味着
a().b
是无效语法


我还尝试将
call
getattr
放入
basic\u操作数的定义中,但这导致了536个移位/减少错误。

您上一次生成的内容如下(没有操作,这是一个无关的干扰):

因此,这些后缀运算符的参数必须是
基本操作数
。在
a(b)(c)
中,
(c)
参数列表未应用于
基本操作数
,因此语法不会匹配它

我想你想要的是:

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

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

谢谢!考虑到所有其他左、右关联二元运算符都使用此模式,我觉得没有注意到这一点非常愚蠢。
call_or_getattr:
    basic_operand
|   call_or_getattr '(' csv ')'
|   call_or_getattr '.' T_ID