レクサーのソースをトークン化する方法がわかりません。今のところ、正規表現を使用して、指定されたルール (識別子、+、- などの記号) で文字列を配列に解析することしか考えられません。
例えば、
begin x:=1;y:=2;
次に、単語、変数 (この場合は x、y)、および各記号 (:,=,;) をトークン化します。
正規表現の使用は、レクサーを実装する一般的な方法です。それらを使用したくない場合は、いずれにせよ、正規表現の一部を自分で実装することになります。
パフォーマンスに関しては、自分で行う方が効率的ですが、必須ではありません。
正規表現を使用することは、トークンを生成する従来の方法です。lex と yacc (または flex と bison) は従来のコンパイラ作成ペアであり、lex はシンボルをトークン化して YACC に渡す以外には何もしません。
http://en.wikipedia.org/wiki/Lex_%28software%29
YACC は、シンボルを処理するスタック ベースのステート マシン (プッシュダウン オートマトン) です。
正規表現処理は、あらゆるレベルの複雑さのシンボルを解析するための方法だと思います。Oak が言及しているように、最終的には独自の (おそらく劣った) 正規表現パーサーを作成することになります。唯一の例外は、それが完全に単純であり、投稿された例でさえ「完全に単純」を超え始めた場合です。
レックス構文で:
:= return ASSIGN_TOKEN_OR_WHATEVER;
begin return BEGIN_TOKEN;
[0-9]+ return NUMBER;
[a-zA-Z][a-zA-Z0-9]* return WORD;
オプションで、トークンとともに文字シーケンスが渡されます。
それ自体がトークンである個々の文字 [例: ";" )変更されずに渡されます。唯一の方法ではありませんが、非常にうまく機能することがわかりました。
ご覧ください: http://www.faqs.org/docs/Linux-HOWTO/Lex-YACC-HOWTO.html