【问题标题】:Repeat a token specific number of times in ANTLR4在 ANTLR4 中重复令牌特定次数
【发布时间】:2021-11-27 04:20:24
【问题描述】:

我想设计一个表达日期格式类型的规则 喜欢:

  • 'ddmmyyyy'
  • 'dd/mm/yyyy'
  • 'mm/dd/yyyy'
  • 'dd-mm-yyyy'
  • 'yyyymmdd'

我在 Lexer 中尝试过,但没有成功(令牌识别错误)

fragment DATE_SEPARATOR: ('/'|',');

FORMATE
: '\'' (MONTH{1,2} (DATE_SEPARATOR)? DAY{1,2}  (DATE_SEPARATOR)? YEAR{1,4}
| DAY{1,2}  (DATE_SEPARATOR)? MONTH{1,3}  (DATE_SEPARATOR)? YEAR{1,4}
| YEAR{1,4}  (DATE_SEPARATOR)? MONTH{1,3}  (DATE_SEPARATOR)? DAY{1,2})
;
fragment DAY : ('d'|'D'|'day'|'DAY') ;
fragment MONTH : ('m'|'M'|'Mon'|'Month'|'mon'|'month') ;
fragment YEAR : ('y'|'Y'|'Year'|'year'|'Yr'|'yr') ;

我只在解析器中使用 SINGLE_QUOTE 调用 FORMATE,它指的是 Lexer 中的 '

【问题讨论】:

    标签: antlr date-formatting


    【解决方案1】:

    {1,4} 不受 ANTLR 支持。如果你想匹配 1 到 4 次之间的东西,你需要这样做:

    NUMBER : D (D (D D?)?)?;
    
    fragment D : [0-9];
    

    但是当您执行YEAR{1,4} 并且YEAR 片段匹配('y'|'Y'|'Year'|'year'|'Yr'|'yr') 时,如果{1,4} 有效,您将成功匹配"YearYrYyr"(4 倍于YEAR 片段)。但是,这似乎有点奇怪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 2013-08-12
      • 2017-03-12
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      相关资源
      最近更新 更多