首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OCaml中建立AST

在OCaml中建立AST
EN

Stack Overflow用户
提问于 2012-11-30 19:34:49
回答 2查看 1.5K关注 0票数 6

我正在使用OCaml为Scheme的子集构建递归下降解析器。下面是语法:

代码语言:javascript
复制
    S -> a|b|c|(T)
    T -> ST | Epsilon

所以说我有:

代码语言:javascript
复制
   type expr = 
       Num of int | String of string | Tuple of expr * expr

伪码

这些函数必须返回expr类型来构建AST

代码语言:javascript
复制
parseS  lr =
   if head matches '(' then
     parseL lr
   else
     match tokens a, b, or c

使用第一组S,它们是记号和‘(’‘):

代码语言:javascript
复制
parseL lr = 
   if head matches '(' or the tokens then
       Tuple (parseS lr, parseL lr)
  else
       match Epsilon

我的问题是,“既然我回不来(),那我该怎么回去呢?”OCaml函数需要相同的返回类型,即使对Epsilon部件保留空白,OCaml仍然采用单元类型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-30 20:06:53

据我所见,你的AST与你的语法不匹配。

您可以通过在AST类型中有一个特定的空节点来表示语法中的Epsilon来解决这个问题。

或者,你也可以改变你的语法,把Epsilon分解出来。

这里有一个没有Epsilon的等价语法:

代码语言:javascript
复制
S -> a|b|c|()|(T)
T -> S | S T
票数 6
EN

Stack Overflow用户

发布于 2012-11-30 19:45:27

与其手工创建解析器函数,不如使用现有的方法:例如,LALR(1) 八聚氰或基于camlp4的LL(k) 解析器

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

https://stackoverflow.com/questions/13651889

复制
相关文章

相似问题

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