4

まず第一に、私は Bison と Flex にかなり慣れていません。これらのツールが C で使用するように設計されていることは知っており、私の問題はすべて C++ で使用することに起因していると感じています。正しい方法で行ったかどうかはわかりません。

コードは私のコンピューターでは正常にコンパイルされますが、大学のサーバーではコンパイルされません。ここに投稿する問題を分離しました。

私の大学では:

$ (g++ --version; bison --version; flex --version)|grep '[0-9]\.'
g++ (デビアン 4.4.5-8) 4.4.5
バイソン (GNU バイソン) 2.4.1
フレックス 2.5.35

家に:

HOME $ (g++ --version; bison --version; flex --version)|grep '[0-9]\.'
g++ (GCC) 4.7.1 20120721 (プレリリース)
バイソン (GNU バイソン) 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 もアップロードしました

lex.l

%{
#含む
#include "dict.hpp"
#include "parse.tab.h"
%}

%%

[0-9]+ yylval.num = atoi(yytext); NUM を返します。
[az]+ yylval.id = dict.id(yytext); ID を返します。
[:スペース:] ;

parse.y

%{
#含む
#include "dict.hpp"
void yyerror (const char* e) {
    puts(e);
}
int yylex ();
%}

%連合{
    単位 ID;
    int 数値;    
}

%トークンID;
%トークン番号;

%%

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

dict.hpp

#ifndef _DICT_HPP_
#定義_DICT_HPP_
#含む
#含む

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

クラス辞書{
    std::vector タブ;
公衆:
    uint id(char* s);
    ボイドセット(uint i、int v);
    ボイド印刷();
};

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();
}

オフトピック: 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() にも問題がありました。

于 2012-10-07T11:48:28.073 に答える