抽象構文ツリーをゼロから作成することで、正規表現用のパーサーを構築しようとしています(Javaなどのカップパーサーなどのプロジェクト依存性やツールなし)。正規表現に含まれるすべての情報を保存するのではなく、可能な限り単純化したいと思います。正規表現の最適なASTを構築するにはどうすればよいですか?
例として、x::=y|z
は、文字クラスx::=[yz]
と同じASTになるはずです。しかし、正規表現は非常に複雑になる可能性があるため、実装する同等のものを決定することはできません。たとえば、負の選択肢x::=[^b]
を保存する方法はわかりません。x::=a|c|d|e|...
どのような抽象化を行いますか?これらの抽象概念の中には後で間違ったASTにつながることがありますか?
文字クラスは別にしてください。これを考えてみましょう:Unicodeは120k文字以上の文字を定義しているので、 '[^ b]'はおよそ120kのメンバーと交互になります。それはASTのために良いことではない。 –