4

首先,我对 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 括号有问题,我还上传了一个 tarball

词汇表

%{
#包括
#include "dict.hpp"
#include "parse.tab.h"
%}

%%

[0-9]+ yylval.num = atoi(yytext); 返回数字;
[az]+ yylval.id = dict.id(yytext); 返回标识;
[:空间:] ;

解析.y

%{
#包括
#include "dict.hpp"
无效 yyerror (const char* e) {
    看跌期权(e);
}
int yylex ();
%}

%联盟{
    单位标识;
    整数;    
}

%令牌ID;
%token NUM;

%%

S : 编号 S {
        dict.set($1, $2);
    }
|;

字典.hpp

#ifndef _DICT_HPP_
#define _DICT_HPP_
#包括
#包括

typedef std::pair dpair;
typedef 无符号 int uint;

类字典{
    std::vector 选项卡;
上市:
    uint id(char* s);
    无效集(uint i,int v);
    无效打印();
};

外部字典字典;

#endif /* _DICT_HPP_ */

主文件

#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

2 回答 2

6

你可以添加

 extern "C" int yyparse (void);

在您的main.cpp文件中(也可能在 中parser.y)或一些常见的#include-d 头文件中。

你真的应该用它g++ -Wall -g来编译你的代码。

于 2012-10-07T11:42:48.763 回答
0

也许这个问题会有所帮助:yyparse() 编译期间的困难(g++、bison、flex); 我也遇到了 yyparse() 的问题。

于 2012-10-07T11:48:28.073 回答