1

我尝试使用 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,这个语法是草稿并且包含其他小错误。

4

0 回答 0