{LL解析器}一组表达式的AST数

时间:2015-08-31 13:22:06

标签: parsing abstract-syntax-tree ll

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

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

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

1 个答案:

答案 0 :(得分:0)

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

基本上,AST是您想要从给定输入生成的任何内容。通常,您需要删除多余的细节(在您的示例中,包括括号和来自IDENTIFIER的{​​{1}}的派生),但情况并非总是如此:在某些语言中,括号是例如,语义上很重要,需要保留。

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

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

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