yyparse () не объявлен в проекте Bison / Flex C ++ только для некоторых версий gcc / bison / flex

Прежде всего, я довольно новичок в Bison и Flex. Я знаю, что эти инструменты были разработаны для использования в C, и я чувствую, что все мои проблемы связаны с их использованием в C ++. Я не уверен, что сделал все правильно.

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

В моем университете:

$ (g ++ --version; bison --version; flex --version) | grep '[0-9] \.'
g ++ (Debian 4.4.5-8) 4.4.5
бизон (GNU Bison) 2.4.1
гибкий 2.5.35

Дома:

HOME $ (g ++ --version; bison --version; flex --version) | grep '[0-9] \.'
g ++ (GCC) 4.7.1 20120721 (предварительный выпуск)
бизон (GNU Bison) 2.6.2
гибкий 2.5.37

Я использую следующую команду для компиляции:
bison -d parse.y && flex lex.l && g++ main.cpp lex.yy.c parse.tab.c -lfl

Как я уже сказал, он прекрасно компилируется (без предупреждений) на моем компьютере, но я получаю это на сервере:

main.cpp: в функции 'int main ()':
main.cpp: 28: ошибка: yyparse не был объявлен в этой области

Так как SO имеет некоторые проблемы с скобками, Я также загрузил архив.

lex.l

% {
#включают
#include "dict.hpp" #include "parse.tab.h"%}

%%

[0-9] + yylval.num = atoi (yytext); вернуть NUM;
[a-z] + yylval.id = dict.id (yytext); вернуть идентификатор;
[:пространство:]   ;

parse.y

% {
#включают
#include "dict.hpp" void yyerror (const char * e) {
ставит (е);
}
int yylex ();
%}

% Объединение {
Uint ID;
int num;
}

% токен ID;
% токен NUM;

%%

S: ID NUM S {
dict.set ($ 1, $ 2);
}
|;

dict.hpp

#ifndef _DICT_HPP_
#define _DICT_HPP_
#включают
#включают

typedef std :: pair dpair;
typedef unsigned int uint;

class Dict {
std :: vector tab;
общественности:
идентификатор uint (char * s);
void set (uint i, int v);
void print ();
};

внешний Dict dict;

#endif / * _DICT_HPP_ * /

main.cpp

#include <vector>
#include <string>
#include <cstdio>
#include "dict.hpp"#include "parse.tab.h"
Dict dict;

uint Dict::id (char* s) {
for(uint i = 0; i < tab.size(); i++)
if(tab[i].first == s)
return i;
tab.push_back(dpair(std::string(s), tab.size()));
return tab.size()-1;
}

void Dict::set (uint i, int v) {
tab[i].second = v;
}

void Dict::print () {
for(uint i = 0; i < tab.size(); i++)
printf("%20s = %d\n", tab[i].first.c_str(), tab[i].second);
}

int main ()
{
yyparse();
dict.print();
}

НЕ ПО ТЕМЕ: flex не является программным обеспечением GNU.

4

Решение

Вы могли бы добавить

 extern "C" int yyparse (void);

в вашем main.cpp файл (и, возможно, также в parser.y) или в некоторых общих #include-d заголовочный файл.

И вы действительно должны использовать g++ -Wall -g скомпилировать ваш код.

5

Другие решения

Может быть, эти вопросы будут полезны: Трудности во время компиляции (g ++, bison, flex) с помощью yyparse ();
У меня также была проблема с yyparse ().

0

По вопросам рекламы [email protected]