gpt4 book ai didi

ocaml - Camlp5(原Camlp4)如何解析表达式

转载 作者:行者123 更新时间:2023-12-04 19:49:24 25 4
gpt4 key购买 nike

据我在 Internet 上搜索得出的结论,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 解析器内部工作的见解或链接。

最佳答案

Recursive Descent Parser不是表驱动的解析器,如 LALR。解析器做出的决定被硬编码在函数体中(每个规则都是一个函数)。事实上,CamlpN compiles将语法定义转换为一组相互递归函数。这里的成功之处在于您不需要手动编写此功能的代码。因此,如果您更改语法,您只需更新语法定义,所有必要的功能都会为您更新。在常规的手动编码递归解析器中,您需要自己更新它,这很容易出错。

关于ocaml - Camlp5(原Camlp4)如何解析表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32312521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com