2010-12-22 76 views
1

我已經定義了簡單的語法來解析字符串和數字使用樹梢如下。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 

我希望解析器返回串節點,但看起來像解析器看不慣輸入。任何想法將不勝感激。

回答

4

在Treetop(和實際上一般的PEGs)中,選擇運算符是,它與大多數其他解析形式不同,它的順序是

所以,在

rule value 
    number/string 
end 

你告訴樹頂,你喜歡numberstring

您的輸入與1開始,它匹配numberstring(通過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" 
+0

謝謝Jörg, 是的,你是對的。我更願意將數字與值規則中的字符串進行匹配。我怎麼能「允許價值規則匹配多次」?爲了得到上面的例子工作。 – lchanmann 2010-12-23 00:36:43