簡體   English   中英

Treetop ruby​​解析器 - 無法解析Ordered Choice

[英]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 ,這符合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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM