我得到了一个名为lexer.h的头文件,它预定义了一个名为Token的类。但是,我不理解构造函数。如果给出lexer.h,我将如何创建TokenType = T_ID的令牌实例,lexeme =“this”,lnum = 2?谢谢!
#ifndef LEXER_H_
#define LEXER_H_
#include <string>
#include <iostream>
using std::string;
using std::istream;
using std::ostream;
enum TokenType {
// keywords
T_INT,
T_STRING,
T_SET,
T_PRINT,
T_PRINTLN,
// an identifier
T_ID,
// an integer and string constant
T_ICONST,
T_SCONST,
// the operators, parens and semicolon
T_PLUS,
T_MINUS,
T_STAR,
T_SLASH,
T_LPAREN,
T_RPAREN,
T_SC,
// any error returns this token
T_ERROR,
// when completed (EOF), return this token
T_DONE
};
class Token {
TokenType tt;
string lexeme;
int lnum;
public:
Token(TokenType tt = T_ERROR, string lexeme = "") : tt(tt), lexeme(lexeme) {
extern int lineNumber;
lnum = lineNumber;
}
bool operator==(const TokenType tt) const { return this->tt == tt; }
bool operator!=(const TokenType tt) const { return this->tt != tt; }
TokenType GetTokenType() const { return tt; }
string GetLexeme() const { return lexeme; }
int GetLinenum() const { return lnum; }
};
extern ostream& operator<<(ostream& out, const Token& tok);
extern Token getToken(istream* br);
#endif /* LEXER_H_ */
答案 0 :(得分:1)
由于构造函数中的默认参数,可以通过三种方式创建token类型的对象。
Token A(T_ID, "this");
Token B(T_STRING);
Token C;
后两个将具有de构造函数中定义的成员变量。
答案 1 :(得分:0)
该类有点时髦,因为它从外部变量初始化lnum
。它真的应该来自构造函数的参数。但是既然如此,你就无法控制它,除了设置lineNumber
的值,这可能不是预期的;它的值可能来自处理输入的任何地方,并在每个新行增加。
因此,要创建该类型的对象,只需执行此操作:
Token t(T_ID, "this");