0

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つの文字列パターンに結合し、一度にすべてを一致させたいと思います。私の問題は、Type1andType2行で再帰的な文法要素を使い始めたときです。再帰的定義をJavaのPatternにフィードすることは明らかにできません。これは、正規表現記号を含む単なる文字列です。

私が欲しいのは、このブロックにある場合、次のような論理スイッチを使用できることです。

(Type2 ((Var | Cons) | TypeParent)

Type2を除いてすべてのパターンが一致し、他のすべてのグループをキャプチャできましたが、Type2トークンがあるべき文字列を抽出し、それを再帰的にregexerに再度フィードしました。最終的には、次の基本ケースにたどり着きます。

(Var | Cons) | TypeParent)

これは正規表現が意図していることではないことを理解しています。再帰的であるため、これは文脈自由文法(?)になりました。しかし、非常に賢いパーサーを考えることを除けば、この方法はハッキング可能だと思います。

考え?

4

2 に答える 2

5

あなたは正しいです。これは、正規表現が行うことを意図したものではありません。再帰を導入すると、正規表現(DFA)の領域から外れ、文脈自由言語(DPDA、パーサー)の領域に移動します。再帰を処理するにはスタックが必要です。いいえ、ハッキングできません。

この文法のパーサーについては、「超賢い」ものは何もありません。これまでに行ったことよりもかなり簡単です。

于 2012-10-04T00:37:45.580 に答える
3

仕事に適したツールを使用する方がはるかに簡単です。CUPANTLR、またはJavaCCを試してください。これがANTLRの例です。

于 2012-10-04T00:37:57.477 に答える