Java语法分析器的正则表达式
我需要一个与我的编程语言语法相匹配的Java语法分析器正则表达式,如下所示:Java语法分析器的正则表达式,java,regex,parsing,syntax-error,parse-tree,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 I
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));
这里的问题是,协同模式依赖于expatern,它依赖于FaPattern,它又依赖于协同模式本身。那么,我如何使这项工作
在圆括号内,可以定义新表达式,但新表达式可以再次包含圆括号,因此它类似于递归正则赋值,这是不可能的:
你自己想的:它似乎不起作用
因此,简单的答案是:正则表达式在这里是不够的工具。您应该非常关注构建一个真正的解析器
不仅仅是因为严格的概念限制,参见示例。但因为:构建解析器不仅仅是匹配输入。编译器/解析器的一个关键要素是对无效输入提供反馈。正则表达式为您提供二进制匹配与不匹配答案。但作为程序员,你不想被告知你的输入是无效的,最有可能的一个问题是,这里缺少一个括号,那里缺少一个无效的标识符
所以,即使你以某种方式让它为你工作,它也只会给你一个二元答案。而且,概念证明与建立一个合理、坚固的基础不一样。p>
这是你的项目,你的新语言。您应该了解其周围工具的任何部分。从那里开始,我看到了超级复杂的正则表达式,它应该能解决我的问题,有人能根据我的需要来调整它吗。。。这显然不是一个好的起点
正则表达式是一个非常有用的导入工具,但使用时需要小心。我个人的经验法则:当你的正则表达式非常复杂,你需要其他人向你解释,甚至为你写下它。。。然后考虑不要使用正则表达式。因为你可能不适合你。您将是维护代码的人。给出的答案不是如何用Java解决这个问题的解决方案。这篇文章表明,可以使用转发引用:@user1095332我相应地更新了我的答案。这是少数几个我不会删除我的答案的场合之一,不管还有多少反对票。因为你把时间和精力花在了错误的地方,让未来的读者知道这是值得的……你在工作中使用了错误的工具。您需要一个扫描器和一个表达式解析器。正则表达式不能这样做。