5

C でレクサーを構築したいのですが、dragon bookに従っています。状態遷移は理解できますが、どのように実装すればよいですか?

もっと良い本はありますか?

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

4

5 に答える 5

7

単一の状態変数を使用して単純な状態遷移を実装できます。たとえば、状態start-> part1-> part2-> endを循環する場合は、列挙型を使用して現在の状態を追跡し、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
于 2009-06-15T11:08:51.080 に答える
4

こんばんは

The Dragon book on compiler design を意味すると仮定すると、コンパイラ ツールに関するこのページを一読することをお勧めします。

ページ自体は非常に小さいですが、字句解析器に関するさまざまな優れたリソースへのリンクがあります。

HTH

乾杯、

于 2009-06-15T11:15:27.740 に答える
1

ドラゴンブックよりも現代的な扱いを探しているなら: Andrew W. Appel and Maia Ginsburg, Modern Compiler Implementation in C , Cambridge University Press, 2008.

第 2 章は字句解析に焦点を当てています。字句トークン、正規表現、有限オートマトン。非決定性有限オートマトン。字句解析ジェネレーター

目次を見てください

于 2009-06-15T11:27:21.267 に答える
0

プログラム flex (lex のクローン) は、レクサーを作成します。

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

したがって、C でレクサーを作成する方法については、flex の出力を確認できます。つまり、単に flex のレクサーを使用したくない場合は...

于 2009-06-15T11:58:32.020 に答える