java - 复合规则的 ANTLR 评估

标签 java antlr

以下是我一直在研究的 ANTLR 语法的片段:

compoundEvaluation returns [boolean evalResult]
  : singleEvaluation (('AND'|'OR') singleEvaluation)*
;

//overall rule to evaluate a single expression
singleEvaluation returns [boolean evalResult]
  : simpleStringEvaluation {$evalResult = $simpleStringEvaluation.evalResult;} 
  | stringEvaluation {$evalResult = $stringEvaluation.evalResult;}
  | simpleDateEvaluation {$evalResult = $simpleDateEvaluation.evalResult;}
  | dateEvaluatorWithModifier1 {$evalResult = $dateEvaluatorWithModifier1.evalResult;}
  | dateEvaluatorWithoutModifier1 {$evalResult = $dateEvaluatorWithoutModifier1.evalResult;}
  | simpleIntegerEvaluator {$evalResult = $simpleIntegerEvaluator.evalResult;}
  | integerEvaluator {$evalResult = $integerEvaluator.evalResult;}
  | integerEvaluatorWithModifier {$evalResult = $integerEvaluatorWithModifier.evalResult;}
  ;

以下是其中一项评估规则的示例:

simpleStringEvaluation returns [boolean evalResult]
: op1=STR_FIELD_IDENTIFIER operator=(EQ|NE) '"'? op2=(SINGLE_VALUE|INTEGER) '"'?
{
  // I don't want these to be equal by default
  String op1Value = op1.getText();
  String op2Value = op2.getText();
  try {
    // get the values of the bean property specified by the value of op1 and op2
    op1Value = BeanUtils.getProperty(policy,op1.getText());
  } catch (NoSuchMethodException e) {
    e.printStackTrace();
  } catch (InvocationTargetException e) {
    e.printStackTrace();
  } catch (IllegalAccessException e) {
    e.printStackTrace();
  }

String strOperator = operator.getText();
if (strOperator.equals("=")) {
  evalResult = op1Value.equals(op2Value);
} 
if (strOperator.equals("<>")) {
  evalResult = !op1Value.equals(op2Value);
}
}
;

显然我是一个新手,因为我没有构建一棵树,但是代码可以工作,所以我对它相当满意。然而,下一步是对多个 singleEvaluation 语句执行逻辑评估。由于我将代码嵌入到语法中,我希望有人能够为我指明正确的方向,以弄清楚如何评估 0 个或多个结果。

最佳答案

无需将值存储在集合中。

为什么不简单地做这样的事情:

compoundOrEvaluation returns [boolean evalResult]
  :          a=singleEvaluation { $evalResult   = $a.evalResult; } 
    ( ('OR') b=singleEvaluation { $evalResult ||= $b.evalResult; } )*
  ;

关于java - 复合规则的 ANTLR 评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344390/

相关文章:

java - 如何从antlr词法分析器中提取关键字

带有 paho 的 java.io.EOFException

java - 具有 Spring Boot 集成的 Cucumber Java - Spring @Autowired 抛出 NullPointer 异常

Java将一组字符串转换为String Array Integer Array

java - Antlr 规则的返回值必须是 *Context 类型吗?

antlr - ANTLR中是否存在逻辑AND和NOT?

使用 ANTLRv4 的 Java DSL 实现

java - 你能用一个 long int 索引一个数组吗?

java - 如何计算 MethodVariableAccess 中的局部变量索引?

c - 是否可以使用 ANTLR 解析 C 头文件?