1

flex と bison を使用して電卓を開発しています。しかし、プッシュパーサーにしたいときは、次のようになりました。

"flex" lexer.l  
gcc    -c -o lex.yy.o lex.yy.c  
lexer.l: In function 'main':  
lexer.l:29:2: error: unknown type name 'yypstate'  
lexer.l:29:15: warning: initialization makes pointer from integer without a cast [enabled by default]  
lexer.l:35:24: error: 'YYPUSH_MORE' undeclared (first use in this function)  
lexer.l:35:24: note: each undeclared identifier is reported only once for each function it appears in  
make: *** [lex.yy.o] Error 1  

コードはhttps://github.com/dramforever/drcalc (タグu1-push-parse) で入手できます。迷惑だと思うのでここには掲載しません。

PS:大丈夫な英語でごめんなさい。あなたが理解することを願って。

4

1 に答える 1

2

プッシュパーサーを作りたい場合は、指定する必要があります

%define api.pure full
%define api.push-pull push

バイソン(.y)ファイルに。(実際には、2 つ目だけが必要ですが、最初のものを強くお勧めします。bison のマニュアルを参照してください。)

ヘッダー ファイルを要求した場合は、bison によって生成されたヘッダー ファイルにシンボルが配置されるはずです。ヘッダー ファイルを要求するには、以下を含めます。

%defines

-dまたは、フラグを指定して bison を呼び出します。

もちろん、#includeシンボルを参照するすべてのソース ファイルでそのヘッダー ファイルが必要になります。あなたの場合、flex入力ファイル。

また、ヘッダー ファイルがステップに依存すること、およびステップがヘッダー ファイルに依存することをMakefile指定していることを確認してください。そうしないと、ビルドが間違った順序で行われることがあります。bisonbisonflexbison

于 2013-01-24T03:07:19.023 に答える