Parsing 有问题的野牛语法不接受呼叫的呼叫或呼叫后的任何事情,除了;
我在Bison有一些语法:。 它相当长,但不是很复杂 问题是,在调用之后,它将不接受除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个移位/减少错误。您上一次生成的内容如下(没有操作,这是一个无关的干扰): 因此,这些后缀运算符的参数必须是基本操作数。在
之外的任何内容代码>例如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