Javaを使用してテキストを解析しています。以下に文法を定義しました。
Start := "(\\<)"
Stop := "(\\>)"
Var = "(\\w*)";
Cons = "([0-9]*)";
Type1 := Start ((Var | Cons) | TypeParent) (Type1 ((Var | Cons) | TypeParent))* Stop
Type2 := Start ((Var | Cons) | TypeParent) (Type2 ((Var | Cons) | TypeParent))* Stop
TypeParent := Type1 | Type2
...
etc
すべての正規表現を1つの文字列パターンに結合し、一度にすべてを一致させたいと思います。私の問題は、Type1
andType2
行で再帰的な文法要素を使い始めたときです。再帰的定義をJavaのPatternにフィードすることは明らかにできません。これは、正規表現記号を含む単なる文字列です。
私が欲しいのは、このブロックにある場合、次のような論理スイッチを使用できることです。
(Type2 ((Var | Cons) | TypeParent)
Type2を除いてすべてのパターンが一致し、他のすべてのグループをキャプチャできましたが、Type2トークンがあるべき文字列を抽出し、それを再帰的にregexerに再度フィードしました。最終的には、次の基本ケースにたどり着きます。
(Var | Cons) | TypeParent)
これは正規表現が意図していることではないことを理解しています。再帰的であるため、これは文脈自由文法(?)になりました。しかし、非常に賢いパーサーを考えることを除けば、この方法はハッキング可能だと思います。
考え?