Cでの字句解析器を構築
-
13-09-2019 - |
質問
私はCにレクサーを構築したいと私は、私は、ドラゴンブックを以下のい状態遷移を理解することができますが、それらを実装する方法?
より良い本はありますか?
私は、文字列が受け入れ可能であるかどうかを伝えることができるように、状態の数によって文字列を解析する必要があるという事実!
解決
やあ、
あなたはコンパイラの設計上のドラゴンブックを意味と仮定すると、私はこのページ周りを見たお勧めしますコンパイラツールでます。
ページ自体は非常に小さいですが、字句解析上の種々の優れたリソースに至るまでのリンクがあります。
HTH
歓声、
他のヒント
あなたは、あなたが現在の状態と使用を追跡するために列挙型を使用することができ、エンド>スタート - > part1-> part2-状態を循環する場合は、たとえば、単一の状態変数を持つ単純な状態遷移を、実装することができますあなたは、各状態で実行するコードの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
これを行うには複数の方法があります。すべての正規表現は、単純な構造化されたプログラムに直接対応しています。例えば、数値の表現はこれをすることができます:
// regular expression
digit* [.digit*]
と対応するCコードは次のようになります。
// corresponding code
while(DIGIT(*pc)) pc++;
if (*pc=='.'){
pc++;
while(DIGIT(*pc)) pc++;
}
建築レクサーの遷移表の方法は、私の意見では、不必要に複雑である、と明らかに遅く実行します。
あなたはドラゴンブック(S)よりも、より近代的な治療法を探しているなら:アンドリューW.アペルとマイアギンズバーグ、現代の<のhref = "https://rads.stackoverflow.com/amzn/click/com / 0521607655" のrel = "nofollowをnoreferrer"> C の、ケンブリッジ大学出版、2008年にはコンパイラの実装ます。
第2章は、字句解析に焦点を当てている:字句、正規表現、有限オートマトン。非決定性有限オートマトン。字句解析ジェネレータ
プログラムフレックス(LEXのクローンは)あなたのためのレクサーを作成します。
字句解析ルールを持つ入力ファイルが与えられると、それはそれらの規則のための字句解析の実装でCファイルを生成します。
あなただけのフレックスのレクサー... を使用したくない場合は、あなたはこのように、あるCのレクサーを作成する方法のためにフレックスの出力を確認することができます