Как правильно написать правило как с int, так и со строками в xtext? - PullRequest
0 голосов
/ 04 июля 2019

Я определяю правило грамматики 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 Ответ

1 голос
/ 04 июля 2019

в вашем случае использование предложения hidden() должно помочь

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

но есть еще одна проблема:

'T' hour=INT, который требует пробелов вокруг T, в противном случае идентификатор будет проанализирован. Вы можете преодолеть эту проблему, используя фрагменты

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)?;
...