【发布时间】:2012-10-22 09:24:34
【问题描述】:
我已经定义了我的语言的 BNF,但不知道如何从中设计 AST。
例如,从我的 BNF 的前几行:
<program> ::= <import declarations>? <class declaration>?
<import declarations> ::= <import declaration> | <import declarations> <import declaration>
<class declaration> ::= class <identifier> <class body>
<import declaration> ::= import <type name> ';'
如何从我的 AST 中表达这一点?我应该这样设计吗?
typedef vector<ImportDeclaration*> ImportDeclarationList;
class Program {
ImportDeclarationList importDeclarations;
ClassDeclaration classDeclaration;
};
class ImportDeclaration {
TypeName typeName;
};
class ClassDeclaration {
Identifier identifer;
ClassBody classbody;
};
我需要在这些类之间添加一些继承吗?
有没有一些关于如何从 BNF 设计 AST 的书?
【问题讨论】:
-
节点需要包含一个“抽象”语法类别(通常接近许多规则的 LHS)。请参阅 stackoverflow.com/a/1916687/120163 了解 AST 与 CST 的讨论,以及为什么您可能希望节点包含具体的语法类别(例如,规则的 LHS 或叶子的具体名称)。
标签: compiler-construction translation abstract-syntax-tree bnf