用单引号接受语法

时间:2013-08-31 22:44:16

标签: antlr antlr4

我需要在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 个答案:

答案 0 :(得分:1)

你的语法没有错误。

虽然“STRING”匹配的输入涵盖“DATE”的输入,但输入为“2007-08-01T01:00:00,000 + 01:00”的输入仍将被识别为“DATE”。 “ANTLR通过将输入字符串与语法中首先指定的词法规则相匹配来解决词汇歧义。”关系类似于“KEYWORD”和“IDENTIFIER”。您可以参考“务实。最终的ANTLR 4参考”了解更多详情。

Lexers尝试匹配每个令牌可能的最长字符串,因此输入“2007-08-01T01:00:00,000 + 01:00”将被识别为“STRIGN”。

您可以在Antlr 4上进行测试。