C でレクサーを構築したいのですが、dragon bookに従っています。状態遷移は理解できますが、どのように実装すればよいですか?
もっと良い本はありますか?
文字列が受け入れられるかどうかを判断できるように、多くの状態で文字列を解析する必要があるという事実!
C でレクサーを構築したいのですが、dragon bookに従っています。状態遷移は理解できますが、どのように実装すればよいですか?
もっと良い本はありますか?
文字列が受け入れられるかどうかを判断できるように、多くの状態で文字列を解析する必要があるという事実!
単一の状態変数を使用して単純な状態遷移を実装できます。たとえば、状態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
こんばんは
The Dragon book on compiler design を意味すると仮定すると、コンパイラ ツールに関するこのページを一読することをお勧めします。
ページ自体は非常に小さいですが、字句解析器に関するさまざまな優れたリソースへのリンクがあります。
HTH
乾杯、
ドラゴンブックよりも現代的な扱いを探しているなら: Andrew W. Appel and Maia Ginsburg, Modern Compiler Implementation in C , Cambridge University Press, 2008.
第 2 章は字句解析に焦点を当てています。字句トークン、正規表現、有限オートマトン。非決定性有限オートマトン。字句解析ジェネレーター
目次を見てください
プログラム flex (lex のクローン) は、レクサーを作成します。
レクサー規則を含む入力ファイルを指定すると、それらの規則のレクサーの実装を含む C ファイルが生成されます。
したがって、C でレクサーを作成する方法については、flex の出力を確認できます。つまり、単に flex のレクサーを使用したくない場合は...