簡體   English   中英

ANTLR日期和整數匹配

[英]ANTLR Date and Integer Matching

我正在評估一種相對簡單的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> AGE”或“AGE <65”或“DOB> 19500101”。

有人可以提出一種方法來使解析器區分INTEGER和8位數日期格式嗎?

詞法分析器與INTEGER匹配后,您可以檢查其匹配的文本(通過$text引用),並根據該自定義檢查,決定將其類型從INTEGER更改為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

dateEvaluation
 : DATE ...
 ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM