【发布时间】:2019-06-21 04:48:26
【问题描述】:
我有一个简单的玩具程序,用来玩二进制表达式。我希望正常的优先规则适用于括号中的表达式首先被评估,mult/div 等。我设置了以下代码,它似乎工作,但我有点困惑为什么会这样。
%left '+' '-'
%left '*' '/'
%%
start: e { printf("%d", $1);}
e: e '+' e { $$ = $1 + $3; }
| e '-' e { $$ = $1 - $3; }
| e '*' e { $$ = $1 * $3; }
| e '/' e { $$ = $1 / $3; }
| '(' e ')' { $$ = $2; }
| NUMBER { $$ = $1; }
;
例如,如果我输入 2 * (4 + 4),它将被正确评估为 2 * 8 而不是 8 + 4。我不确定它为什么会起作用。我想确保我对此的理解是正确的。当解析器遇到2 * (4 + 4) 时,它首先解析2 *,然后它会看到另一个e 规则,即(4 + 4)。然后它评估4 + 4,然后将这个值向上传递,所以现在我们在2 * 4?
如果我确保添加优先规则,这是定义二进制操作规则的好方法吗?还是我错过了一些极端情况(玩了很多,到目前为止还没有找到任何错误的答案)?
【问题讨论】:
-
bison 不生成递归下降解析器。即便如此,也很难理解为什么您认为括号可能不起作用。也许你需要问一个更准确的问题。