2012-01-09 4 views
1

以下の文法を参照してください。私が解析しようとすると:ANTLRは、他の文字が最初に必要なときに一致する文字ですか?

String s = "UNH+message refere+APERAK:D:97A:UN\n"; 

を私は次のエラーを取得する:それは\ nを出会う前に、UNHを探しているように見えるので、私には意味がありません

line 1:34 mismatched character '\n' expecting 'H' 
line 2:0 missing RDEL at '<EOF>' 

、これだろう'ファイル'ルールに従わない。

grammar Aperak; 

    options { 
     language = Java; 
    } 

    @header { package test.fixed.aperak; } 
    @lexer::header { package test.fixed.aperak; } 

    file returns [String result]: 'UNH' unh01 unh02 RDEL { $result = $unh01.text + " -- " + $unh02.text; }; 

    unh01 : FDEL optField; 
    unh02 : FDEL unh02x1 unh02x2 unh02x3 unh02x4 (unh02x5)?; 
    unh02x1 : optField; 
    unh02x2 : SDEL optField; 
    unh02x3 : SDEL optField; 
    unh02x4 : SDEL optField; 
    unh02x5 : SDEL optField; 

    optField : AN*; 

    RDEL : '\n'; 
    SDEL : ':'; 
    FDEL : '+'; 

    AN : 'a'..'z' | 'A'..'Z' | '0'..'9' | ' '; 

答えて

1

あなたのレクサーが本当に次のようになります。

UNH : 'UNH'; 
RDEL : '\n'; 
SDEL : ':'; 
FDEL : '+'; 
AN : 'a'..'z' | 'A'..'Z' | '0'..'9' | ' '; 

あなたfileルール内のリテラル'UNH'はAとなりレクサールールは他のすべてのレクサールールよりも優先されます。

レクサーが"UN"に続いて"H"以外の何かがつまずくと、レクサーがバックトラックしないためエラーが発生します。 ANルールが複数の文字と一致した場合、そのルールに従うことができますが、1文字にしか一致しないため、レクサーは"UN"からバックトラックしません。

既に提案されているように、ANは1文字以上と一致し、optFieldはオプションのANと一致する必要があります。彼(または彼女)の答えの他の部分は、しかし、それほど正確ではありません:したがって、私の答え。

1

私はANTLRはUNH入力をカバーする2つの重複するルールを持つ純粋に混乱してしまいますと思う:

  • 単一のトークンUNH、または
  • タイプANの3つのトークンの一連の文章で"U""N"、および"H"

私は薄いですあなたはこのように、レクサーに*を移動するために、あなたのoptFieldANルールを変更する必要がありk個:

optField : AN?; 

AN : ('a'..'z' | 'A'..'Z' | '0'..'9' | ' ')+; 
+0

修正は正しいが、答えは完全ではない:3つのトークンのためにレクサーが混乱しない:これらのトークン( '' U "'、 '" N "'、 '" H "')は作成されません。 '' UN''( '' x "'は '' H ''以外のもの)のような入力から '' UNH''トークンを作成しようとすると、 '' AN''が1文字にマッチするので、 。 –

+0

@BartKiers私は3つのトークン*が作成されるとは言わなかったが、文字列UNHを3つのトークンのシーケンスとして解釈するためのルールがあるということだけがある。 – dasblinkenlight

+0

あなたはこう言っています: "" AN "型の3つのトークンのシーケンス、" "U" 'のテキストを持つ、 ""レクサーはどこにも戻ってきません " '' N ''' '' H' '' "* ...おそらく、あなたは私がそれを言ったようにそれを意味していたかもしれませんが、 –

関連する問題