【问题标题】:{LL parser} how many AST for a set expression{LL parser} 一个集合表达式有多少个 AST
【发布时间】:2015-08-31 13:22:06
【问题描述】:

我正在尝试实现一个 LL 解析器。 但我想知道是否有可能为一个集合表达式获得许多 AST。 示例: -对于像 (a + b) * (c - d) / (e + f) 这样的表达式 使用 LL 解析器,唯一可能获得的 AST 是:

                              [/]
                             /   \
                            /     \
                         [*]       [+]
                        /   \      / \
                       /     \    /   \
                     [+]     [-] [e]  [f]
                    / \      / \
                   /   \    /   \
                 [a]   [b] [c]  [d]

或者是否有另一个 AST 可能?顺便说一句,我怎么知道我的 AST 是否正确完成? 希望我足够理解! :) 如果我不是,请不要犹豫,我会尝试用另一种方式解释我的问题,谢谢

【问题讨论】:

    标签: parsing abstract-syntax-tree ll


    【解决方案1】:

    “抽象语法树”(AST)没有精确的定义。给定应用程序生成的 AST 是语法树的抽象,并且可能包含或排除任何似乎与该应用程序相关的数据。

    基本上,AST 是您想从给定输入中生成的任何内容。通常,您会想要删除无关的细节(在您的示例中,这将包括括号和 IDENTIFIERexpression 的派生),但情况并非总是如此:在某些语言中,括号在语义上很重要并且需要例如,要保留。

    如果语法是 LL(1),那么每个输入必须最多有一个有效的解析。或者,换一种说法,每个有效输入都必须有一个有效的解析。或者更准确地说,每个有效输入必须恰好有一个"leftmost derivation"

    您可以从任何派生中创建一个语法树,它代表整个 解析,包括您可能更愿意忽略的无关细节。如果存在唯一的最左推导,则只有可能的语法树。

    通常,这意味着给定的 AST 也是确定的(假设解析器是确定性的并且没有错误),但是由于同一语言的两个不同解析器可能具有完全不同的语法树抽象,因此没有可以说所有解析器都会产生相同的 AST。

    【讨论】:

    • 如果 AST 没有准确的定义。所以我想没有精确的方法来浏览 AST ?鉴于现在有精确的方式来浏览和构建 AST。我应该根据它的构建方式浏览 AST 吗?或者我应该根据我的浏览方式创建一个 AST 吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多