私はBisonとFlexを使用してリエントラントスキャナ/パーサーのペアを作成していますが、すべてが含まれ宣言されている場所を頭で囲むことはできません。Bison/Flex宣言の混乱...どのように含めるべきですか/どこで宣言しますか?
まず第一に、私はので、私は%parse-param {yyscan_t scanner}
を宣言することによって、バイソンに最初yyscan_t
スキャナタイプを渡した後、バイソンが%lex-param {yyscan_t scanner}
を宣言することによってフレックスにこれを渡すようにする必要がありリエントラントのFlexを使用しています。しかしyyscan_t
はBisonによって宣言されていないので、BisonファイルにFlexで生成されたスキャナヘッダファイル(scanner.flex.hという名前)を含める必要があります。しかし、私のFlexファイルには私のBisonヘッダーが含まれていて、私のBisonヘッダーにはFlexヘッダーが含まれているので、予期せぬ方法でものを混乱させる循環インクルードを手に入れました!
私のBisonファイルに%locations
、そしてFlexファイルに%bison-locations
という位置追跡を追加したいとします。 YYLTYPEポインタをインクルードするためにBisonファイル内の関数をインクルードすることはできませんが、yylexとyylexの宣言を変更する必要があります(yylex AGAINを定義する必要があります。 。しかし今は何ですか?プロローグが挿入された後にデフォルトのYYLTYPE宣言が置かれているようで、yyerrorとmyyylexの宣言でこのデフォルトのYYLTYPEを使用することはできません。
私は、これらの問題に対する多くの回避策があることを認識しています...しかし、どうすればそれを正しく行うことになっていますか?それは完全に私を逃げ、これはちょうど私の頭を混乱のままにします...
私は、私はすでに不透明なことになっているので、それは少しハックのように感じていてもということでした* yyscan_tが無効であることを知っています。 YYLTYPEはどうですか?プロローグとフォワードが構造体全体を宣言した後でなければ宣言されません。 –
なぜ構造体を宣言しているのが少し多いように見えますか?別のオプションは、あなたのバイソンファイルに%の定義を追加することです。これにより、含めることができるヘッダーファイルが生成されます。 – Joe
私の部分の脳のおなら全体...私は定義すると思ったが、フォワードは宣言した。私はヘッダーファイルを生成しますが、Bison生成ヘッダーはインクルードガードを持っていないので、無限インクルード再帰につながるため、Bisonファイルには含めることはできません(しかし、型の再定義に対してガードがあります)。 私はこのような何かが '構造体YYLTYPE ?:、しかしYYLTYPEを宣言転送することができ;' '構造体YYLTYPEのYYLTYPEのtypedefを;' –