【问题标题】:Abstract syntax tree implementation on functions函数的抽象语法树实现
【发布时间】:2020-11-12 10:07:43
【问题描述】:

我正在尝试为以下 Haskell 函数绘制抽象树:

f t = t + t
twice f t = f(f(t))
twice f 1

我在网上找到的示例(例如下图)很容易理解,但我想我在函数名称方面迷路了。

我目前拥有的树是:

但这似乎有点不完整,或者我遗漏了什么?

如果有人可以帮助/指出我正确的方向或分享任何好的资源,我将不胜感激。提前致谢。

【问题讨论】:

  • 您想要一个 AST 到底是什么?没有函数的 AST 这样的东西。函数是 Haskell 值(运行时实体)。语法实体是例如声明和表达式。这个片段有两个声明和一个表达式。
  • 我想在 AST 中表示“twice f 1”,我显然没有正确表达这个问题,但我也不知道该怎么做。感谢您的评论。
  • twice f 1的句法分析不包括f的定义。任何成分是否定义都无关紧要; dingo koala wombat 的树具有相同的结构。

标签: haskell abstract-syntax-tree


【解决方案1】:

表达式twice f 1 被解析为一对应用程序:首先将twice 应用于f,然后将结果应用于1

表达式中没有对应于应用程序的标记,因为应用程序只是由并列表示(两个标记彼此相邻)。但是,这并不意味着树中没有节点来表示应用程序。所以,我们从一个代表申请行为的根节点开始:

                  apply

这个节点有两个孩子;正在应用的事物,即另一个应用程序,以及正在应用的事物。

                  apply
                /       \
               /         \
            apply       value
           /     \        |
          /       \       number "1"
         /         \
      value       value
        |           |
     identifier    identifier
      "twice"         "f"

树的结构编码了函数应用的优先级。如果您的表达式是twice (f 1),则树中不会显式存储括号;相反,树本身的结构会发生变化。

                  apply
                /       \
               /         \
            value      apply
              |       /     \
       identifier    /       \
        "twice"     /         \
                 value       value
                   |           |
               identifier    number "1"
                  "f"

【讨论】:

  • 不清楚为什么需要“价值”节点,它们似乎没有编码任何有用的信息。
猜你喜欢
  • 2018-09-17
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多