1 行に 1 つずつ表示されるキーと値のペアを受け入れる文法があります。値は複数行の場合があります。
Eclipse プラグイン ANTLR IDE は正しく動作し、有効なテスト文字列を受け入れます。ただし、生成された Java は同じ文字列を受け入れません。
文法は次のとおりです。
message: block4 ;
block4: STARTBLOCK '4' COLON expr4+ ENDBLOCK ;
expr4: NEWLINE (COLON key COLON expr | '-')+;
key: FIELDVALUE* ;
expr: FIELDVALUE* ;
NEWLINE : ('\n'|'\r') ;
FIELDVALUE : (~('-'|COLON|ENDBLOCK|STARTBLOCK))+;
COLON : ':' ;
STARTBLOCK : '{' ;
ENDBLOCK : '}' ;
ANTLR IDE はこれを正しく解析します。
目を細めないでください...単一行の値(23B / CREDなど)または複数行の値(59 / /13212312\r\nRECEIVER NAME SA\r\nなど)であるかどうかにかかわらず、キー/式のペアを分割しています。
入力文字列は次のとおりです。
{4:
:20:007505327853
:23B:CRED
:32A:050902JPY3520000,
:33B:JPY3520000,
:50K:EUROXXXEI
:52A:FEBXXXM1
:53A:MHCXXXJT
:54A:FOOBICXX
:59:/13212312
RECEIVER NAME S.A
:70:FUTURES
:71A:SHA
:71F:EUR12,00
:71F:EUR2,34
-}
Eclipse が文法で anltr-3.4-complete.jar を実行すると、SwiftTinyLexer.java と SwiftTinyParser.java が生成されます。lexer はそれらを 35 個のトークンにレクシングします。
- スタートブロック
- 4
- 結腸
- フィールド値
- 結腸
トークン 4 を FIELDVALUE ではなく expr4 にしたいと思います (IDE は私に同意しているようです)。しかし、これは FIELDVALUE であるため、パーサーは でそのトークンを窒息させていますline 1:3 required (...)+ loop did not match anything at input '\r\n'
。
anltr 3.4 と ANTLR IDE 2.1.2.201108281759 が同じ文字列を lex する方法に違いがあるのはなぜですか?
FIELDVALUE に一致する前に expr4 に一致するように文法を修正する方法はありますか?