我正在尝试用g ++编译代码,但我得到以下错误:
scan.hpp中包含的文件:8,
来自scanner.cc:5:
parser.hpp:14:错误:'扫描仪'没有命名类型
parser.hpp:15:错误:'令牌'没有命名类型
这是我的g ++命令:
g ++ parser.cpp scanner.c.-Wall
这是parser.hpp:
#ifndef PARSER_HPP
#define PARSER_HPP
#include <string>
#include <map>
#include "scanner.hpp"
using std::string;
class Parser
{
// Member Variables
private:
Scanner lex; // Lexical analyzer
Token look; // tracks the current lookahead token
// Member Functions
<some function declarations>
};
#endif
这里是scanner.hk:
#ifndef SCANNER_HPP
#define SCANNER_HPP
#include <iostream>
#include <cctype>
#include <string>
#include <map>
#include "parser.hpp"
using std::string;
using std::map;
enum
{
// reserved words
BOOL, ELSE, IF, TRUE, WHILE, DO, FALSE, INT, VOID,
// punctuation and operators
LPAREN, RPAREN, LBRACK, RBRACK, LBRACE, RBRACE, SEMI, COMMA, PLUS, MINUS, TIMES,
DIV, MOD, AND, OR, NOT, IS, ADDR, EQ, NE, LT, GT, LE, GE,
// symbolic constants
NUM, ID, ENDFILE, ERROR
};
class Token
{
public:
int tag;
int value;
string lexeme;
Token() {tag = 0;}
Token(int t) {tag = t;}
};
class Num : public Token
{
public:
Num(int v) {tag = NUM; value = v;}
};
class Word : public Token
{
public:
Word() {tag = 0; lexeme = "default";}
Word(int t, string l) {tag = t; lexeme = l;}
};
class Scanner
{
private:
int line; // which line the compiler is currently on
int depth; // how deep in the parse tree the compiler is
map<string,Word> words; // list of reserved words and used identifiers
// Member Functions
public:
Scanner();
Token scan();
string printTag(int);
friend class Parser;
};
#endif
有没有人看到这个问题?我觉得我错过了一些非常明显的东西。
答案 0 :(得分:3)
parser.hpp incluser scanner.hk,反之亦然。
所以一个文件先于另一个文件传播。
您可以使用像
这样的转发声明class Scanner;
或重新标记您的标题
答案 1 :(得分:1)
您在Scanner.hpp
中加入了Parser.hpp
,并且Parser.hpp
中还包含Scanner.hpp
。
如果在源文件中包含Scanner.hpp
,那么Parser
类的定义将出现在Scanner
类的定义之前,您将看到错误。< / p>
解决循环依赖关系,你的问题就会消失(标题永远不应该循环依赖于类型)。
答案 2 :(得分:0)
您有循环#include
引用:一个头文件包含另一个,反之亦然。你需要以某种方式打破这个循环。