首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Camlp5 (以前的Camlp4)如何解析表达式

Camlp5 (以前的Camlp4)如何解析表达式
EN

Stack Overflow用户
提问于 2015-08-31 21:31:56
回答 1查看 191关注 0票数 3

根据我在互联网上的搜索,看起来Camlp5 (以前的Camlp4)使用递归下降解析器,而ocamlyacc是一个基于LALR的解析器生成器。

在LALR解析器生成器中,优先级和关联性被映射为移位/减少冲突。我的问题是,像Camlp5这样的递归下降解析器如何处理声明性运算符优先?

代码语言:javascript
复制
 # 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解析器的内部工作原理的任何见解或链接。

EN

回答 1

Stack Overflow用户

发布于 2015-08-31 23:11:38

Recursive Descent Parser不像LALR那样是一个表驱动的解析器。解析器做出的决策被硬编码在函数体中(每个规则都是一个函数)。实际上,CamlpN将语法定义compiles到一组相互递归的函数中。这里的制胜之处在于,您不需要手动编写此函数。所以,如果你改变了一个语法,你只需要更新一个语法定义,所有必要的函数都会为你更新。在一个常规的手工编码的递归解析器中,你需要自己更新它,这是非常容易出错的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32312521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档