[英]Treetop ruby parser - could not parse Ordered Choice
我已經定義了使用Treetop解析字符串和數字的簡單語法,如下所示。
grammar Simple
rule value
number / string
end
rule string
word space string
/
word
end
rule word
[0-9a-zA-Z]+
end
rule number
[1-9] [0-9]*
end
rule space
' '+
end
end
紅寶石:
parser = SimpleParser.new
parser.parse('123abc wer') # => nil
我希望解析器返回字符串節點,但看起來解析器無法理解輸入。 任何想法將不勝感激。
在Treetop(實際上是PEG)中,選擇運算符是有序的 ,與大多數其他解析形式不同。
所以,在
rule value
number / string
end
你告訴Treetop你喜歡 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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.