Russ Cox による正規表現マッチングはシンプルかつ高速であり、有限ステート マシンを使用した認識エンジンの構築に関する優れた入門書です。彼は、正規表現から非決定論的有限オートマトン、さらに決定論的有限オートマトンへと移行する方法を示しています。彼の参照実装では、有向グラフ(連結リストに似ていますが、各ノードは複数の「アウト」参照を持つことができ、それ自体を含む他のノードを参照することができます) と連結リストを使用します。ステート マシンをモデル化する方法は他にもあります。
いくつかのレコグナイザーを組み合わせてレクサー/スキャナーを構築します。たとえば、正規表現で定義された次のトークンを持つ代入のみの言語を想像してください。
- 識別子: [a-zA-Z]+
- 割り当て: =
- 番号: [0-9]+
- キーワード: と
入力を左から右にスキャンしながら、現在のシンボルに基づいて各トークンのマシンの遷移を移動します。シンボルに有効な遷移がない場合は、受け入れ状態にある最後のマシンを選択します。その状態までスキャンされたすべてのシンボルは、トークンの一部です。スキャンは、最後に受け入れられたシンボルの後のシンボルから再開されます。新しいトークンの有効な遷移がない場合、入力は無効であり、レクサーはエラーを報告する必要があります。受け入れ状態のマシンが複数ある場合は、優先ルールによって、使用するトークンを決定する必要があります。
注: これらの手順は、可能な限り最長の一致を常に返すレクサーについて説明しています。マシンの 1 つが受け入れ状態になるとすぐにトークンを返すレクサーを設計することもできます。
サンプル入力の結果:
- a=10 : (識別子 a)(割り当て =)(数値 10)
- a = 10 : 無効 - トークン定義では空白は受け入れられません
- 25=xyz : (数 25)(代入)(識別子 xyz)
- 25and42 : (number 25)(keyword and)(number 42) - キーワードが識別子よりも優先されると仮定します
- b=1+2 : 無効 - 「+」はトークン定義では受け入れられません
- andx=8 : (identifier andx)(assignment)(number 8) - 最長一致により、(identifier andx) 対 (keyword and)(identifier x) が得られます。
字句解析は単にトークンを返すことに注意してください。トークンが適切に使用されているかどうかはわかりません。「25=xyz」は意味をなさないかもしれませんが、解析段階まで待たなければなりません。
追加のリソースとして、Dick Grune はParsing Techniques - A Practical Guide の初版をPostscript および Pdf として提供しています。