首先,我对Bison和Flex很新。我知道这些工具是为C语言设计的,我觉得我的所有问题都来自于在C ++中使用它们。我不确定我是以正确的方式做到的。
代码在我的计算机上编译正常,但不在我的大学服务器上。我已将此问题隔离在此处。
在我的大学:
$ (g++ --version; bison --version; flex --version)|grep '[0-9]\.' g++ (Debian 4.4.5-8) 4.4.5 bison (GNU Bison) 2.4.1 flex 2.5.35
在家:
HOME $ (g++ --version; bison --version; flex --version)|grep '[0-9]\.' g++ (GCC) 4.7.1 20120721 (prerelease) bison (GNU Bison) 2.6.2 flex 2.5.37
我使用以下命令编译:
bison -d parse.y && flex lex.l && g++ main.cpp lex.yy.c parse.tab.c -lfl
正如我已经说过的,它在我的计算机上编译得很好(没有警告),但我在服务器上得到了这个:
main.cpp: In function 'int main()': main.cpp:28: error: 'yyparse' was not declared in this scope
由于SO在方括号方面存在问题,I've also uploaded a tarball。
lex.l
%{ #include #include "dict.hpp" #include "parse.tab.h" %} %% [0-9]+ yylval.num = atoi(yytext); return NUM; [a-z]+ yylval.id = dict.id(yytext); return ID; [:space:] ;
parse.y
%{ #include #include "dict.hpp" void yyerror (const char* e) { puts(e); } int yylex (); %} %union{ uint id; int num; } %token ID; %token NUM; %% S : ID NUM S { dict.set($1, $2); } |;
dict.hpp
#ifndef _DICT_HPP_ #define _DICT_HPP_ #include #include typedef std::pair dpair; typedef unsigned int uint; class Dict { std::vector tab; public: uint id(char* s); void set(uint i, int v); void print(); }; extern 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();
}
OFFTOPIC:flex is not a GNU software。
答案 0 :(得分:5)
你可以添加
extern "C" int yyparse (void);
在您的main.cpp
文件中(也可能在parser.y
中)或一些常见的#include
- d标头文件中。
你真的应该使用g++ -Wall -g
来编译你的代码。
答案 1 :(得分:0)
也许这些问题会有所帮助:Difficulties during the compilation (g++, bison, flex) with yyparse(); 我也遇到了yyparse()的问题。