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での安定した
バイソンディレクティブ(例えば、 '%LEX。引数としてのみ
int *pint
を有するためには、このようになります-param')はflexに影響しません。彼らはどうでしたか? Flexはbisonファイルの名前を知りません。 – riciとにかく、http://stackoverflow.com/questions/34418381/how-to-reference-lex-or-parse-parameters-in-flex-rules/34420950#34420950が役立つかどうかをご覧ください。そうでなければ、後で何かを書こうとします。 – rici
@rici、私はネイティブの英語話者ではなく、いくつかの書類を誤解しています。私は '%lex-param'が自動的にflexで追加のargsを追加します。 – OstCollector