1

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 はこれを正しく解析します。 SwiftTiny 構文木

目を細めないでください...単一行の値(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 個のトークンにレクシングします。

  1. スタートブロック
  2. 4
  3. 結腸
  4. フィールド値
  5. 結腸

トークン 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 に一致するように文法を修正する方法はありますか?

4

1 に答える 1

0

Java\nテスト コードが Windows スタイルの\r\n.

「1以上」を追加してNEWLINEを変更しました。

NEWLINE    : ('\n'|'\r') ;

NEWLINE    : ('\n'|'\r')+ ;

これにより、字句エラーなしで解析を進めることができました。これで、IDE が生成された Java とは異なる動作をした理由が理解できました。わずかに異なる入力文字列を取得していたのです。

于 2012-08-13T17:21:59.080 に答える