2016-05-21 3 views
0

私は、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はどこに文書化されていますか?アクションで一致したルールを特定する方法として使用するのは安全ですか?私はこれについて行くことができるいくつかのより良い方法はありますか?

答えて

0

yynではありません。はどこに書かれていても(コード生成コメントでさえも)、個人的には使用を推奨しません。 bisonがアクションを実行しようとすると、yynはアクション番号、または好きな場合はアクションがトリガーされたプロダクションの番号です。非端末は複数のプロダクションを持つことができる(通常は行う)ため、非端末に対応する番号ではありません。

-vオプションを使用して状態遷移を印刷すると、その違いがわかります。そのファイルの先頭には、実動リストと非終端リストの両方があります。ここでは簡単な例です:

Grammar 

    0 $accept: prog $end 

    1 prog: expr 
    2  | prog ';' expr 

    3 expr: NUMBER 
    4  | '(' expr ')' 
    5  | expr '+' expr 
    6  | expr '-' expr 
    7  | expr '*' expr 
    8  | expr '/' expr 

(。これは私が省略端末のリストが続いている)ここで

Nonterminals, with rules where they appear 

$accept (11) 
    on left: 0 
prog (12) 
    on left: 1 2, on right: 0 2 
expr (13) 
    on left: 3 4 5 6 7 8, on right: 1 2 4 5 6 7 8 

、次の2つのユーザ定義の端末、progであることがわかりますトークンID 12およびexpr(ID 13)。ユーザー定義の9つのプロダクション(1~8の番号が付けられています)。これらの番号範囲が重複しないことは偶然です。トークンコードが11未満のものは、(番号が付け替えられた)ターミナルシンボルといくつかの内部トークンに使用されています。

非終端トークンIDまたは製造番号の列挙型は生成されません。バイソンパーサーは、そのような列挙型を必要とせず、ユーザプログラムがそれらと何を選択するか、特に生産番号を明確にするものではありません。


私はあなたがこの問題に間違ったやり方をしていると思います。あなたがしようとしていることを正しく理解していれば、Rustで実装される各プロダクション用の特定の関数を作成したいし、Cプロトタイプも必要です。これは、文法そのものから始めることができる簡単なコード生成の問題のようです。

オリジナルのバイソンソースから文法を抽出するために複雑ではないですが、あなたはそうすることの悩みに行きたくない場合は、上記のように、あなたは簡単にすることができた、.outputファイルからリストを使用することができますawkのような単純なテキスト処理ツールをかなりよく解析します。

文書化されていない機能をいくつか使用すると、バイソンのデバッグデータ構造から文法を引き出すこともできます。

関連する問題