自己做游戏app的网站吗,外包公司做网站价格,腾讯云一键wordpress,产品网近期在做一个项目#xff0c;涉及到一些简单的规则匹配。规则的判定条件可以用关系表达式描述#xff0c;形如(P1|P2)(P3|P4)。其中是与#xff0c;|是或#xff0c;P1-P4是Pattern#xff0c;具体的匹配条件#xff0c;返回值是True或者False。为计算此表达式…近期在做一个项目涉及到一些简单的规则匹配。规则的判定条件可以用关系表达式描述形如(P1|P2)(P3|P4)。其中是与|是或P1-P4是Pattern具体的匹配条件返回值是True或者False。为计算此表达式的值采用中序转后序再计算表达式的值。 1. 后序表达式的生成 中序表达式转后序表达式算法 1. 用|()对原表达式进行拆分得到ListString。2. 从前往后遍历该List 1如果是一个pattern则入栈。 2如果是左括号(也入栈。 3如果是右括号 a如果此时栈为空则表示表达式解析异常报警并退出。 b如果栈不为空则依次pop栈顶元素直到匹配到左括号(。如果没有左括号(的匹配则表达式依次报警并退出。 4如果是和| a如果栈为空直接入栈。 b如果栈不为空依次出栈直到匹配左括号左括号不出栈。再把操作符入栈。3、所有的pattern和操作符都入栈以后把栈中所有元素依次出栈就得到后序表达式。参考代码 ListString postfix new ArrayListString();
StackString stack new StackString();
String delims |(); // 支持的操作符
StringTokenizer st new StringTokenizer(rule, delims, true);
while (st.hasMoreTokens()) {String tk st.nextToken();if (!delims.contains(tk)) {// pattern直接入栈postfix.add(tk);} else if (tk.equals(()) {// 左括号入栈stack.push(tk);} else if (tk.equals())) {if (stack.empty()) {// 碰到右括号如果栈为空解析异常throw new RuleException(parseRule Error!);}String val stack.pop();// 如果栈不为空依次出栈直到匹配左括号while (!val.equals(()) {postfix.add(val);if (!stack.empty()) {val stack.pop();} elsebreak;}if (stack.empty() !val.equals(()) {// 如果匹配不到左括号解析异常throw new RuleException(parseRule Error!);}} else if (tk.equals() || tk.equals(|)) {if (stack.empty()) {// 碰到操作符如果栈空则直接入栈stack.push(tk);} else {// 如果栈不为空依次出栈直到匹配左括号while (!stack.empty() !stack.lastElement().equals(()) {postfix.add(stack.pop());}// 操作符入栈stack.push(tk);}}
}// 所有的pattern和操作符匹配完毕把堆栈中还有的数据依次出栈
while (!stack.empty()) {postfix.add(stack.pop());
}System.out.println(Original Rule rule);
System.out.println(Postfix Rule: postfix.toString()); 2. 后序表达式的计算 后序表达式的计算算法 1. 从前往后遍历中序表达式 1如果是|操作符则pop两个字段r1和r2计算r1r2或r1|r2的值r3并将r3入栈。 2如果是pattern则计算pattern的匹配结果True Or False并将结果入栈。2、中序表达式便利完毕栈中只有1个元素即为表达式结果。 参考代码 StackBoolean stack new StackBoolean();
for (String str : this.postfix) {if (str.equals()) {// pop两个pattern计算boolean r1 stack.pop();boolean r2 stack.pop();stack.push(r1 r2);} else if (str.equals(|)) {// pop两个pattern计算boolean r1 stack.pop();boolean r2 stack.pop();stack.push(r1 || r2);} else {// 计算pattern的值并push到stackPattern ptn this.patterns.get(str);stack.push(ptn.judge(fact));}
}if (stack.size() 1) {return stack.pop();
} else {throw new RuleException(judge failed: postfix error!);
} 转载于:https://www.cnblogs.com/simplestupid/p/4771892.html