关于如何编写递归下降解析器,我有两个问题:

第一个是当您拥有一个可以匹配几个不同的非终端之一的非终端时该怎么办?您如何检查哪种方法是正确的?

其次,您如何构建AST?使用YACC,我只需编写一段代码即可对非终结符的每个实例执行,并且它具有引用规则的“值”的特殊变量。您如何在递归下降解析器中执行类似的操作?

最佳答案

  • 您可以按顺序尝试它们,然后在失败时回溯。或者您证明自己的语言是LL(k),并查看前面最多k个符号。
  • 对于规则的每次成功解析,您都将从子规则的结果构造一个对象。

  • 例如。,
    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/

    10-13 09:46