gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:01:08 24 4
gpt4 key购买 nike

我已经定义了使用 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

ruby :

parser = SimpleParser.new
parser.parse('123abc wer') # => nil

我希望解析器返回字符串节点,但看起来解析器无法理解 输入。任何想法将不胜感激。

最佳答案

在 Treetop(实际上是一般的 PEG)中,选择运算符是有序的,这与大多数其他解析形式不同。

所以,在

rule value
number / string
end

你是在告诉 Treetop 你更喜欢 number 而不是 string

您的输入以 1 开头,匹配两者 numberstring(通过 word),但是你告诉 Treetop 更喜欢 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"

关于ruby - Treetop ruby​​ 解析器 - 无法解析 Ordered Choice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4514663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com