在xtext中同时使用int和字符串编写规则的正确方法是什么?

时间:2019-07-04 16:33:57

标签: antlr xtext

我正在定义Xtext语法规则以解析诸如YYYY-MM-DDTHH-MM-SS之类的简单时间戳,但是,当我发送诸如2019-01-01T08:12:14之类的内容时,解析器不会进行解析,但是当我发送2019-01-01 T 08:12:14

我已经尝试删除规则定义的标记之间的每个空格,但这无济于事(可能也无济于事)

规则是:

Timestamp
    :
        year=INT '-' month=INT '-' day=INT 'T' hour=INT ':' minute=INT (':' second=INT)?
    ;

1 个答案:

答案 0 :(得分:1)

在您的情况下,利用hidden()子句应该可以解决问题

Timestamp hidden()
    :
        year=INT '-' month=INT '-' day=INT 'T' hour=INT ':' minute=INT (':' second=INT)?
    ;

但是还有另一个问题:

'T' hour=INT,它需要T周围有空格,否则将解析ID。 您可以使用片段来克服这个问题

Timestamp
    :
        Date 'T' Time
    ;

fragment Date hidden():
    year=INT '-' month=INT '-' day=INT
;

fragment Time hidden():
    hour=INT ':' minute=INT (':' second=INT)?
;

但是仍然存在需要空格的问题

=>我建议为整个事件引入终止规则(不确定是否有冲突的规则)

Timestamp
    :
       ts=TS
    ;
terminal TS: INT'-'INT'-'INT'T'INT':'INT(':'INT)?;