2014-04-21 70 views
0
  • 的方法我有2類以及它們的頭文件稱爲lexer.cpp和lexer.h,token.cpp和token.h
  • 這些需要建立一個編譯器。目前我仍在做詞法分割和閱讀令牌。
  • 現在我將讀取的每個字符我從文件加載的方法,例如,當它識別出它是一個整數,它會返回令牌(其在token.cpp令牌)

問題:C++調用從另一個類

在token.cpp我已經擁有了所有可通過我的編譯器讀取的標記枚舉類令牌(編碼將在下面提供)現在

  1. Lexer.cpp我要調用這個類(枚舉類令牌在Token.cpp)。在token.h我只是聲明的類名
  2. Lexer.h我寫的是Lexer.cpp

要使用的方法的名稱,但他們產生一些錯誤。


錯誤: Error


代碼:

Lexer.cpp

Token Lexer::getNextToken(char ch) 
{ 
    return Token::tkDigit; 
} 

lexer.h

#ifndef lexer 
#define lexer 
#include "token.h" 
class Lexer 
{ 
public: 

    char ReadChar(); 
    bool IsDigit (char ch); 
    bool IsAlpha (char ch); 
    bool IsIdentation (char ch); 
    Token getNextToken (char ch); 
}; 

#endif // lexer.h 

Token.h

#ifndef token 
#define token 


enum class Token 
{ 
    tkLetter, 
    tkDigit, 
    tkPrintable, 
    tkType, 

    //Literals 
    tkBooleanLiteral, 
    tkIntegerLiteral, 
    tkRealLiteral, 
    tkCharLiteral, 
    tkStringLiteral, 
    tkUnitLiteral, 
    tkLiteral, 
    tkIndentifier, 

    //Operations 
    tkMultpicativeOp, 
    tkAdditiveOp, 
    tkRelationalOp, 

    //Params and Calls 

    tkActualParams, 
    tkFunctionCall, 

    //cast and factors 
    tkTypeCast, 
    tkSubExpression, 
    tkUnary, 
    tkFactor, 

    //Terms and Declarations 

    tkTerm, 
    tkSimpleExpression, 
    tkExpression, 
    tkAssignment, 
    tkVariableDecl, 
    tkFormalParam, 
    tkFunctionDecl, 

    //Statements 
    tkReadStatement, 
    tkWriteStatement, 
    tkIfStatement, 
    tkWhileStatement, 
    tkHaltStatement, 
    tkStatement, 
    tkBlock, 
    tkSxl, 

}; 


#endif // token 
+0

旁白:'的枚舉類的類部分Token'意味着你總是不得不資格成員如'令牌:: tkLetter'。那時候,'tk'前綴是完全多餘的。 – kfsone

+0

你是什麼意思? – DodoSerebro

+0

當你用'enum {Foo};'聲明一個枚舉時,你在當前命名空間中創建一個符號'Foo'。 'enum class Bar {Foo};'在名字空間Bar中聲明'Foo'。要訪問第一個,你只需要寫'Foo'。要訪問後者,您必須始終使用名稱空間來限定它,即「Bar :: Foo」。在你的例子中,枚舉有一個類和一個前綴'Token :: tkLetter'。您應該刪除前綴並且只需調用它們,例如'令牌:: Letter'。 – kfsone

回答

2

移動定義token.h名稱並在詞法分析器中包含此標題。h

正如我所說的將token.cpp中的枚舉聲明移到token.h中。清楚嗎?

和功能getNextToken看起來應該

Token Lexer::getNextToken(char ch) 
{ 
    return Token::tkDigit; 
} 
+0

我複製了一切,但仍然是相同的結果 – DodoSerebro

+0

@odoSerebro在每個枚舉器之前使用限定名稱,例如Token :: tkLetter –

+0

我在token.h中包含了枚舉的所有定義,並且還將它導入到lexer.h(enum類令牌{};) 但是我在Lexer.cpp中有一個新錯誤,現在它說這種方法令牌Lexer :: getNextToken 錯誤:原型爲'令牌Lexer :: getNextToken(char)'不匹配任何上課'Lexer'| – DodoSerebro

3

Lexer.h您使用的編譯器(定lexer.h依賴)一無所知類型(Token)。

只是包括Token替換的ampty枚舉的具有相同的定義的聲明,隨着從enum class Tokentoken.cpp在頭一個include

#ifndef lexer 
#define lexer 
#include "token.h" 

class Lexer 
+0

解決了它的一部分,但爲什麼返回tkDigit仍然沒有在此範圍內聲明?我的意思是現在包含頭文件 – DodoSerebro

+0

因爲枚舉中的項目是在'.cpp'文件中定義的,它沒有被包含。將定義移動到'token.h'。根據經驗,如果要在另一個類中使用符號,請在.h中定義它。 – SJuan76

+0

我已經複製了所有內容,但結果仍然保持不變 – DodoSerebro