2009-06-15 9 views
3

Cでレクサーを作成したいと思いますが、dragon bookに従っています。私は状態遷移を理解できますが、それらを実装する方法は?Cでレクサーを構築する

良い本がありますか?

文字列が受け入れ可能かどうかを判断できるように、文字列をいくつかの状態で解析する必要があるという事実!

+0

ます。http://en.wikipedia。 org/wiki/Dragon_book? –

+0

あなたは私たちにもう少し先に行く必要があります。状態遷移の実装のどの側面が難しいと感じていますか? –

+1

LEXを使ってみませんか? – qrdl

答えて

3

やあ、

あなたはコンパイラのドラゴンブックを意味すると仮定すると、デザイン、私は周りのコンパイルツールthis pageを見てお勧めしたいと思います。

ページ自体は非常に小さいですが、レキシカルアナライザーのさまざまな優れたリソースへのリンクがあります。

HTH

歓声、

6

単一の状態変数を使用して簡単な状態遷移を実装できます。たとえば、状態start-> part1-> part2-> endを循環させたい場合、enumを使用して現在の状態を追跡し、各ステートで実行するコードにswitchステートメントを使用します。いくつかの変数に依存して、より複雑な状態遷移については

enum state { start=1, part1, part2, end} mystate; 

// ... 
mystate = start; 
do { 
    switch (mystate) { 
    case start: 
     // ... 
    case part1: 
     // ... 
    case part2: 
     // ... 
     if (part2_end_condition) mystate = end; // state++ will also work 
     // Note you could also set the state back to part1 on some condition here 
     // which creates a loop 
     break; 
    } 
} while (mystate != end); 

、あなたはこのようなテーブル/配列を使用する必要があります。

var1 var2 var_end next_state 
0  0  0   state1 
0  1  0   state2 
1  0  0   state3 
1  1  0   state4 
-1  -1  1   state_end // -1 represents "doesn't matter" here 
+0

は、状態変数とミステアート変数ですか? –

+0

申し訳ありませんが、それはタイプミスでした。 stateは列挙型の名前、mystateはここで使用される唯一の変数です。 – schnaader

1

あなたはドラゴン・ブック(S)よりも、より近代的な治療法を探しているなら:アンドリューW.アペルとマイアギンズバーグ、現代Compiler Implementation in C、ケンブリッジ大学出版、2008。

第2章では、字句解析に焦点を当てています。字句トークン、正規表現、有限オートマトン。非決定論的有限オートマトン; Table of Contents

3

で字句解析ジェネレータ

ルックそれを行うには複数の方法があります。すべての正規表現は単純な構造化プログラムに直接対応しています。例えば、数値の表現は、この可能性:

// regular expression 
digit* [.digit*] 

を、対応するCのコードは次のようになります。

// corresponding code 
while(DIGIT(*pc)) pc++; 
if (*pc=='.'){ 
    pc++; 
    while(DIGIT(*pc)) pc++; 
} 

建物レクサーの遷移表の途中で、私の意見では、不必要に複雑、明らかに遅くなります。

+0

* pcを使用してからpc [0]を次に* pcを使用する特別な理由は何ですか? –

+0

@ジョン。一定。私はそれが、スタンドアローンのケースを除外したかったケースからの偶然の残されたものだと思う。先を見て言い換えれば、私は本当にif(DIGIT(pc [0])||(pc [0] == '。' && DIGIT(pc [1])))のすべてを包むべきです。 –

0

プログラムflex(lexのクローン)があなたのためのレクサーを作成します。

レクサールールを持つ入力ファイルを指定すると、それらのルール用のレクサーの実装を含むCファイルが生成されます。

あなたは、このようにあなただけのフレックスのレクサーを使用しない場合は、あるCのレクサーを作成する方法のためのフレックスの出力を確認することができます...

+0

また、Bisonには免責事項がありますBisonが生成したコードは、非GPLコードでも使用できると言われています。 –

+0

が更新されました(GPLについてのコメントを削除しました、私の悪い、ごめんなさい)。人々を愚か者と呼んではいけません。それは少し怒っていたが、最初は初めてだった。 Bisonは生成されたコードに問題がありました。彼らが免責事項を追加したことをうれしく思います。 –

関連する問題