我正在阅读《Flex and Bison》一书以了解解析器生成器的工作原理,并且有示例:
calclist: /* nothing */
| calclist exp EOL { printf("= %d\n", $1); }
;
exp: factor
| exp ADD factor { $$ = $1 + $3; }
| exp SUB factor { $$ = $1 - $3; }
;
factor: term
| factor MUL term { $$ = $1 * $3; }
| factor DIV term { $$ = $1 / $3; }
;
term: NUMBER
| ABS term { $$ = $2 >= 0? $2 : - $2; }
;
并且在书中说,上面的语法通过使用单独的非终结符号具有隐含的优先级。但它是如何工作的?假设我们有以下示例:(1 + 3 * 2
空格只是跳过)我们读取第一个令牌1
,它将被推送到堆栈,NUMBER
或者它会通过语法“冒泡”多长时间term
?factor
从哪个语法规则检查下一个标记?为什么这种语法乘法的优先级高于加法?