Прежде всего, я довольно новичок в 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.
Вы могли бы добавить
extern "C" int yyparse (void);
в вашем main.cpp
файл (и, возможно, также в parser.y
) или в некоторых общих #include
-d заголовочный файл.
И вы действительно должны использовать g++ -Wall -g
скомпилировать ваш код.
Может быть, эти вопросы будут полезны: Трудности во время компиляции (g ++, bison, flex) с помощью yyparse ();
У меня также была проблема с yyparse ().