我需要在 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 | ~('\\'|'"') )* '"';
Run Code Online (Sandbox Code Playgroud)
这是我的语法的一部分。但是,如果我给'2007-08-01T01:00:00,000+01:00'作为输入,它不接受作为日期而不是接受作为字符串。
如果有人帮助,那可能会非常感谢我。谢谢你。
你的语法没有错误。
尽管“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 上测试它。