2009-12-02 65 views
0

我正在为一种小语言编写一个编译器,而我的Parser类目前负责构建一个AST供以后使用。但是,递归表达式无法正常工作,因为每个包含子节点的AST节点中的矢量都无法正常工作。目前我AST的头文件是这样的:什么是导致解析错误的复制构造函数错误?

class AST 
{ 
public: 
    enum ASTtype {nil, fdecl, pdecl, vdecl, rd, wr, set, rdLV, setLV, exprLV, add, sub, mul, fcall, 
     divide, mod, lt, gt, lte, gte, eq, ne, aAnd, aOr, aNot, aNeg, nConst, t, f, vs, dl, loop, 
     cond, ss}; 
    enum scalarType {tNA, tINVALID, tINT, tLONG, tBOOL}; 
    AST(); 
    AST (AST const&); 
    AST (ASTtype); 
    AST (ASTtype, std::string); 
    void addChild(AST); 
    ASTtype getNodeType(); 
    std::string text; 
    ASTtype nodeType; 
    int size; 
    scalarType evalType; 
    std::vector<AST> children; 
}; 

下面是在作祟表达解析代码:

void Parser::e(AST& parent) 
{ 
    AST expr; 
    AST::ASTtype check = AST::nil; 
    bool binOp = false; 

    switch (lookahead.type) 
    { 
     case Lexer::AND : check = AST::aAnd ; binOp = true; break; 
     case Lexer::OR  : check = AST::aOr ; binOp = true; break; 
     case Lexer::NOT : check = AST::aNot ; break; 
     case Lexer::NEG : check = AST::aNeg ; break; 
     case Lexer::PLUS : check = AST::add ; binOp = true; break; 
     case Lexer::MINUS : check = AST::sub ; binOp = true; break; 
     case Lexer::SPLAT : check = AST::mul ; binOp = true; break; 
     case Lexer::FSLASH : check = AST::divide; binOp = true; break; 
     case Lexer::MOD : check = AST::mod ; binOp = true; break; 
     case Lexer::EQ  : check = AST::eq ; binOp = true; break; 
     case Lexer::LT  : check = AST::lt ; binOp = true; break; 
     case Lexer::GT  : check = AST::gt ; binOp = true; break; 
     case Lexer::GTE : check = AST::gte ; binOp = true; break; 
     case Lexer::LTE : check = AST::lte ; binOp = true; break; 
     case Lexer::NE  : check = AST::ne ; binOp = true; break; 
    } 
    if (check != AST::nil && binOp) 
    { 
     match(lookahead.type); 
     expr = AST(check); 
     e(expr); 
     e(expr); 
    } else if (check != AST::nil && !binOp) { 
     match(lookahead.type); 
     expr = AST(check); 
    } else if (lookahead.type == Lexer::IDENT) { 

     if (symbols.resolve(lookahead.text).sym_type == symbol::FUNC) 
     { 
      expr = AST(AST::fcall, lookahead.text); 
      match(Lexer::IDENT); 
      while (lookahead.type != Lexer::BANG) 
      { 
       e(expr); 
      } 
      match(Lexer::BANG); 
     } else { 
      expr = AST(AST::exprLV); 
      lv(expr); 
     } 
    } else if (lookahead.type == Lexer::T) { 
     match(Lexer::T); //true 
     expr = AST(AST::t); 
    } else if (lookahead.type == Lexer::F) { 
     match(Lexer::F); //false 
     expr = AST(AST::f); 
    } else { 
     expr = AST(AST::nConst, lookahead.text); 
     match(Lexer::NUM); 
    } 
    parent.children.push_back(expr); 
} 

一个例子表达不工作是+ 1 + 2 + 3 4。 它应该解析为这样的AST:+ [1,+ [2,+ [3,4]], 但我得到这个:+ [1,+ []]

任何意见,做错了吗?

+0

你能否提供关于这个“复制构造函数bug”的更多细节?你是说如果你有一个'AST'在'children'中有其他'AST',它不能正确复制?为什么你包含'e()'代码而不是复制构造函数,如果复制构造函数有错误? – 2009-12-02 00:50:30

+0

我说复制构造函数为一个猜测。我真的不确定是什么导致了这个问题,我想如果有人看着e()它可能会显示我忽略的一个错误或对C++的基本误解。 – iand675 2009-12-02 02:12:42

回答

0

parent.children.push_back(expr)复制表达式。因此,它叫AST::AST(AST const&)。这个错误肯定会导致你看到的问题。但是,如果没有代码,我们无法找到其中的错误。