Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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_Regex_Parsing_Syntax Error_Parse Tree - Fatal编程技术网

Java语法分析器的正则表达式

Java语法分析器的正则表达式,java,regex,parsing,syntax-error,parse-tree,Java,Regex,Parsing,Syntax Error,Parse Tree,我需要一个与我的编程语言语法相匹配的Java语法分析器正则表达式,如下所示: Variable1={1,2,3} Variable2=Variable1+{4,5,6}+{}*{2} Variable3=(Variable2+{1})*Variable1 ?Variable3 ?{1,2,3} ?Variable3+{1,2,3} 变量的表达式赋值包含=且求值以?签名 在圆括号内,您可以定义一个新表达式,但新表达式可以再次包含圆括号,因此它类似于递归正则赋值,这是不可能的: String I

我需要一个与我的编程语言语法相匹配的Java语法分析器正则表达式,如下所示:

Variable1={1,2,3}
Variable2=Variable1+{4,5,6}+{}*{2}
Variable3=(Variable2+{1})*Variable1
?Variable3 
?{1,2,3}
?Variable3+{1,2,3}
变量的表达式赋值包含=且求值以?签名 在圆括号内,您可以定义一个新表达式,但新表达式可以再次包含圆括号,因此它类似于递归正则赋值,这是不可能的:

String IdPattern = "[a-zA-Z][a-zA-Z0-9]*";            
String SePattern ="\\{"+"([0-9]*)(\\,[0-9]+)*"+"\\}";  


// Problem at next line:
   String CoPattern  = "\\(" + ExPattern + "\\)";   
// CoPattern depends on 
// Expattern, which depends on TePattern, 
// which depends on FaPattern, which depends on CoPattern again.

String FaPattern= "("+IdPattern+"|"+SePattern+"|"+CoPattern+")";              
String TePattern = FaPattern + "("+ "\\*"+ FaPattern+ ")*" ;   
String ExPattern= "" + TePattern + "(" + "\\+"+ TePattern+")*";  


String AsPattern =  "("+IdPattern+"="+ExPattern+")";  
String PriPattern = "(\\?"+ExPattern +")";                     
String StaPattern = "("+AsPattern+"|"+PriPattern+")";    
String Pro = StaPattern+"$";       
System.out.println("Input=((({20}+{1,2,3})))".matches(Pro));
这里的问题是,协同模式依赖于expatern,它依赖于FaPattern,它又依赖于协同模式本身。那么,我如何使这项工作

在圆括号内,可以定义新表达式,但新表达式可以再次包含圆括号,因此它类似于递归正则赋值,这是不可能的:

你自己想的:它似乎不起作用

因此,简单的答案是:正则表达式在这里是不够的工具。您应该非常关注构建一个真正的解析器

不仅仅是因为严格的概念限制,参见示例。但因为:构建解析器不仅仅是匹配输入。编译器/解析器的一个关键要素是对无效输入提供反馈。正则表达式为您提供二进制匹配与不匹配答案。但作为程序员,你不想被告知你的输入是无效的,最有可能的一个问题是,这里缺少一个括号,那里缺少一个无效的标识符

所以,即使你以某种方式让它为你工作,它也只会给你一个二元答案。而且,概念证明与建立一个合理、坚固的基础不一样。p> 这是你的项目,你的新语言。您应该了解其周围工具的任何部分。从那里开始,我看到了超级复杂的正则表达式,它应该能解决我的问题,有人能根据我的需要来调整它吗。。。这显然不是一个好的起点


正则表达式是一个非常有用的导入工具,但使用时需要小心。我个人的经验法则:当你的正则表达式非常复杂,你需要其他人向你解释,甚至为你写下它。。。然后考虑不要使用正则表达式。因为你可能不适合你。您将是维护代码的人。

给出的答案不是如何用Java解决这个问题的解决方案。这篇文章表明,可以使用转发引用:@user1095332我相应地更新了我的答案。这是少数几个我不会删除我的答案的场合之一,不管还有多少反对票。因为你把时间和精力花在了错误的地方,让未来的读者知道这是值得的……你在工作中使用了错误的工具。您需要一个扫描器和一个表达式解析器。正则表达式不能这样做。