1

ANTLR4 を使用して .torent-file からメタ情報を解析しようとしました。

metainfo ファイル内のすべてのデータはベンコードされています。ベンコーディングの仕様:

dictionary = "d" 1*(string anytype) "e" ; non-empty dictionary
list       = "l" 1*anytype "e"          ; non-empty list
integer    = "i" signumber "e"
string     = number ":" <number long sequence of any CHAR>
anytype    = dictionary / list / integer / string
signumber  = "-" number / number
number     = 1*DIGIT
CHAR       = %x00-FF                    ; any 8-bit character
DIGIT      = "0" / "1" / "2" / "3" / "4" /
            "5" / "6" / "7" / "8" / "9"

私は次の文法を使用しています:

grammar Bencode;

bencode: (binteger | bstring | blist | bdictionary) EOF;

binteger: 'i' INT 'e';

bstring: INT ':' STRING;

blist: 'l' (binteger | bstring | blist | bdictionary)+ 'e';

bdictionary: 'd' (bstring (binteger | bstring | blist | bdictionary))+ 'e';

INT : DIGIT+ ;

fragment DIGIT : [0-9] ;

STRING : ('a'..'z')* ;

しかし、次の問題に直面しました。次の例があります。

d3:one3:twoe

また、パーサーは 2 番目の文字列を として認識せずtwo、 として認識しtwoeます。その結果、パーサーは で終わる辞書の終わりを認識しませんe

同様に、別の例では、最初の文字列がではなくd3:onel4:testeeであるため、認識されません。onelone

この場合、文法が正しかったとしても、どうすれば文法を修正できますか?

PS 文字列 a not は気にしない%x00-FFでください。この文法はドラフトであり、その他の軽微な誤りが含まれています。

4

0 に答える 0