关于如何编写递归下降解析器,我有两个问题:
第一个是当您拥有一个可以匹配几个不同的非终端之一的非终端时该怎么办?您如何检查哪种方法是正确的?
其次,您如何构建AST?使用YACC,我只需编写一段代码即可对非终结符的每个实例执行,并且它具有引用规则的“值”的特殊变量。您如何在递归下降解析器中执行类似的操作?
最佳答案
例如。,
class ASTNode {
public:
virtual int eval() = 0;
virtual ~ASTNode() = 0;
};
// construct this when parsing an integer literal
class Value : ASTNode {
int v;
public:
Value(int v_) : v(v_) {}
virtual int eval() { return v; }
virtual ~Value() {}
};
// construct this when parsing "x+y"
class Addition : ASTNode {
ASTNode *left, *right;
public:
Addition(ASTNode *l, ASTNode *r) : left(l), right(r) {}
virtual int eval() { return l->eval() + r->eval(); }
virtual ~Addition() { delete left; delete right; }
};
关于c++ - 递归下降解析器问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5436819/