解决Bison的转变/减少冲突

时间:2016-06-18 03:10:28

标签: bison yacc

存在冲突的语法如下

MyOutput<T, S>

问题在于,当它读取T_ID时,它不知道它是否应该移位并读取以下内容(&#39;或减少到一个值。但不应该这样。检查下一个标记是否是左括号?

我对野牛和解析器一般都很陌生,我想知道我可以用什么方法重写语法并解决冲突?

修改

method_call: T_ID T_LPAREN method_arg_list T_RPAREN T_SEMICOLON

value: T_ID T_LSB expr T_RSB
     | T_ID;

method_arg_list: /* Empty */
               | method_arg method_arg_list;

method_arg: string_constant
          | expr;

expr: value
    | '(' expr ')';

1 个答案:

答案 0 :(得分:0)

Leffler是正确的:我们需要了解一些可能依赖于方法调用和值等的更高级别的句子结构。

我从概念的角度看待发生了什么:我们不需要陷入任何“y.output”细节。一切都源于你没有用逗号分隔方法调用的参数。另外,我很想知道为什么你正在递归地收集你的参数列表而不是左递归。

'('和T_LPAREN之间,'之间'和'T_RPAREN之间有什么区别? lex在一个案例中返回,另一个在另一个案例中吗?在我看来,简单的模式\(不能映射到这两个,但只能映射到一个;同样适用于模式\)。此外,为了便于阅读,请不要理会定义,例如T_LSB,其中'['会很好。