2009-03-30 5 views
1

私の問題は、flex-bison scanner-parserを使ってコード化した問題を実行しようとしていることです。私のプログラムは、ユーザーの入力(私の場合、私が設計しているデータベースシステムのクエリ)、lexと解析を行い、対応するアクションを実行します。実際には、私のパーサー・コードが、私がそれをフィードしている文字列リテラルを正しく解釈していないことが起こります。BisonはCの文字列リテラルを適切に認識していないようです

は、ここに私のコードです:

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)を格納した後、それが正しく戻されて正しく表示されます。

まず、これは文字エンコードの問題だと思っていました。 Bisonコードは、同じエンコーディングを使用してコンパイルして実行する必要があります。これは、同じ端末からコンパイルして実行しているときには問題ではありません。

私のシステムの詳細:

のUbuntu 8.10(Linuxの2.6.24-16-ジェネリック)
2.3
フレックス2.5.34
バイソンのgcc 4.2.4

あなたがこれ以上必要な場合情報やコードは、私に教えてください!

答えて

3

フレックスを使用して入力をトークンに変換する場合、パーサーのリテラル文字列をリテラル文字列として参照するのではなく、トークンを使用する必要があります。詳細について

this similar question

0

Thankee、thankee、thankeeを参照してください!

jpalecekのコメントに基づいて、私のソリューションをどのように実装したかを明確にします。まず、私はバイソンコード(parser.yy)にINSERTトークンを宣言:

71 %token INSERT 

次に、私は、Flexコード(scanner.ll)にそのトークンを定義:最後

79 "INSERT INTO" { return token::INSERT; } 

、I文法ルールでINSERTというトークンを使用しました:

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

そしてvoila!私の過剰に拡張された頭痛はついに終わりました!

ありがとう、jpalecek :)

関連する問題