【发布时间】:2014-05-16 00:00:56
【问题描述】:
我有一些托管函数和其他枚举的头文件。
所以在文件 Lexer.h 中,我有一个名为 getNextToken() 的函数,它返回一个令牌,在这个函数中我需要调用一个名为 reservedLookup(string tokenString) 的函数,该函数位于 token.h 中
reservedWords 是另一个名为 reservedWords.h 的头文件,其中包含保留字的枚举声明
这个函数在 token.h 中找到
reservedWords reservedLookup (string tokenString)
{
for(rIt = reservedMap.begin(); rIt!= reservedMap.end(); rIt++)
{
if(tokenString == (rIt->first))
{
return rIt->second;
}
}
}
在 lexer.h 中,我尝试私下(甚至在公共场合:)使用它:
reservedWords reservedLookup(string tokenString);
它可以编译,但是在函数 Token* getNextToken() 我使用时
int tokenType = reservedLookup(strBuffer);
它给了我一个错误说明:
obj\Release\main.o:main.cpp:(.text$_ZN5Lexer12getNextTokenEv[__ZN5Lexer12getNextTokenEv]+0x371)||undefined reference to `Lexer::reservedLookup(std::string)'|
我不希望我的编译器将 reservedLookup 读取为 Lexer::reservedLookup(string str) 的一部分,而是将其读取为 Token::reservedLookup(string str)
有什么办法可以做到吗?
编辑:
令牌.h
class Token
{
.....
.....
public:
void reservedDeclare ()
{
// iterator used for looping through reservedWords
//Taking care of the Reserved Words first
reservedMap["function"] = reservedWords::tkfunction;
//if - then - else - while - halt
reservedMap["if"] = reservedWords::tkif;
reservedMap["else"] = reservedWords::tkelse;
reservedMap["while"] = reservedWords::tkwhile;
reservedMap["halt"] = reservedWords::tkhalt;
//and, or, not, true, else
reservedMap["and"] = reservedWords::tkand;
reservedMap["or"] = reservedWords::tkor;
reservedMap["not"] = reservedWords::tknot;
reservedMap["true"] = reservedWords::tktrue;
reservedMap["false"] = reservedWords::tkfalse;
//sets and read/write
reservedMap["set"] = reservedWords::tkset;
reservedMap["let"] = reservedWords::tklet;
reservedMap["read"] = reservedWords::tkread;
reservedMap["write"] = reservedWords::tkwrite;
//variable type
reservedMap["int"] = reservedWords::tkint;
reservedMap["char"] = reservedWords::tkchar;
reservedMap["bool"] = reservedWords::tkbool;
reservedMap["real"] = reservedWords::tkreal;
reservedMap["string"] = reservedWords::tkstring;
reservedMap["unit"] = reservedWords::tkunit;
}
reservedWords reservedLookup (string tokenString)
{
for(rIt = reservedMap.begin(); rIt!= reservedMap.end(); rIt++)
{
if(tokenString == (rIt->first))
{
return rIt->second;
}
}
}
reservedWords.h
#ifndef RESERVEDWORDS_H_INCLUDED
#define RESERVEDWORDS_H_INCLUDED
#include <string>
#include <vector> //std::vector
#include <algorithm> // std::find
using namespace std;
/**
All the reserved words used by the compiler
*/
/**
This file contains all the keywords or reserved words or reserved Symbols used by the compiler
In the lexer, we will check whether the string we are passing is either a Reserved word
or it is actually and identifier
*/
enum reservedWords
{
tkfunction,
tkif,
tkelse,
tkwhile,
tkhalt,
tkand,
tkor,
tknot,
tktrue,
tkfalse,
tkset,
tklet,
tkread,
tkwrite,
tkint,
tkchar,
tkbool,
tkreal,
tkstring,
tkunit,
tkreservedWord,
tkidentifier
};
#endif // RESERVEDWORDS_H_INCLUDED
Lexer.h 的部分代码
class Lexer
{
private:
string strBuffer ="";//holds the current characters that have been read and waiting to be matched
int tokenType = 0;
reservedWords reservedLookup(string tokenString); // THIS DOES NOT WORK. SEES IT AS Lexer::reservedLookup
....
....
...
...
tokenType = reservedLookup(strBuffer); // GIVES ME ERROR BECAUSE OF ABOVE
【问题讨论】:
-
当您的代码示例在类定义或其他上下文中时,请明确说明。
-
@aschepler 检查编辑,看看它是否有帮助...... LEXER.H 和 TOKEN.H 都在一个类中。 ReservedWords 不,只是枚举
-
在 Lexer.h 的部分代码中,您有“这不起作用”的注释...这是 Lexer 类中的类成员函数声明吗?如果它是不是,为什么它在那里?如果是是,为什么没有返回值?
-
@jeffrey_t_b 抱歉,应该读作
reservedWords reservedlookup (string tokenString),我尝试制作另一个头函数来调用 token.h 中的那个(正如我在其他教程中看到的那样)但它没有帮助。所有其他教程都包含 .cpp -
tokenType = reservedLookup(strBuffer);在函数定义中吗?如果你想让它调用Token::reservedLookup,你想让它使用什么Token对象?