ANTLR日期和整数匹配

ANTLR日期和整数匹配,antlr,Antlr,我正在评估一种相对简单的IF/THEN语言,但遇到了一个问题:我需要匹配YYYYMMDD格式的整数和日期。如果我能写一个真正的正则表达式,我可以很容易地解决这个问题,但还没有找到一个ANTLR解决方案 语法如下所示: //overall rule to evaluate a single expression singleEvaluation returns [boolean evalResult] : integerEvaluation {$evalResult = $integerEva

我正在评估一种相对简单的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: '>=';
//计算单个表达式的总体规则
singleEvaluation返回[boolean evalResult]
:integerEvaluation{$evalResult=$integerEvaluation.evalResult;}
|dateEvaluation{$evalResult=$dateEvaluation.evalResult;}
//等
;
dateEvaluation返回[boolean evalResult]
:expr1=(整型|“今天”|日期|字段(标识符)(leftOp=(“+”|“-”)leftModifier=整型leftQualifier=日期(限定符)?
运算符=(等式| NE | LT | LE | GT | GE)
expr2=(整数|“今天”|日期|字段(标识符)(rightOp=(“+”|“-”)rightModifier=整数rightQualifier=日期(限定符)?
{//code}
整数评估返回[boolean evalResult]
:expr1=(NUM_字段_标识符|整数)
运算符=(等式| NE | LT | LE | GT | GE)
expr2=(NUM_字段_标识符|整数)
{//代码
}
;
片段数字:“0”…'9';
整数:数字+;
日期字段标识符:('DOB'|'DATE_OF_HIRE');
NUM_字段_标识符:('AGE'|'DEPARTMENT_ID');
日期限定符:(“年”、“年”、“月”、“月”、“日”、“天”、“今天”);
等式:'=';
NE:'';
LT:'=';
需要解析的语句的一个例子是“65>AGE”或“AGE<65”或“DOB>19500101”


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

在lexer匹配一个
整数后,您可以检查其匹配的文本(通过
$text
引用),并根据该自定义检查,决定将其类型从
整数更改为
日期。
DATE
规则可以作为空的
fragment
规则,然后可以在解析器规则中使用,就像它是一个普通的lexer规则一样

快速演示:

整数
:位数+
{
//如果此令牌以“19”或“20”开头,则后跟
//按6位数字,将其更改为日期标记。
if($text.matches(“(19 | 20)\\d{6}”)){
$type=日期;
}
}
;
片段日期:/*空!*/;
然后在解析器规则中,只需使用
DATE

dateEvaluation
:日期。。。
;

一天两次。再次感谢你的帮助。没问题@Jason。。。再说一遍:)