Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用递归正则表达式在Java中进行词法分析_Java_Parsing_Grammar_Tokenize_Lexer - Fatal编程技术网

使用递归正则表达式在Java中进行词法分析

使用递归正则表达式在Java中进行词法分析,java,parsing,grammar,tokenize,lexer,Java,Parsing,Grammar,Tokenize,Lexer,我正在用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)

我正在用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
除了Type2之外,所有的模式都是匹配的,我可以捕获所有其他的组,但是在Type2标记应该出现的地方提取字符串,然后再次递归地将其输入regexer。最终,我会着手一个基本案例:

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


想法?

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


这种语法的解析器没有什么“超级聪明”的地方。这比你目前所做的要简单得多。

使用合适的工具来完成这项工作要容易得多。试试看,或者。这是一个。

JParsec看起来很酷。纯Java,不需要语法模板。谢谢@lollercoaster有三个结果的语法并不复杂。你根本不需要状态机。你可以用递归下降法来做。我建议你停止猜测,开始学习这些技巧的真正含义。你是对的。递归下降相当容易。使用调车场算法->RPN->AST树的实现正好做到了这一点。谢谢
(Var | Cons) | TypeParent)