引用符とエスケープを解析するとき (cf.空の文字列リテラルを解析するときに、 Parslet (in Ruby) が空の配列を返すのはなぜですか? )(escape_char.absent? >> str('"')).absent? >> any
そこにいる。
require 'parslet'
require 'rspec'
require 'parslet/rig/rspec'
require 'parslet/convenience'
class Parser < Parslet::Parser
root(:quote)
rule :quote do
quote >> text >> quote
end
rule :text do
(quote.absent? >> any).repeat
end
rule :quote do
escape_char.absent? >> str('"')
end
rule :escape_char do
str('\\')
end
end
describe Parser do
it 'should parse text in quotes' do
is_expected.to parse('"hello"')
end
it 'should parse text in quotes with escaped quote' do
is_expected.to parse('"foo\"bar"')
end
it 'should parse text in quotes with trailing escaped quote' do
is_expected.to parse('"text\""')
end
end
上記のリンク先の投稿で既に説明されているように、これを解決する方法にはあまり興味がありませんが、この動作を理解したいだけです。最初は直感に反するように思えますが、これには十分な理由があると確信しています。