据我在互联网上搜索可以弄清楚,看起来Camlp5(以前的Camlp4)使用递归下降解析器,而ocamlyacc
基于LALR的解析器生成器。
在 LALR 解析器生成器中,优先级和关联性被映射到移位/减少冲突。我的问题是像 Camlp5 这样的递归下降解析器如何处理声明性运算符优先级?
# let expr = Grammar.Entry.create gram "expr";;
# EXTEND
expr:
[ "add" LEFTA
[ x = expr; "+"; y = expr -> x + y
| x = expr; "-"; y = expr -> x - y ]
| "mult" RIGHTA
[ x = expr; "*"; y = expr -> x * y
| x = expr; "/"; y = expr -> x / y ]
| "simple" NONA
[ x = INT -> int_of_string x
| "("; e = expr; ")" -> e ] ]
;
END;;
它如何处理左递归调用?camlp5 (camlp4) 是否使用表驱动的运算符优先级方法:https ://en.wikipedia.org/wiki/Operator-precedence_parser
非常感谢任何有关 Camlp4 解析器内部工作的见解或链接。