- 的方法我有2類以及它們的頭文件稱爲lexer.cpp和lexer.h,token.cpp和token.h
- 這些需要建立一個編譯器。目前我仍在做詞法分割和閱讀令牌。
- 現在我將讀取的每個字符我從文件加載的方法,例如,當它識別出它是一個整數,它會返回令牌(其在token.cpp令牌)
問題:C++調用從另一個類
在token.cpp我已經擁有了所有可通過我的編譯器讀取的標記枚舉類令牌(編碼將在下面提供)現在
在
- Lexer.cpp我要調用這個類(枚舉類令牌在Token.cpp)。在token.h我只是聲明的類名
- Lexer.h我寫的是Lexer.cpp
要使用的方法的名稱,但他們產生一些錯誤。
錯誤:
代碼:
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
旁白:'的枚舉類的類部分Token'意味着你總是不得不資格成員如'令牌:: tkLetter'。那時候,'tk'前綴是完全多餘的。 – kfsone
你是什麼意思? – DodoSerebro
當你用'enum {Foo};'聲明一個枚舉時,你在當前命名空間中創建一個符號'Foo'。 'enum class Bar {Foo};'在名字空間Bar中聲明'Foo'。要訪問第一個,你只需要寫'Foo'。要訪問後者,您必須始終使用名稱空間來限定它,即「Bar :: Foo」。在你的例子中,枚舉有一個類和一個前綴'Token :: tkLetter'。您應該刪除前綴並且只需調用它們,例如'令牌:: Letter'。 – kfsone