w ^
您需要解析可能包含切换案例指令的规则。

当我们考虑使用Groovy在Java代码中实现此解析器时,我在Groovy中编写了以下代码:

1. class RuleParser {
2. String functionRegex = /(frml[0-9]*)((\s*@[a-zA-Z0-9_]*\s*)?(,\s*@[a-zA-Z0-9_]*\s*)*)/
3. String variableRegex = /@[a-zA-Z0-9_]*/
4. String numberRegex = /\s+[0-9]+/
5. String switchRegex = /switch(\s*1\s*)((\s*|\n)case)+((\s*|\n)default)?/
6. String caseRegex = /case\s*1\s*:\s*1/
7. String defaultRegex = /default\s*:\s*1/
8. String conditionRegex = /1(>=|<=|>|<|==|!=)1/

9. testRule(String rule){
10.       try {
11.          rule.eachMatch(numberRegex){ match->
12.             rule=rule.replaceAll(match, ' 1');
13.          }
14.          rule.eachMatch(functionRegex){ match->
15.             rule=rule.replaceAll(match, '1');
16.          }
17.          rule.eachMatch(variableRegex){ match->
18.             rule=rule.replaceAll(match, '1');
19.          }
20.          rule.eachMatch(defaultRegex){ match->
21.             rule=rule.replaceAll(match, 'default');
22.          }
23.          rule.eachMatch(caseRegex){ match->
24.             rule=rule.replaceAll(match, 'case');
25.          }
26.          rule.eachMatch(switchRegex){ match->
27.             rule=rule.replaceAll(match, '1');
28.          }
29.          Eval.me(rule)
30.          println "run successfully"
31.       } catch (Exception e) {
32.          e.printStackTrace()
33.       }
34.    }
35. }


首先,我只是想测试输入规则,以根据我们的结构知道它是否正确,例如,我考虑了以下规则示例以跟踪代码是否正常工作:

switch(@prm43)
case 12: @msg13
case 14: @msg32
default: @msg100


它一直工作到第26行,到达26行时,规则是:

switch(1)
case
case
default


尽管它完全遵循switchRegex的模式,但是在第28行之后却没有任何变化,为什么?

最佳答案

很抱歉没有为您的问题提供一个直接的答案,但是对我来说,您要达到的目标似乎有点不清楚。在进行一些替换之后,您可以评估该规则,但是您的开关不是合法的习惯(或Java)。开关后需要大括号。此外,我将尝试利用Groovy的DSL功能而不是创建解析器。如果解析器确实是您所需要的(缺少有关动机和上下文的信息),那么我建议使用像jparsec这样的组合器解析器:

https://github.com/jparsec/jparsec

用jparsec描述语法非常容易,并且非常易于维护。无论如何,使用正则表达式看起来像一个钉子一样的问题,因为我们只有锤子。

10-06 01:22