私は、Rustへのバインディングを持つFlex/Bisonで生成されたパーサーでおもちゃの言語を使いたいと思っています。簡単にするために、Bisonに、それぞれの一致するルールに対してRust-defined createCstNode()
関数を単にコールさせて、具体的な構文ツリーを作成させたいとします(さらなる処理のためにRustのASTに変換されます)。関数呼び出しは、一致したルールタイプを引数として含める必要があります。これにより、Rustコードは、ノードのタイプ(式、if文、while文、関数呼び出し、リテラル文字列、数値など)を知ることができます。自動的に生成されたBisonシンボルEnum
生成されたBisonパーサーを見て、一致するルールを表す整数のような変数yyn
があるように見えますが、どこにも書かれていません。私は%defines
オプションは私にparser.tab.h
のトークンの列挙を与えるが、私は列挙されたターミナルと非終端記号の両方が必要であることを知っている。私はまた%token-table
オプションも見ましたが、これは非終端記号も示していますが、どちらかが必要なものではありません。また、rust-bindgenのようなものを使用するのはparser.tab.h
ファイルではなく、parser.tab.c
ファイルに直接入ります。
Bisonが非終端記号を含むyytokentype
列挙型に似た列挙型を生成する方法はありますか?ヘッダーファイルに配置されていますか?あるいは、私が持っているシンボルと一致するCSTノードタイプのために私自身のenumを定義することに固執していますか? yyn
はどこに文書化されていますか?アクションで一致したルールを特定する方法として使用するのは安全ですか?私はこれについて行くことができるいくつかのより良い方法はありますか?