我尝试使用 ANTLR4 从 .torent-file 解析元信息。
元信息文件中的所有数据都经过编码。编码规范:
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
, not one
。
我怎样才能修正我的语法,不管这种情况是正确的?
PS 别介意字符串 a not %x00-FF
,这个语法是草稿并且包含其他小错误。