gpt4 book ai didi

ruby - 欧芹字直到出现分隔符

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

我刚开始使用 ruby​​ 和 parslet,所以这对其他人来说可能是显而易见的(希望如此)。

我想在不使用分隔符 (^) 之前获取所有单词

以下规则有效(但消耗分隔符),结果为 {:wrd=>"otherthings"@0, :delim=>"^"@11}

require 'parslet'    
class Mini < Parslet::Parser
rule(:word) { match('[a-zA-Z]').repeat}
rule(:delimeter) { str('^') }
rule(:othercontent) { word.as(:wrd) >> delimeter.as(:delim) }
root(:othercontent)
end
puts Mini.new.parse("otherthings^")

我正在尝试使用“礼物?”,

require 'parslet' 
class Mini < Parslet::Parser
rule(:word) { match('[a-zA-Z]').repeat}
rule(:delimeter) { str('^') }
rule(:othercontent) { word.as(:wrd) >> delimeter.present? }
root(:othercontent)
end
puts Mini.new.parse("otherthings^")

但这会引发异常:

Failed to match sequence (wrd:WORD &DELIMETER) at line 1 char 12. (Parslet::ParseFailed)

在稍后阶段,我想检查分隔符右侧的单词以构建更复杂的语法,这就是我不想使用分隔符的原因。

我正在使用 parslet 1.5.0。

感谢您的帮助!

最佳答案

长话短说;如果您关心“^”之前的内容,您应该先解析它。

---更长的答案---

解析器总是会消耗所有的文本。如果它不能消耗所有内容,那么文档就没有被语法完全描述。与其将其视为对您的文本执行“拆分”的东西……不如将其视为消耗文本流的智能状态机。

所以...因为您的完整语法需要消耗所有文档...在开发解析器时,您不能让它解析一部分而留下其余部分。您希望它将您的文档转换为一棵树,以便您可以将其操作为最终版本。

如果您真的想只使用定界符之前的所有文本,那么您可以这样做...

假设我要解析以“^”分隔的事物列表。

我可以有以下规则

rule(:thing) { (str("^").absent? >> any).repeat(1) }  # anything that's not a ^
rule(:list) { thing >> ( str("^") >> thing).repeat(0) } #^ separated list of things

这将按如下方式工作

parse("thing1^thing2") #=> "thing1^thing2"
parse("thing1") #=> "thing1"
parse("thing1^") #=> ERROR ... nothing after the ^ there should be a 'thing'

这意味着 list 将匹配不以“^”结尾或开头的字符串。然而,为了有用,我需要提取出带有“as”关键字的值的位

rule(:thing) { (str("^").absent? >> any).repeat(1).as(:thing) }
rule(:list) { thing >> ( str("^") >> thing).repeat(0) }

现在当 list 匹配一个字符串时,我得到一个“事物”的哈希数组。

parse("thing1^thing2") #=> [ {:thing=>"thing1"@0} , {:thing=>"thing2"@7} ] 

但实际上,您可能关心“事物”是什么……不只是任何东西都会去那里。

在那种情况下……您应该首先定义这些规则……因为您不想使用解析器按“^”拆分然后重新解析字符串以计算出它们的构成。

例如:

parse("6 + 4 ^ 2") 
# => [ {:thing=>"6 + 4 "@0}, {:thing=>" 2"@7} ]

而且我可能想忽略“事物”周围的空白,我可能想分别处理 6、+ 和 4。当我这样做时,我将不得不放弃我的“所有不是'^'”的规则。

关于ruby - 欧芹字直到出现分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23125235/

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