«Сканер» не называет ошибку типа в g ++ - PullRequest
1 голос
/ 25 апреля 2010

Я пытаюсь скомпилировать код в g ++ и получаю следующие ошибки:

В файле из файла scanner.hpp: 8,
from scanner.cpp: 5:
parser.hpp: 14: ошибка: «Сканер» не называет тип
parser.hpp: 15: ошибка: «Token» не называет тип

Вот моя команда g ++:

g ++ parser.cpp scanner.cpp -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.hpp:

#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

кто-нибудь видит проблему? Я чувствую, что упускаю что-то невероятно очевидное.

Ответы [ 3 ]

3 голосов
/ 25 апреля 2010

parser.hpp, включая scanner.hpp и наоборот.

Итак, один файл оценивается раньше другого.

Вы можете использовать предварительную декларацию, например

class Scanner;

или переориентируйте ваши заголовки

1 голос
/ 25 апреля 2010

Вы включаете Scanner.hpp в Parser.hpp, и вы также включаете Parser.hpp в Scanner.hpp.

Если вы включите Scanner.hpp в исходный файл, тогда определение класса Parser появится перед определением класса Scanner, и вы получите сообщение об ошибке.

Устраните циклическую зависимость, и ваша проблема исчезнет (заголовки никогда не должны циклически зависеть друг от друга для типов).

0 голосов
/ 25 апреля 2010

У вас есть круговая ссылка #include: один заголовочный файл содержит другой, и наоборот. Вам нужно как-то разорвать этот цикл.

...