【问题标题】:AST for this Mini-Language这个迷你语言的 AST
【发布时间】:2012-10-10 03:27:58
【问题描述】:

我在决定抽象语法树如何在内存中产生问题时遇到了麻烦,它是每个语句的树森林?还是单根二叉树?

示例来源:

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回复,例如在哪些语言中使用树形结构是一个好主意?,究竟什么会被视为语句之间的关系?
    • 不,我对您的回答进行了更深入的思考,而且很清楚。谢谢。
    • 显然,树适用于数学表达式和使用它们或类似表达式的函数式语言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2011-06-05
    • 2016-02-12
    • 2016-01-24
    • 2012-09-02
    • 2011-08-23
    相关资源
    最近更新 更多