如何删除移位/重用警告?



我正在尝试制作编译器,现在正在尝试制作解析器。 我收到有关此状态的警告: 状态 89

62 expr: '(' expr . ')'
66     | expr . '+' expr
67     | expr . '-' expr
68     | expr . '*' expr
69     | expr . '/' expr
70     | expr . '%' expr
74     | expr . '&' expr
75     | expr . '|' expr
77 cond: expr .
78     | '(' expr . ')'
82     | expr . '=' expr
83     | expr . "<>" expr
84     | expr . '<' expr
85     | expr . '>' expr
86     | expr . ">=" expr
87     | expr . "<=" expr
"<>"  shift, and go to state 91
">="  shift, and go to state 92
"<="  shift, and go to state 93
'+'   shift, and go to state 94
'-'   shift, and go to state 95
'|'   shift, and go to state 96
'*'   shift, and go to state 97
'/'   shift, and go to state 98
'%'   shift, and go to state 99
'&'   shift, and go to state 100
'='   shift, and go to state 101
'<'   shift, and go to state 102
'>'   shift, and go to state 103
')'   shift, and go to state 119

$default  reduce using rule 77 (cond)

State 119
62 expr: '(' expr ')' .
78 cond: '(' expr ')' .
"and"     reduce using rule 62 (expr)
"and"     [reduce using rule 78 (cond)]
"or"      reduce using rule 62 (expr)
"or"      [reduce using rule 78 (cond)]
':'       reduce using rule 62 (expr)
':'       [reduce using rule 78 (cond)]
')'       reduce using rule 62 (expr)
')'       [reduce using rule 78 (cond)]
$default  reduce using rule 62 (expr)

我这部分的语法是:

expr:
T_const |
T_char_const | 
l_value | 
'(' expr ')' | 
func_call |
'+' expr | 
'-' expr | 
expr '+' expr |
expr '-' expr | 
expr '*' expr | 
expr '/' expr | 
expr '%' expr |
T_true | T_false |
'!' expr | 
expr '&' expr |
expr '|' expr
;
cond:
'(' cond ')' |
expr |
T_not cond |
cond T_and cond |
cond T_or  cond |
expr '=' expr |
expr T_not_equal expr |
expr '<' expr |
expr '>' expr |
expr T_greater_equal expr |
expr T_less_equal expr
;

这里有什么问题,我该如何解决它?我已经修复了一些班次/减少问题,但通常我不明白这个问题是什么。 谢谢

您的问题引用的语法具有以下结果:

cond: '(' cond ')'

但是从输出文件中引用的那个有生产:

cond: '(' expr ')'

还有一些其他差异清楚地表明输出文件不是从引用的语法生成的。这使回答问题的任务复杂化,尽管从根本上说,这两种情况下的问题都是相同的。我正在使用输出文件作为答案其余部分的参考。

由于您还有:

cond: expr

cond派生括号字符串的任何上下文中都存在歧义。(119州显示的冲突非常清楚地表明了这一点。例如,假设解析器遇到

not ( x )

x只能减少到expr(通过l_value),但有两种可能性:

not ( expr ) => not expr [ from expr: ( expr ) ]
=> not cond [ from cond: expr ]
not ( expr ) => not cond  [ from cond: ( eχpr ) ]

这种歧义存在于允许cond的所有上下文中。

语法上将表达式划分为布尔表达式和非布尔表达式是很棘手的,而且大多是不必要的。您最终允许将任何表达式用作布尔值(cond: expr),并且很可能允许(或者您的用户希望您允许)将布尔值分配给变量。因此,最简单和最常见的解决方案是只说值是值,表达式是表达式,没有特殊大小写布尔值。

如果你真的觉得有必要在语法上将两者分开,你会在最近的这个问题中找到一个例子。

相关内容

  • 没有找到相关文章

最新更新