树顶ruby解析器-无法分析有序选择

树顶ruby解析器-无法分析有序选择,ruby,rubygems,treetop,peg,Ruby,Rubygems,Treetop,Peg,我已经定义了使用树顶解析字符串和数字的简单语法,如下所示 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]*

我已经定义了使用树顶解析字符串和数字的简单语法,如下所示

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
红宝石:


我希望解析器返回字符串节点,但看起来解析器无法理解输入。任何想法都将受到欢迎。

在Treetop和PEGs中,与大多数其他解析形式不同,通常情况下,选择运算符是有序的

那么在

rule value
  number / string
end
你在告诉树梢你更喜欢数字而不是字符串

您的输入以1开头,它通过word匹配数字和字符串,但您告诉Treetop更喜欢数字解释,所以它将其解析为数字。当涉及到输入中的a时,它没有更多的规则可应用,因此它不返回nil,因为在Treetop中,不使用整个输入流是一个错误

如果您只是颠倒选择的顺序,则整个输入将被解释为字符串而不是数字:

或者,您可以保持顺序不变,但允许多次匹配值规则。插入新的顶级规则,如下所示:

rule values
  value+
end
rule value
  (number / string)+
end
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"
或按如下方式修改值规则:

rule values
  value+
end
rule value
  (number / string)+
end
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"
这将给你一个大致如下的AST:

rule values
  value+
end
rule value
  (number / string)+
end
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"

一般来说,在Treetop和PEGs中,实际上choice操作符是有序的,这与大多数其他解析形式不同

那么在

rule value
  number / string
end
你在告诉树梢你更喜欢数字而不是字符串

您的输入以1开头,它通过word匹配数字和字符串,但您告诉Treetop更喜欢数字解释,所以它将其解析为数字。当涉及到输入中的a时,它没有更多的规则可应用,因此它不返回nil,因为在Treetop中,不使用整个输入流是一个错误

如果您只是颠倒选择的顺序,则整个输入将被解释为字符串而不是数字:

或者,您可以保持顺序不变,但允许多次匹配值规则。插入新的顶级规则,如下所示:

rule values
  value+
end
rule value
  (number / string)+
end
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"
或按如下方式修改值规则:

rule values
  value+
end
rule value
  (number / string)+
end
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"
这将给你一个大致如下的AST:

rule values
  value+
end
rule value
  (number / string)+
end
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"

谢谢约格,是的,你是对的。我更喜欢在值规则中将数字与字符串匹配。我如何允许值规则被多次匹配?为了使上面的示例正常工作。@mann:Treetop中的重复运算符是+和*,其含义与Regexp中的相同。有关详细信息,请参见编辑。@Clifford on Treetop Development google group建议使用!。要匹配EOF,请将数字规则更改为[1-9][0-9]!。现在我可以完美地匹配数字和字符串。谢谢约格!谢谢约格,是的,你是对的。我更喜欢在值规则中将数字与字符串匹配。我如何允许值规则被多次匹配?为了使上面的示例正常工作。@mann:Treetop中的重复运算符是+和*,其含义与Regexp中的相同。有关详细信息,请参见编辑。@Clifford on Treetop Development google group建议使用!。要匹配EOF,请将数字规则更改为[1-9][0-9]!。现在我可以完美地匹配数字和字符串。谢谢约格!