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
であるため、認識されません。onel
one
この場合、文法が正しかったとしても、どうすれば文法を修正できますか?
PS 文字列 a not は気にしない%x00-FF
でください。この文法はドラフトであり、その他の軽微な誤りが含まれています。