gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:31:47 27 4
gpt4 key购买 nike

我需要一个与我的编程语言语法相匹配的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com