2013-08-31 5 views
2

Мне нужно написать грамматику в antlr4, которая принимает дату и время в одинарных кавычках, а затем должна печатать то же, что и вывод. Например: дата/время = '2007-08-01T01: 00: 00 000 + 01: 00'. Если это мой ввод, он должен принимать как (дату или время), так и дату и время в грамматике, а вывод должен печатать так же, как и введенный нами ввод.Принимая грамматику с одинарными кавычками

ЧАСТЬ грамматику

predicateOperand : objectPath | operand; 

operand : STRING | INTEGER | FLOAT | DATE | PARAMETER | BOOLEAN; 

DATE : '\'' DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT 
     'T' DIGIT DIGIT ':' DIGIT DIGIT ':' DIGIT DIGIT ',' DIGIT DIGIT 
     DIGIT '+' DIGIT DIGIT ':' DIGIT DIGIT '\''; 

STRING : '\'' (ESC_SEQ | ~('\\'|'\''))* '\'' 
      |'"' (ESC_SEQ | ~('\\'|'"'))* '"'; 

Это часть моей грамматики. Но, если я даю '2007-08-01T01: 00: 00 000 + 01: 00' как входной, его не принимает в качестве даты, а принимает его как строку.

Если кто-то помогает, это может быть так благодарно мне. Спасибо.

ответ

1

Ошибка в грамматике.

Хотя ввод, который соответствует «STRING», соответствует значению «DATE», вход как «2007-08-01T01: 00: 00 000 + 01: 00» по-прежнему будет распознаваться как «DATE». «ANTLR разрешает лексические двусмысленности, сопоставляя входную строку с лексическим правилом, указанным сначала в грамматике». Это отношение похоже на «KEYWORD» и «IDENTIFIER». Для получения дополнительной информации вы можете обратиться к «Pragmatic.The Definitive ANTLR 4 Reference».

Лексеры пытаются сопоставить самую длинную строку для каждого токена, поэтому такой ввод «2007-08-01T01: 00: 00 000 + 01: 00» будет признан «STRIGN».

Вы можете проверить его на Antlr 4.

Смежные вопросы