树顶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]!。现在我可以完美地匹配数字和字符串。谢谢约格!