5

一重引用符内の日付と時刻を受け入れる文法を 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'を指定すると、日付として受け入れられず、文字列として受け入れられます。

誰かが助けてくれたら、それは私にとても感謝しているかもしれません. ありがとうございました。

4

1 に答える 1

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 でテストできます。

于 2013-09-02T03:11:30.070 に答える