2016-09-25 8 views
2

flexとbisonを使ってリエントラントパーサを作成しようとしています。 いくつかの状態を保存するためにパラメータを追加したいのですが、それをyylex()に追加できませんでした。yylex(bison/flex内)に引数を追加する方法は?

ここに示した例は、コンパイルする予定はなく、生成されたコードを示しています。私たちは、int yylex (YYSTYPE * yylval_param , yyscan_t yyscanner) {...}のでpintがなくなっていると見ることができます

bison -d -b foo foo.y 
flex foo.l 
gcc -E lex.yy.c | less 

:と

foo.l

%option reentrant 
%option bison-bridge 
%option header-file="foo.tab.h" 
%{ 
#include "foo.tab.h" 
%} 
%% 
"{" { return "{"; } 
")" { return '}'; } 
%% 

foo.y

%define api.pure full 
%define parse.error verbose 
%parse-param {void *scanner} 
%parse-param {int *pint} 
%lex-param {void *scanner} 
%lex-param {int *pint} 
%token '(' ')' 
%% 
foo : '(' | ')' ; 
%% 

実行。しかし、私はfoo.yで指定したと思います。だから、yylexがパイントを受け入れるためにもっと必要なことは何ですか?

環境:Gentoo Linuxをバイソン-3.0.4とFlex 2.5.39での安定した

+0

バイソンディレクティブ(例えば、 '%LEX。引数としてのみint *pintを有するためには、このようになります-param')はflexに影響しません。彼らはどうでしたか? Flexはbisonファイルの名前を知りません。 – rici

+0

とにかく、http://stackoverflow.com/questions/34418381/how-to-reference-lex-or-parse-parameters-in-flex-rules/34420950#34420950が役立つかどうかをご覧ください。そうでなければ、後で何かを書こうとします。 – rici

+0

@rici、私はネイティブの英語話者ではなく、いくつかの書類を誤解しています。私は '%lex-param'が自動的にflexで追加のargsを追加します。 – OstCollector

答えて

5

%lex-param余分なパラメータを持つにyylexを呼び出すためにバイソンのために言いますが、フレックスには何も言いません。

yylex()関数のデフォルト定義は、foo.lファイルの定義部分にYY_DECLマクロを定義することによって変更できます。 yylval_paramyyscannerも、その後、必要な場合

#define YY_DECL int yylex(int *pint)

#define YY_DECL int yylex(YYSTYPE * yylval_param, yyscan_t yyscanner, int *pint)

+0

この回答は技術的に間違っています。あなたの '* .l'ファイルに' YY_DECL'を定義しても効果はありません。重要なのは、 '* .lex.h'ヘッダをインクルードする前にプログラム内に' YY_DECL'を定義するファイルをインクルードすることです。 – wvxvw

関連する問題