2011-07-09 11 views
5

これは、解答がパーサーを使用していなかったので、this questionの重複ではありません!Yacc/BisonパーサーとC++プログラムとのインターフェイス

私は./parser < file_to_parseを実行して実行できるBisonパーサを持っています。私は私のC++プログラムの中からBisonパーサを呼びたいと思っています。私が望まないのはsystem(./parser < file_to_parse)です。これは、パーサがプリコンパイルされていると仮定し、私の全プログラムがプラットフォームに依存しないと仮定するためです。私が機能している場合

は:

void foo(file_name) { 
    // call parser on file_name 
} 

を、その後どのようにこれを行うことができますか?何か案は?私はそれがyyparseか何かを呼び出す場合だと思うが、私はそれと一緒にどこにもいない!

ありがとうございました。

答えて

1

これはあなたがしていることです。つまり、yyparse()を呼び出します。メインプログラムが入力を指定できるようにyylex()を記述します。おそらくあなたの現在のyylex()はgetchar()や文字を読み込む何かを呼び出すでしょう。代わりに、あなたのメインプログラムで指定された場所からの入力を取るために、おそらくそれを書く必要があります。

+0

ありがとう、アーネスト..まだ苦労しています。私は実際にレキシャにyylex()を持っていません - Flexはおそらくgetchar()を行うデフォルトのものを作成します。私はレクサーなどで自分自身を書く必要があると思う。 – ale

2

C++に適合したバージョンを使用していますか?

私はAlain Coetmeurのものを使用します。

現時点では、フレックス++を使用するのに便利なコードしかありませんが、これがどのようになっているかを示す必要があります。

フレックス++を実行すると、ヘッダーファイルと新しいクラスの実装ファイルが出力され、解析が行われます。

// Construct new instance of parser 
::lex * plex = new lex(); 

// tell parser what file to parse 
plex->yyin = _wfopen(L"C:/Documents and Settings/All Users/Application Data/QuietWake/eCrew/new_rules_to_be_parsed.txt",L"r"); 

// run the parser 
int lex_return = plex->yylex(); 
+0

ありがとうございます。私は実際に古いFlex/Bisonを使用しています。私は昨日C++があることを知っていました!..あなたが使っているものを使うのは間違いなく良いでしょう。私は私のツールを使ってそれを解決しようとしています。もし失敗すれば、これらのC++のものを見ていきます。 +1ありがとうございます。 – ale

+0

変更を今お勧めします。新しいパーサーは古いものと互換性があるため、スクリプト作成への投資を失うことはありません。人生はずっと楽になるでしょう。 – ravenspoint

+0

私はちょうどそれをするつもりだからこだわっている:)。それが機能すれば解決策としてマークします。ありがとうございました。 – ale

1

これはCコードですが、C++の場合も同様です。

 
#define YY_DECL int alpha_yylex(yylval_) void *yylval_; 

int alpha_yylex(yylval_)は関数であり、void *yylvalは、パラメータの型です:私たちは、このような.lファイルにYY_DECLを定義しなければならなかった大学でコンパイラをしなければならなかった

明らかに、これはパーサーがどこから始めるべきかを知るためには必要です。

また、この関数プロトタイプ(extern int alpha_yylex(void *yylval_);)を.yファイルにexternする必要があります。
その後、Flex/Bisonユーティリティは関連する.cファイルを自動生成します。

一般に、.lは字句規則用であり、.yは文法規則用です。したがって、あなたはどこから値を取得する必要がある場合は、この(例)のように.y組合を定義する必要があります:あなたの構文とルールに応じて、あなたは.l fileyylval.value.String = strdup(yytext)を行うことができ、その後

%union { 

    union { 
     int Integer; 
     double Double; 
     char Character; 
     char* String; 
    } value; 

} 

あなたの文法上の規則に応じて、.yファイルの$$.Double = $1.Double + $3.Double

私がそれをやったが、私はあなたが試すことができますし、マニュアルを参照するか、ここで尋ねる:)ことができますねというしばらくしているので、私は多くのことを覚えていない

PS:(私が持っていました良い質問どこか覚えていないが、それはどこですか?>私がそれを見つけるのに十分な場合は、後で投稿するでしょうxD:D xD)

関連する問題