ANTLR日期和整数匹配

时间:2012-11-14 17:31:32

标签: antlr

我正在评估一种相对简单的IF / THEN语言,但遇到了一个问题:我需要匹配格式为YYYYMMDD的整数和日期。如果我能写一个真正的正则表达式,我可以很容易地解决这个问题,但还没有想出一个ANTLR解决方案。

语法看起来像这样:

//overall rule to evaluate a single expression
singleEvaluation returns [boolean evalResult]
  : integerEvaluation {$evalResult = $integerEvaluation.evalResult;}
  | dateEvaluation {$evalResult = $dateEvaluation.evalResult;}
  // etc
  ;


dateEvaluation returns [boolean evalResult]
  : expr1=(INTEGER|'TODAY'|DATE_FIELD_IDENTIFIER) (leftOp=('+'|'-') leftModifier=INTEGER leftQualifier=DATE_QUALIFIER)? 
    operator=(EQ|NE|LT|LE|GT|GE) 
    expr2=(INTEGER|'TODAY'|DATE_FIELD_IDENTIFIER) (rightOp=('+'|'-') rightModifier=INTEGER rightQualifier=DATE_QUALIFIER)?
{ // code }

integerEvaluation returns [boolean evalResult]
  : expr1=(NUM_FIELD_IDENTIFIER|INTEGER) 
    operator=(EQ|NE|LT|LE|GT|GE) 
    expr2=(NUM_FIELD_IDENTIFIER|INTEGER)
  { // code
  }
  ;

fragment DIGIT: '0'..'9';
INTEGER: DIGIT+;
DATE_FIELD_IDENTIFIER: ('DOB'|'DATE_OF_HIRE');
NUM_FIELD_IDENTIFIER: ('AGE'|'DEPARTMENT_ID');
DATE_QUALIFIER:('YEAR'|'YEARS'|'MONTH'|'MONTHS'|'DAY'|'DAYS'|'TODAY');
EQ:'=';
NE: '<>';
LT: '<';
LE: '<=';
GT: '>';
GE: '>=';

需要解析的语句示例类似于“65&gt; AGE”或“AGE&lt; 65”,或“DOB&gt; 19500101”。

有人可以建议一种方法让解析器区分INTEGER和8位数日期格式吗?

1 个答案:

答案 0 :(得分:4)

词法分析器与INTEGER匹配后,您可以检查其匹配的文本(通过$text引用),并根据该自定义检查,决定将其类型从INTEGER更改为{ {1}}。 DATE规则可以作为空DATE规则,然后可以在解析器规则中使用,就像它是普通的词法分析器规则一样。

快速演示:

fragment

然后在解析器规则中,您可以使用INTEGER : DIGIT+ { // If this token starts with either '19' or '20', followed // by 6 digits, change it to a DATE-token. if ($text.matches("(19|20)\\d{6}")) { $type = DATE; } } ; fragment DATE : /* empty! */ ;

DATE