首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用menhir解析表达式列表?

如何使用menhir解析表达式列表?
EN

Stack Overflow用户
提问于 2017-11-21 10:27:48
回答 1查看 1K关注 0票数 1

以下是我目前的雷克萨斯解析器,用于Andrew的Tiger语言(ocaml)。

我目前正在尝试支持相互递归函数,但下面的解析器代码无法工作:

代码语言:javascript
复制
decs :
    | l = list(dec) { l }

dec :
    | t = nonempty_list(loc(tydec)) { S.TypeDec t }
    | v = loc(vardec) { S.VarDec v }
    | f = nonempty_list(loc(fundec)) { S.FunDec f }

%inline fundec :
    | Function fun_name = symbol LPar params = tyfields RPar
        Eq body = loc(exp) {
        S.{ fun_name; args = params; return_type = None; body }
    }
    | Function fun_name = symbol LPar params = tyfields RPar
        Colon result_type = symbol Eq body = loc(exp) {
        S.{ fun_name; args = params; return_type = Some result_type; body }
    }

举个小例子:

代码语言:javascript
复制
let
    function f1(x : int) : int =
        f2(x)

    function f2(x : int) : int =
        f1(x)

in
    f1 (0)
end

我得到两个FunDec标记,其中一个是单例列表,而不是一个由两个元素组成的列表的单个FunDec令牌。

如何使用menhir解析fundec列表?

PS:我知道我可以第二次合并这些列表,但是如果可能的话,我希望解析器能帮我完成。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-21 13:35:40

由于没有一组函数的标记,所以必须自己声明列表,并使用几个构造函数:

代码语言:javascript
复制
decs :
    | hd=nonempty_list(fundec) tl=decs_no_function { (S.Fundecs hd)::tl }
    | l=decs_no_function { l }

decs_no_functions :
    | hd=dec tl=decs { hd::tl } (* dec same as yours, without functions *)
    | { [] }

这里,decs_no_functions对应于“不以函数开头的任何声明列表”。注意,单个函数声明将位于单个元素列表中。

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

https://stackoverflow.com/questions/47410781

复制
相关文章

相似问题

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