我需要 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));
这里的问题是CoPattern依赖于ExPattern,而ExPattern依赖于FaPattern,FaPattern又依赖于CoPattern本身。那么我该如何做到这一点呢?
在括号内,您可以定义一个新表达式,但新表达式可以再次包含括号,因此它就像递归正则赋值,这是不可能的:
你自己想通了:它似乎不起作用。
因此,简单的答案是:正则表达式在这里是一个不足的工具。你应该非常考虑建立一个真正的解析器。
不仅因为硬性的概念限制,请参阅此处示例。但因为:构建解析器不仅仅是匹配输入。编译器/解析器的一个关键要素是对无效输入提供反馈。正则表达式为您提供二进制"匹配"与"不匹配"答案。但作为程序员,你不希望被告知"你的输入是无效的,很可能,一个问题是这里缺少括号,那里缺少一个无效的标识符"。
因此,即使你以某种方式让这种方法为你工作,它也只会给你一个二元答案。而且:"概念验证"并不等同于拥有一个合理、坚实的基础。
这是你的项目,你的"新语言"。您应该了解围绕它的工具的任何部分。从那里来,"我已经看到了那个超级复杂的正则表达式,据说可以解决我的问题,有人可以根据我的需求进行调整吗"......显然不是一个好的起点。
正则表达式是一个非常有用的导入工具,但需要谨慎使用。我个人的经验法则是:当你的正则表达式如此复杂以至于你需要其他人向你解释它时,甚至为你写下来......然后考虑不使用正则表达式。因为你可能不在你的联盟中。您将是必须维护该代码的人。