我尝试使用ANTLR4从.torent文件解析metainfo。
元信息文件中的所有数据均为bencoded。 bencoding的规范:
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
解析器无法将第二个字符串识别为two
,但识别为twoe
。因此,解析器无法识别字典的结尾,该字典以e
结束。
同样,另一个示例d3:onel4:testee
无法识别,因为第一个字符串是onel
,而不是one
。
如何修复我的语法,无论它对于这种情况是否正确?
P.S。别介意字符串a %x00-FF
,这个语法是草稿,包含其他一些小错误。