まず第一に、私は 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 ソフトウェアではありません。