在Treetop(和实际上一般的PEGs)中,选择运算符是,它与大多数其他解析形式不同,它的顺序是。
所以,在
rule value
number/string
end
你告诉树顶,你喜欢number
了string
。
您的输入与1
开始,它匹配都number
和string
(通过word
),但你告诉树顶更喜欢number
解释,所以将其解析为number
。当涉及到输入中的a
时,它没有更多的规则可以应用,因此它不会返回任何内容(nil
),因为在Treetop中,不消耗整个输入流是错误的。
如果单纯反向选择的顺序,整个投入将解释为一个string
代替number
:
SyntaxNode+String0 offset=0, "123abc wer" (word,space,string):
SyntaxNode offset=0, "123abc":
SyntaxNode offset=0, "1"
SyntaxNode offset=1, "2"
SyntaxNode offset=2, "3"
SyntaxNode offset=3, "a"
SyntaxNode offset=4, "b"
SyntaxNode offset=5, "c"
SyntaxNode offset=6, " ":
SyntaxNode offset=6, " "
SyntaxNode offset=7, "wer":
SyntaxNode offset=7, "w"
SyntaxNode offset=8, "e"
SyntaxNode offset=9, "r"
或者,你可以保持这个顺序,因为它是,但允许value
规则匹配多次。请插入这样一个新的顶级规则:
rule values
value+
end
或修改value
规则是这样的:
rule value
(number/string)+
end
,这将给你一个AST大致是这样的:
SyntaxNode offset=0, "123abc wer":
SyntaxNode+Number0 offset=0, "123":
SyntaxNode offset=0, "1"
SyntaxNode offset=1, "23":
SyntaxNode offset=1, "2"
SyntaxNode offset=2, "3"
SyntaxNode+String0 offset=3, "abc wer" (word,space,string):
SyntaxNode offset=3, "abc":
SyntaxNode offset=3, "a"
SyntaxNode offset=4, "b"
SyntaxNode offset=5, "c"
SyntaxNode offset=6, " ":
SyntaxNode offset=6, " "
SyntaxNode offset=7, "wer":
SyntaxNode offset=7, "w"
SyntaxNode offset=8, "e"
SyntaxNode offset=9, "r"
谢谢Jörg, 是的,你是对的。我更愿意将数字与值规则中的字符串进行匹配。我怎么能“允许价值规则匹配多次”?为了得到上面的例子工作。 – lchanmann 2010-12-23 00:36:43