1

我很难弄清楚,决定抽象语法树将如何产生内存,它是每个语句的树森林?还是单根二叉树?

样本来源:

P: 10
if A < 15:
    P: 9

这是 BNF 语法:

<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文档,但它甚至没有提到单词树。

提前致谢。

4

1 回答 1

1

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

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

至于表达式,它们非常适合树的概念,因为许多运算符都是二元的,它们接受一两个输入并产生一个输出,而输出又可以用作其他运算符的输入。这里有一个明确的递归。

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

于 2012-10-10T05:45:40.933 回答