[英]Regular expression for Syntax parser in Java
我需要一个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本身。 那我该如何做呢?
在括号内,您可以定义一个新表达式,但是新表达式可以再次包含括号,因此就像递归正则赋值,这是不可能的:
您自己想过:它似乎不起作用。
因此,简单的答案是:在这里,正则表达式是一个不足的工具。 您应该非常考虑构建一个真正的解析器。
不仅由于严格的概念限制,请参见此处的示例。 但由于:建立一个解析器比匹配输入多 。 编译器/解析器的一个关键要素是就无效输入提供反馈 。 正则表达式为您提供二进制“匹配”与“不匹配”答案。 但是作为程序员,您将不会被告知“您的输入无效,并且很可能出现的一个问题是,这里缺少括号,而那里的标识符无效 ”。
所以,即使你以某种方式获取 的方式为你工作,它会给你只是一个二进制的答案。 并且:“概念验证”与拥有合理,强大的基础可以建立基础。
这是您的项目,您的“新语言”。 您应该了解围绕它的工具的任何部分。 从那里开始,“我已经看到超级复杂的正则表达式可以解决我的问题,有人可以适应我的需求”……显然不是一个好的起点。
正则表达式是一个非常有用的导入工具,但必须谨慎使用。 我个人的经验法则是:当您的正则表达式非常复杂,以至于您需要其他人向您解释它时,甚至为您写下来……然后考虑不使用正则表达式。 因为您可能不在联盟之列。 您将是必须维护该代码的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.