在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