我正在使用 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
我想将所有正则表达式组合成一个字符串模式并一次匹配。我的问题是当我开始在Type1
andType2
行中使用递归语法元素时。我显然不能将递归定义输入到 Java 中的模式中——它只是一个带有正则表达式符号的字符串。
我想要的是我可以以某种方式有一个逻辑开关,它说如果在这个块中:
(Type2 ((Var | Cons) | TypeParent)
除了 Type2 之外,所有模式都匹配,我可以捕获所有其他组,然后提取 Type2 令牌应该在的字符串,然后再次递归地将其输入到正则表达式中。最终,我会谈到以下基本情况:
(Var | Cons) | TypeParent)
我意识到这不是正则表达式的意思——现在这是一个上下文无关的语法(?),因为它是递归的。但是没有想到一个超级聪明的解析器,我认为这种方法是可以破解的。
想法?