質問

私の問題は、私はフレックスバイソンスキャナパーサを使用してコード化された問題を実行しようとしていますということです。何を私のプログラムを行うことになっていることは、ユーザの入力(私の場合には、データベース・システムのためのクエリは、私が設計しています)、LEXを取り、解析し、その後、対応するアクションを実行しています。実際に何が起こるかは、私のパーサコードが正しく、私はそれを養う文字列リテラルを解釈されていないことです。

ここに私のコードです:

130 insertexpr :  "INSERT" expr '(' expr ')'
131 
132                  {
133                         $$ = new QLInsert( $2, $4 );
134                          }
135                         ;

そして、私の入力は、以下の "クエリ:" プロンプトます:

  

クエリ:INSERTのABC(5);
  入力:1.0から5:構文エラー、予期しない文字列、ファイルや行の終わりまたはINSERTの終わりを期待してか、「;」

私はライン130上の私のparser.yyコードから文字通りの「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:。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top