2009-03-24 8 views
0

自分のプログラムでlexを使っていて、何か助けが必要な問題に遭遇しました。lexでコマンドが落ちる

私のプログラムは、[何かの形でその入力を受け付ける「[何かこれが正しく動作している。何か]。

しかし、私はまた、フォーム何か]を受け入れる必要があります」。

すべての入力が(前処理のように)実行されている同じような修正された入力をプログラムの残りの部分で継続するような、ある種の最初のケースをlexで持つことができる方法はありますか?

ここで私が話しているかのようなものだ:

%% 
.* { 
    do preprocessing 
    } 

something{ 
    return SOMETHING; 
    } 

\" { 
    return QUOTE; 
    } 
%% 

答えて

1

さて、あなたは実際のlexでプリプロセッサを書いて、あなたのビルドシステムにそれを置くが、thatsのおそらくやりすぎでした!

開始条件を使用して開始条件をBEGINで切り替え、入力を最初に解析し、次にunputを使用して文字をストリームにプッシュし、別の開始条件で結果を解析できます(the Flex manualを参照)。

最近、私はちょうどそれをしたpythonのような設定言語用のパーサーを書いています。パーサーには2つのモード(開始条件)があり、1つはラインの始めにタブを数えてスコープを決定し、もう1つは実際の解析を行います。

これらのメソッドは問題ありませんが、通常、入力スキームが非常に複雑でない場合は、通常、より良い方法があります。

あなたのプログラムの[何か]と[何か]の間には文法的に違いがありますか?空白を食べるルールがそのトリックですか?

あなたの言語と文法をもう少し詳しく説明できますか?コメントの後

オクラホマので、基本的には2つのトークン、SOMETHINGとQUOTEを持っています。あなたの何かのために

%% 
\"  { 
     //this will match a single quote 
     return QUOTE; 
     } 

[^" \t\n\r]+ { 
       //this will match a run of anything thats not a quote, space, tab or line ending 
       return SOMETHING; 
       } 

[ \t\n\r]  { 
       //do nothing: i.e. ignore whitespace 
       } 

%% 

あなたはまた、文字または0以上の文字、アンダースコアと数字が続くアンダースコアに一致します[A-Za-z_][A-Za-z0-9_]*のようなものが一致する可能性がトークン:あなたのトークンは空白で区切られている場合は、次を行うことができます。

これは役に立ちますか?

+0

基本的には、単語と引用符が1つの巨大トークンではなく、別々のトークンとして認識されるように、空白を追加する必要があります。 – samoz

関連する問題