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

我想将所有正则表达式组合成一个字符串模式并一次匹配。我的问题是当我开始在Type1andType2行中使用递归语法元素时。我显然不能将递归定义输入到 Java 中的模式中——它只是一个带有正则表达式符号的字符串。

我想要的是我可以以某种方式有一个逻辑开关,它说如果在这个块中:

(Type2 ((Var | Cons) | TypeParent)

除了 Type2 之外,所有模式都匹配,我可以捕获所有其他组,然后提取 Type2 令牌应该在的字符串,然后再次递归地将其输入到正则表达式中。最终,我会谈到以下基本情况:

(Var | Cons) | TypeParent)

我意识到这不是正则表达式的意思——现在这是一个上下文无关的语法(?),因为它是递归的。但是没有想到一个超级聪明的解析器,我认为这种方法是可以破解的。

想法?

4

2 回答 2

5

你是对的。这不是正则表达式的本意。引入递归的那一刻,您就脱离了正则表达式、DFA 的领域,进入了无上下文语言、DPDA、解析器的领域。您需要一个堆栈来处理递归。不,它是不可破解的。

这个语法的解析器没有什么“超级聪明”的。它比您迄今为止所做的要简单得多。

于 2012-10-04T00:37:45.580 回答
3

使用正确的工具来完成工作要容易得多。尝试CUPANTLRJavaCC。这是一个ANTLR 示例

于 2012-10-04T00:37:57.477 回答