这个迷你语言的AST

时间:2012-10-10 03:27:58

标签: parsing data-structures compiler-construction abstract-syntax-tree bnf

我无法搞清楚,决定抽象语法树将如何在内存中产生,它是每个语句的树林吗?还是它是一个单根的二叉树?

示例来源:

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。

提前致谢。

1 个答案:

答案 0 :(得分:1)

鉴于程序中和每个“if语句”下可能有多个“语句”,您可以在内存中将语句排列为列表/数组。如果你真的想要使用树,你可以这样做,但是这些树只会正式成为树,因为它们将被退化并且将作为列表看起来和起作用。想一想,除了它们出现和执行的顺序之外,每个语句与其邻居语句几乎没有任何关系。它们不形成递归结构。 P: 10if A < 15:之间没有任何递归关系。

使用树来表示语句似乎没有充分的理由或明显的优势。但是,您可以选择使用树来构建统一的数据结构。

至于表达式,它们很好地适应了树的想法,因为许多运算符是二进制的,它们采用一个或两个输入并产生一个输出,而输出又可以用作其他运算符的输入。这里有一个明确的递归。

我认为将整个程序安排为子列表(用于语句)和树(用于表达式)的列表是切实可行的。但是你可以使用退化树而不是(子)列表。