2

我有一个名为 TokenType 的枚举类型,如下所示:

#ifndef TOKENTYPE_H_
#define TOKENTYPE_H_

    class TokenType{
    public:
        enum TType{
            INTEGER,
            IDENTIFIER,
            PRINT,
            READ,
            SIGN_PLUS           ='+',
            SIGN_MINUS          ='-',
            SIGN_DIV            ='/',
            SIGN_MUL            ='*',
            SIGN_LESSTHAN       ='<',
            SIGN_GREATERTHAN    ='>',
            SIGN_EQUALS         ='=',
            SIGN_DOUBLEEQUALS   ='==',
            SIGN_NOTEQUALS      ='=!=',
            SIGN_NOT            ='!',
        };
    };



#endif /* TOKENTYPE_H_ */

当我尝试编译我的类令牌时,我收到一条错误消息

In file included from Token.h:10:0,
                 from Token.cpp:10:
TokenType.h:25:23: warning: multi-character character constant [-Wmultichar]
TokenType.h:26:21: warning: multi-character character constant [-Wmultichar]
Token.cpp: In constructor ‘Token::Token(int, int, TokenType, int)’:
Token.cpp:15:8: error: ‘class Token’ has no member named ‘TokenType’
Token.cpp: In member function ‘void Token::setValue(int*)’:
Token.cpp:20:19: error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]
Token.cpp: In member function ‘void Token::testPrint()’:

Token.cpp:24:89: error: expected primary-expression before ‘&lt;<’ token

类 Token 没有名为 TokenType 的成员可能是这里的罪魁祸首。

Token.h 看起来像这样:

#ifndef TOKEN_H_
#define TOKEN_H_
#include "TokenType.h"


class Token {

    int line;
    int column;
    TokenType tokenType;
    int valueInt; //bei Integern muss Value gespeichert werden
    int infoKey; //der Key aus der Symtableh

public:
    Token(int line, int column, TokenType tokenType, int infoKey);
    void setValue(int* value);
    void testPrint();
    virtual ~Token();
};

#endif /* TOKEN_H_ */

最后 token.cpp 看起来像这样:

#include <iostream>
using namespace std;

#include "Token.h"

Token:: Token(int line, int column, TokenType TType, int infoKey) {
    this->line = line;
    this->column = column;
    this->TokenType = TType;
    this->infoKey = infoKey;
}

void Token::setValue(int* value){
    this->valueInt = value;
}

void Token::testPrint(){
    cout << "Token: Line: " << line << " Column: " << column << " TokenType: " <<TokenType << " Infokey: " <<infoKey;
}

Token::~Token() {
    // TODO Auto-generated destructor stub
}

为什么令牌找不到令牌类型?我只是 C++ 的初学者。请帮我。

提前致谢,

亲切的问候,凯文

4

5 回答 5

2
于 2013-11-13T11:27:40.953 回答
1

在声明中

TokenType tokenType;

在实施中

this->TokenType = TType;

查看符号寄存器。

您的第二行是因为valueInt类型int无法转换为int*.

于 2013-11-13T11:20:43.967 回答
0

除了其他人已经解决的错误之外,这里有一些改进的想法:

#ifndef TOKEN_H_
#define TOKEN_H_

class Token {
public:
    enum TokenType {
        INTEGER,
        IDENTIFIER,
        PRINT,
        READ,
        SIGN_PLUS           ='+',
        SIGN_MINUS          ='-',
        SIGN_DIV            ='/',
        SIGN_MUL            ='*',
        SIGN_LESSTHAN       ='<',
        SIGN_GREATERTHAN    ='>',
        SIGN_EQUALS         ='=',
        // SIGN_DOUBLEEQUALS   ='==',
        // SIGN_NOTEQUALS      ='=!=',
        SIGN_NOT            ='!',
    };
private:
    int const line;
    int const column;
    TokenType const tokenType;
    int valueInt; //bei Integern muss Value gespeichert werden
    int const infoKey; //der Key aus der Symtableh
public:
    Token (int const line, int const column, TokenType const tokenType, int const infoKey) :
        line(line), column(column), tokenType(tokenType), infoKey(infoKey) {}
    void setValue (int const value) { valueInt = value; }
    void testPrint () const;
    virtual ~Token ();
};

#endif /* TOKEN_H_ */
  • enum应该在类中定义Token。你这样做的方式你不能有一个类型的变量TokenType(你可以有一个 type TokenType::TType)。
  • 没有必要TokenType.h。你永远不会使用enum没有Token.h.
  • 将非常简单的方法放入听者中,只要您不需要为此做#include任何事情。在这里,我为构造函数和setValue.
  • const如果可能,请始终使用。

现在这里是Token.cpp文件:

#include <iostream>

#include "Token.h"

using namespace std;

void Token::testPrint() const {
    cout << "Token: Line: " << line << " Column: " << column << " TokenType: " << tokenType << " Infokey: " << infoKey << endl;
}

Token::~Token() {
    // TODO Auto-generated destructor stub
}

int main () {
        Token (1, 1, Token::SIGN_LESSTHAN, 77) . testPrint ();
}
  • 您必须使用Token::SIGN_LESSTHAN,因为enum现在是成员。
  • main仅用于说明。
  • 您不应放入using namespace任何标题或任何#include.
于 2013-11-13T15:38:49.013 回答
0

'=='高度怀疑。C++ 中的字符串文字写成"==". 'c'是单个字符“c”的数值。枚举是名称到数字的映射,而不是名称到字符串。你可能想要namespace TType { const std::string SIGN_DOUBLEEQUALS = "==".

此更改意味着您的所有其他错误消息都会受到影响并且很可能会消失。

根本原因是由于历史原因,'ab'允许但没有明确的含义。这些原因对你来说真的不重要;他们只是在那里保持古老的代码工作。

于 2013-11-13T15:33:36.960 回答
0

是的,有 3 个错误,首先是类中的数据成员带有较低的 't',而您使用的是大写的 'T'。this->TokenType = TType;但在类中它被定义为TokenType tokenType; 第二个是this->valueInt = value; value 是指针但 valueInt 是整数。也许你需要this->valueInt = *value; testPrint 中的第三个错误再次调用,TokenType但在类中使用较低的 't'。

于 2013-11-13T11:29:20.377 回答