我正在尝试在Rascal内实现lambda演算,但无法获得优先级并无法按照我希望的方式进行解析。 目前,我有一个语法类似于:

keyword Keywords= "if" | "then" | "else"  | "end" | "fun";

lexical Ident = [a-zA-Z] !>> [a-zA-Z]+ !>> [a-zA-Z0-9] \ Keywords;
lexical Natural = [0-9]+  !>> [0-9];
lexical LAYOUT = [\t-\n\r\ ];
layout LAYOUTLIST = LAYOUT*  !>> [\t-\n\r\ ];

start syntax Prog = prog: Exp LAYOUTLIST;

syntax Exp =
    var: Ident
    | nat: Natural
    | bracket "(" Exp ")"
    > left app: Exp Exp
    > right func: "fun" Ident "-\>" Exp

当我解析形式的程序时:

(fun x -> fun y -> x) 1 2

生成的树为:

prog(app(
    app(
      func(
        "x",
        func(
          "y",
          var("x")
      nat(1),
    nat(2))))))

我真正在哪里寻找这样的东西(我认为):

prog(app(
    func(
      "x",
      app(
        func(
          "y",
          var("x")),
        nat(2))),
    nat(1)))

我尝试了语法中各种优先顺序的变体,尝试将App规则用括号括起来,还尝试了其他多种变体。 我似乎不明白这里发生了什么。 非常感激任何的帮助。 谢谢。

#1楼 票数:1 已采纳

我用下面的语法,这消除了多余的LAYOUTLIST和死者right ,但这不应该有所作为。 当我使用通用implode功能时,它似乎可以按您的意愿工作:

keyword Keywords= "if" | "then" | "else"  | "end" | "fun";

lexical Ident = [a-zA-Z] !>> [a-zA-Z]+ !>> [a-zA-Z0-9] \ Keywords;
lexical Natural = [0-9]+  !>> [0-9];
lexical LAYOUT = [\t-\n\r\ ];
layout LAYOUTLIST = LAYOUT*  !>> [\t-\n\r\ ];

start syntax Prog = prog: Exp;

syntax Exp =
    var: Ident
    | nat: Natural
    | bracket "(" Exp ")"
    > left app: Exp Exp
    > func: "fun" Ident "-\>" Exp
    ;

然后调用解析器并内插到未类型化的AST(为了便于阅读,我删除了位置注释):

rascal>import ParseTree;
ok
rascal>implode(#node, parse(#start[Prog], "(fun x -\> fun y -\> x) 1 2"))
node: "prog"("app"(
        "app"(
          "func"(
            "x",
            "func"(
              "y",
              "var"("x"))),
          "nat"("1")),
        "nat"("2")))

因此,我想您对于想要的树的形状来说语法正确。 您如何从具体的分析树变成抽象的AST? 也许那里发生了一些有趣的事情。

  ask by josh translate from so

未解决问题?本站智能推荐:

2回复

我的Lambda微积分语法是否明确?

我正在尝试为处理lambda演算的语言编写小型编译器。 这是我发现的语言的模糊定义: 符号^,。,(,)和v是标记。 ^表示lambda,而v表示变量。 形式^ vE是函数定义,其中v是函数的形式参数,E是函数体。 如果f和g是lambda表达式,则lambda表达式fg表示函数
1回复

Lambda演算中的量词

我正在学习lambda演算,但是对于lambda演算中的量词我很困惑。 据我所知,诸如“∃”之类的量词是一阶逻辑(FOL)的概念,lambda演算并不需要。 而且,在我阅读的任何教程中,我都没有找到关于量词的任何信息。 但是,我发现了这篇论文 (基于Lambda依赖的组合语义),在第一
2回复

如何在lambda演算中编码

我在Haskell学习lambda演算,在那期间,我遇到了这个问题。 这些问题的解决方案是这样的: 但我无法理解他们如何得出答案。 就像eq一样,我不明白它们是如何产生的: λab.ab (b (λxy.y) (λxy.x))和nand相同。 如果有人解释它并帮助我理
1回复

解析一系列 lambda 演算项

我正在用 Haskell 编写 lambda 演算解析器,但找不到解决其当前问题的解决方案。 我如何解析表达式: 我如何解析术语: 在输入“x1 x2) x3”时,我的解析器返回 解析应该失败,因为它在语法上不正确,但它仍然解析第一个应用程序。 我认为这是因为do terms <
1回复

C#中的无类型Lambda演算

我一直在尝试在C#上实现原始的lambda演算,但是在实现它时遇到了一些麻烦,因为最终,我总是被要求提供对象。 我希望有一些东西可以让我定义一些基本的逻辑组合器,例如 但是C#似乎是在假设最终会得到一个对象的情况下运行的。 我尝试以各种方式定义它们,例如 依此类推,但要么不遵守语法,要么与
2回复

从一对到 lambda 演算/方案中的列表

我正在学习一些关于 lambda 演算(非常简洁)的知识,并在关于如何完成一对的方案中定义了以下内容: 如何进一步抽象它以创建列表的数据结构,例如,制作类似[1 2 3 4 5]而不仅仅是[2 3] ? 我自己能做的最好的事情就是对这些进行硬编码,例如,五个: 对此有更“通用”的解决方
1回复

Lambda演算/ Haskell中变量的范围

给定类似s的表达式:=(λx,y,zx yz)λx,yxλy,zz是绑定变量的范围 s:=(λx,y,zx yz)(λx,yx)(λy,zz) 要么 s:=(λx,y,zx yz)(λx,yx(λy,zz)) 我猜这是第二个选择。
4回复

是否有可能实现一个在lambda演算上返回n元组的函数?

lambda演算的n元组通常定义为: 我的问题是:是否有可能实现一个接收教会号码N的函数并返回任何N的相应N元组? 此外,是否可以扩展此功能,以便它还返回相应的访问器? 该算法不能使用任何形式的递归,包括定点组合器。 〜 编辑:根据要求,详细说明我尝试过的内容。 我