为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

维亚切斯拉夫·科瓦列夫(Viacheslav Kovalev)

我在玩荷兰芹。这是一个琐碎的解析器,它向我展示了一些非显而易见的行为。

require 'parslet'

class Parser < Parslet::Parser
  rule(:quote) { str('"') }
  rule(:escape_char) { str('\\') }
  def quoted(term)
    quote >> term >> quote
  end
  rule(:string) {
    quoted( (escape_char >> any | quote.absent? >> any).repeat.as(:string) )
  }
end

显然,它应该解析双列字符串。确实如此。但是以下结果对我来说似乎很奇怪。

Parser.new.string.parse '""'

此代码返回{:string=>[]}为什么会empty array出现,但为什么empty string呢?我想念什么?

我正在使用ruby 2.1.1parslet 1.6.1

奈杰尔·索恩(Nigel Thorne)

TL; DR; -通常将Parsletas应用于repeat捕获匹配项数组;除了所有匹配项均为原始字符串的特殊情况外,在这种情况下,它将所有匹配项连接起来并返回结果字符串。

在您的代码中,由于repeat不知道将捕获的类型,因此它返回空数组。

在此示例中...空数组似乎是正确的选择。

require 'parslet'

class Parser < Parslet::Parser
  rule(:quote) { str('"') }
  rule(:escape_char) { str('\\') }
  def quoted(term)
    quote >> term >> quote
  end
  rule(:string) {
    quoted( (escape_char >> any | quote.absent? >> any).as(:char).repeat.as(:string) )
  }
end

puts Parser.new.string.parse('""').inspect # => {:string=>[]}
puts Parser.new.string.parse('"test"').inspect 
    # =>  {:string=>[{:char=>"t"@1}, {:char=>"e"@2}, {:char=>"s"@3}, {:char=>"t"@4}]}

当子节点只是字符串时,Parslet会串联成一个字符串。如果集合中没有元素,则默认为空集合,而不是空字符串。

maybe 是不同的。

来自http://kschiess.github.io/parslet/parser.html#重复及其特殊情况

这些都映射到Parslet :: Atoms :: Repetition。请注意这对#maybe的一些扭曲:

str('foo')。maybe.as(:f).parse('')#=> {:f => nil}
str('foo')。repeat(0,1).as(:f)。 parse('')#=> {:f => []}

#maybe的'nil'值为nil。这符合foo。也许给我foo或根本不提供任何东西的直觉,不是空数组。随便你吧!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

来自分类Dev

为什么多维数组中的空字符串文字会衰减为空指针?

来自分类Dev

为什么char * foo()返回空字符串?

来自分类Dev

为什么 glGetProgramInfoLog 返回空字符串?

来自分类Dev

Bash:为什么不匹配时不返回空字符串

来自分类Dev

为什么我的函数在python中返回空字符串?

来自分类Dev

当有更多字符可用时,为什么takeWhile返回空字符串?

来自分类Dev

为什么java.util.Scanner.next()返回空字符串?

来自分类Dev

为什么process.MainWindowTitle返回空字符串?

来自分类Dev

为什么null语句ToString()返回空字符串?

来自分类Dev

为什么std :: string :: substr抛出异常而不是返回空字符串?

来自分类Dev

为什么String.match(/ \ d * /)返回空字符串?

来自分类Dev

为什么null语句ToString()返回空字符串?

来自分类Dev

为什么process.MainWindowTitle返回空字符串?

来自分类Dev

为什么python输入函数返回空字符串而不是等待用户输入?

来自分类Dev

PHP中的SaveXml返回空字符串

来自分类Dev

语言环境在Android中返回空字符串

来自分类Dev

JsonEncode在php中返回空字符串

来自分类Dev

DialogFragment中的EditText总是返回空字符串

来自分类Dev

ManyToManyField 在模板中返回空字符串

来自分类Dev

卷曲返回空字符串

来自分类Dev

Summernote返回空字符串

来自分类Dev

fgets()返回空字符串

来自分类Dev

NSubstitute返回空字符串

来自分类Dev

车把返回空字符串

来自分类Dev

.html()返回空字符串

来自分类Dev

Edittext返回空字符串

来自分类Dev

为什么在选择!=到字符串时,mySQL为什么不返回空值的行

来自分类Dev

为什么JS中的空数组加false会返回字符串?

Related 相关文章

  1. 1

    为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

  2. 2

    为什么多维数组中的空字符串文字会衰减为空指针?

  3. 3

    为什么char * foo()返回空字符串?

  4. 4

    为什么 glGetProgramInfoLog 返回空字符串?

  5. 5

    Bash:为什么不匹配时不返回空字符串

  6. 6

    为什么我的函数在python中返回空字符串?

  7. 7

    当有更多字符可用时,为什么takeWhile返回空字符串?

  8. 8

    为什么java.util.Scanner.next()返回空字符串?

  9. 9

    为什么process.MainWindowTitle返回空字符串?

  10. 10

    为什么null语句ToString()返回空字符串?

  11. 11

    为什么std :: string :: substr抛出异常而不是返回空字符串?

  12. 12

    为什么String.match(/ \ d * /)返回空字符串?

  13. 13

    为什么null语句ToString()返回空字符串?

  14. 14

    为什么process.MainWindowTitle返回空字符串?

  15. 15

    为什么python输入函数返回空字符串而不是等待用户输入?

  16. 16

    PHP中的SaveXml返回空字符串

  17. 17

    语言环境在Android中返回空字符串

  18. 18

    JsonEncode在php中返回空字符串

  19. 19

    DialogFragment中的EditText总是返回空字符串

  20. 20

    ManyToManyField 在模板中返回空字符串

  21. 21

    卷曲返回空字符串

  22. 22

    Summernote返回空字符串

  23. 23

    fgets()返回空字符串

  24. 24

    NSubstitute返回空字符串

  25. 25

    车把返回空字符串

  26. 26

    .html()返回空字符串

  27. 27

    Edittext返回空字符串

  28. 28

    为什么在选择!=到字符串时,mySQL为什么不返回空值的行

  29. 29

    为什么JS中的空数组加false会返回字符串?

热门标签

归档