我无法搞清楚,决定抽象语法树将如何在内存中产生,它是每个语句的树林吗?还是它是一个单根的二叉树?
示例来源:
P: 10
if A < 15:
P: 9
这是BNF-Grammar:
<Prog> ::= <Stmts>
<Stmts> ::= <Stmt> | <Stmt> <Stmt>
<Stmt> ::= <IfStmt> NL | <AssignStmt> NL
<AssignStmt> ::= <Id> : <Aexp> | <Indents> <AssignStmt>
<IfStmt> ::= if <Lexp> : NL <Stmts> | <Indents> <IfStmt>
<Aexp> ::= <Id> | <Int> | <Aexp> <AOP> <Aexp>
<Lexp> ::= <Aexp> <LOP> <Aexp>
<LOP> ::= < | > | &
<AOP> ::= + | - | * | /
<Int> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <Int> <Int>
<Id> ::= A | B | C | D | E | F | P
<Indents> ::= SPC | SPC <Indents>
其中SPC
表示空格,NL
表示换行符。是的,它只允许7个标识符。和正整数。
它很容易被激活,但是我搜索了很多,但大多数AST示例只使用了易于掌握的数学表达式。如果您发现我的语法不正确,请说出来。另请注意,语法受Python启发我已经阅读了Lexical Analysis doc但它甚至没有提到单词tree。
提前致谢。
答案 0 :(得分:1)
鉴于程序中和每个“if语句”下可能有多个“语句”,您可以在内存中将语句排列为列表/数组。如果你真的想要使用树,你可以这样做,但是这些树只会正式成为树,因为它们将被退化并且将作为列表看起来和起作用。想一想,除了它们出现和执行的顺序之外,每个语句与其邻居语句几乎没有任何关系。它们不形成递归结构。 P: 10
和if A < 15:
之间没有任何递归关系。
使用树来表示语句似乎没有充分的理由或明显的优势。但是,您可以选择使用树来构建统一的数据结构。
至于表达式,它们很好地适应了树的想法,因为许多运算符是二进制的,它们采用一个或两个输入并产生一个输出,而输出又可以用作其他运算符的输入。这里有一个明确的递归。
我认为将整个程序安排为子列表(用于语句)和树(用于表达式)的列表是切实可行的。但是你可以使用退化树而不是(子)列表。