【问题标题】:Regular expression for Syntax parser in JavaJava中语法解析器的正则表达式
【发布时间】:2020-01-13 22:40:54
【问题描述】:

我需要一个与我的编程语言语法相匹配的 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 本身。那么我该如何完成这项工作呢?

【问题讨论】:

  • 您使用了错误的工具来完成这项工作。您需要一个扫描仪和一个表达式解析器。你不能用正则表达式来做到这一点。

标签: java regex parsing syntax-error parse-tree


【解决方案1】:

在括号里面可以定义一个新的表达式,但是新的表达式又可以包含括号,所以就像递归的正则赋值,这是不可能的:

您自己想通了:它似乎不起作用。

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

不仅因为严格的概念限制,请参阅here 例如。但是因为:构建解析器比匹配输入更多。编译器/解析器的一个关键要素是针对无效输入提供反馈。正则表达式为您提供二进制“匹配”与“不匹配”的答案。但作为程序员,您不会被告知“您的输入无效,而且很可能,一个问题是此处缺少括号,而此处标识符无效” .

因此,即使您以某种方式得到 approach 为您工作,它也只会给您一个二元答案。而且:“概念证明”与拥有合理、强大的基础不同。

这是你的项目,你的“新语言”。您应该了解围绕它的工具的任何部分。从那里开始,“我已经看到据说可以解决我的问题的超级复杂的正则表达式,有人可以根据我的需要进行调整”......显然不是一个好的起点。

正则表达式是一个非常有用的导入工具,但需要谨慎使用。我个人的经验法则:当您的正则表达式如此复杂以至于您需要其他人向您解释时,甚至为您写下来......然后考虑不使用正则表达式。因为你可能不在你的联盟中。而你将成为必须维护该代码的人。

【讨论】:

  • 给出的答案不是如何在Java中解决这个问题的解决方案。这篇文章表明可以使用前向引用:stackoverflow.com/questions/47162098/…
  • @user1095332 我相应地更新了我的答案。这是为数不多的我不会删除我的答案的场合之一,无论可能会有多少反对票。因为你把你的时间和精力投入到了错误的地方,让未来的读者知道这是值得的...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2014-05-08
  • 2011-06-03
  • 2016-03-31
相关资源
最近更新 更多