【发布时间】:2014-04-21 21:01:03
【问题描述】:
- 我有 2 个类及其名为 lexer.cpp 和 lexer.h 的头文件、token.cpp 和 token.h
- 这些是创建编译器所必需的。目前我还在做词位,划分和阅读令牌。
- 现在我有一个方法可以读取我从文件中加载的每个字符,例如当它识别出它是一个整数时,它将返回一个 Token(即 token.cpp 中的 Token)
问题:
在 token.cpp 中,我有一个枚举类 Token,其中包含我的编译器可以读取的所有标记(编码将在下面提供)
现在
- Lexer.cpp 我必须调用这个类(Token.cpp 中的枚举类 Token)。在 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
【问题讨论】:
-
顺便说一句:
enum class Token的类部分意味着您总是必须将成员限定为例如Token::tkLetter。此时,tk前缀完全是多余的。 -
你到底是什么意思?
-
当您使用
enum { Foo };声明一个枚举时,您会在当前命名空间中创建一个符号Foo。enum class Bar { Foo };在命名空间Bar内声明Foo。要访问第一个,您只需写Foo。要访问后者,您必须始终使用命名空间限定它,即Bar::Foo。在您的示例中,枚举既有类又有前缀Token::tkLetter。您应该删除前缀并直接调用它们,例如Token::Letter.
标签: c++ enums token header-files