繁体   English   中英

Java中语法解析器的正则表达式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM