Bisonは適切にCの文字列リテラルを認識するためには表示されません。
-
22-08-2019 - |
質問
私の問題は、私はフレックスバイソンスキャナパーサを使用してコード化された問題を実行しようとしていますということです。何を私のプログラムを行うことになっていることは、ユーザの入力(私の場合には、データベース・システムのためのクエリは、私が設計しています)、LEXを取り、解析し、その後、対応するアクションを実行しています。実際に何が起こるかは、私のパーサコードが正しく、私はそれを養う文字列リテラルを解釈されていないことです。
ここに私のコードです:
130 insertexpr : "INSERT" expr '(' expr ')'
131
132 {
133 $$ = new QLInsert( $2, $4 );
134 }
135 ;
そして、私の入力は、以下の "クエリ:" プロンプトます:
私はライン130上の私のparser.yyコードから文字通りの「INSERT」の文字列を削除する場合はクエリ:INSERTのABC(5);
入力:1.0から5:構文エラー、予期しない文字列、ファイルや行の終わりまたはINSERTの終わりを期待してか、「;」
さて、プログラムがうまく動作します。実際には、入力データ(すなわち、「ABC」と整数5)を格納した後、それは正しく私に右に戻っています。
まず、私はこれは文字エンコーディングの問題だと思いました。バイソンコードは、私がコンパイルし、同じ端末から実行していると見て問題にはなりません同じエンコーディングを使用してコンパイルして実行する必要があります。
私のシステムの詳細ます:
のUbuntu 8.10(Linuxの2.6.24-16-ジェネリック)
2.5.34
を曲げます
バイソン2.3
GCC 4.2.4
あなたがから任意のより多くの情報やコードが必要な場合は、私に知らせて!
解決
これは、あなたがトークンにあなたの入力をlexのためにFlexを使用する場合、あなたはリテラル文字列としてパーサでリテラル文字列を参照してくださいではなく、彼らのためにトークンを使用してはならない、古典的なエラーです。
詳細については、参照これに類似質問する
他のヒント
Thankee、thankee、thankee!
ただ、明確にするために、ここで私はjpalecekからのコメントに基づいて、私の解決策を実装する方法です。まず、私はバイソンコード(parser.yy)にINSERTトークンを宣言します:
71 %token INSERT
次に、私は、Flexコード(scanner.ll)にそのトークンを定義
79 "INSERT INTO" { return token::INSERT; }
最後に、私は私の文法規則でトークンINSERTを使用しました
132 insertexpr : INSERT expr '(' expr ')'
133
134 {
135 $$ = new QLInsert( $2, $4 );
136 }
137 ;
出来上がり!私の過拡張頭痛がようやく終わりました!
おかげで、jpalecek:。)