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

标签 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 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 本身。那么我该如何完成这项工作呢?

最佳答案

Inside parenthesis, you can define a new expression, but the new expression can contain parenthesis again, so it's like a recursive regular assignment, which is not possible:

你自己想通了:这似乎行不通。

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

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

所以即使你以某种方式得到 approach为了为您工作,它只会给您一个二进制答案。而且:“概念验证”并不等同于拥有合理、稳健的基础。

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

正则表达式是一个非常有用且重要的工具,但需要小心使用。我个人的经验法则:当你的正则表达式非常复杂,以至于你需要其他人向你解释它,甚至为你写下来......然后考虑不使用正则表达式。因为你可能已经超出了你的范围。您将是必须维护该代码的人。

关于java - Java 语法解析器的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57900166/

相关文章:

java - GSON解析未指定类型变量

java - Android Studio 3.0 布局编辑器/预览器

java - 如何使用 Java 对 .docx 文件进行数字签名

c# - 匹配值和国际字符

parsing - 什么 Lisp 更擅长解析?

c++ - C/C++ 中的 C 风格无符号字符解析和操作 - 段错误

java - 远程调试不起作用,显示错误 "Line number information is missing"

java - Android 中的 Crashlytics - 如何在一个地方捕获所有异常/崩溃

python - 正则表达式卡住

java - 字符序列之间的匹配 - 第一次出现之前