15623
1011
私は現在、XMLフレーバーの基本的なパーサーを書いています。演習として、LLテーブル駆動型パーサーを実装しています。
これは私のBNF文法の例です。
%トークン名データ文字列
%% / * LL(1)* /
doc:elem
elem: "<" open_tag
open_tag:名前attr close_tag
close_tag: ">" elem_or_data ""
| 「/>」
;
elem_or_data: "<" open_tag elem_or_data
|データelem_or_data
| / *イプシロン* /
;
attr:name ":" string attr
| / *イプシロン* /
;
この文法は正しいですか?
各端末リテラルは引用符で囲まれています。抽象端末は%tokenで指定されます。
入力をトークンリストに変換するために、手書きのレクサーをコーディングしています。抽象端末をトークン化するにはどうすればよいですか? 
古典的なアプローチは、可能な端末ごとに正規表現(または他の認識機能)を作成することです。
完全に具体的な「抽象」端末と呼ばれるものは、実際には、関連するパターンが複数の可能な入力文字列を認識する端末です。実際に認識された文字列(またはその文字列の計算された関数)は、トークンのセマンティック値としてパーサーに渡される必要があります。
名目上、入力文字列の各ポイントで、トークナイザーはすべての認識機能を実行し、一致が最も長いものを選択します。 (これはいわゆる「最大ムンク」ルールです。)これは通常、特にすべてのパターンが正規表現である場合に最適化できます。たとえば、(F)lexがその最適化を行います。
あなたの場合の複雑さは、あなたの言語のトークン化が文脈に依存しているということです。特に、ターゲットがelem_or_dataの場合、可能なトークンは<、