我正在尝试实现LL解析器。 但我想知道是否有可能为集合表达式获取许多AST。 例: - 对于像(a + b)*(c - d)/(e + f)这样的表达式 使用LL解析器,唯一可能获得的AST是:
[/]
/ \
/ \
[*] [+]
/ \ / \
/ \ / \
[+] [-] [e] [f]
/ \ / \
/ \ / \
[a] [b] [c] [d]
或者是否有其他AST可能?顺便说一下,我怎么知道我的AST是否正确完成? 希望我足够可以理解! :) 如果不是,请不要犹豫,我会尝试用另一种方式解释我的问题,谢谢
答案 0 :(得分:0)
"抽象语法树"没有精确的定义。 (AST)。给定应用程序生成的AST是语法树的抽象,可能包含或排除任何与该应用程序相关的数据。
基本上,AST是您想要从给定输入生成的任何内容。通常,您需要删除多余的细节(在您的示例中,包括括号和来自IDENTIFIER
的{{1}}的派生),但情况并非总是如此:在某些语言中,括号是例如,语义上很重要,需要保留。
如果语法是LL(1),那么每个输入必须至多有一个有效的解析。或者,换句话说,每个有效输入必须只有一个有效的解析。或者更准确地说,每个有效输入必须只有一个"leftmost derivation"。
从任何派生中,您都可以创建一个代表整个语法树的语法树 解析,包括您可能更愿意忽略的无关细节。如果存在唯一的最左侧推导,那么只有可能的语法树。
通常情况下,这意味着给定的AST也是明确的(假设解析器是确定性的并且没有错误),但由于同一语言的两个不同解析器可能具有完全不同的语法树抽象,所以没有方式说所有解析器都会生成相同的AST。