#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use Marpa::R2;
my $dsl = << '__DSL__';
:default ::= action => ::first
lexeme default = latm => 1
List ::= Token action => [value]
| Token space List action => list
Token ::= Naked
| Quoted
| Quoted Token action => concat
| Naked Quoted action => concat
| Naked Quoted Token action => concat
Quoted ::= ('"') InQ ('"')
InQ ::= CharQ InQ action => concat
| CharQ
CharQ ::= nonq
| backslash quote action => second
Naked ::= CharO+ action => concat
CharO ::= nonqs
| backslash quote action => second
| backslash single_space action => second
backslash ~ [\\]
quote ~ '"'
single_space ~ [\s]
nonq ~ [^"\\]+
nonqs ~ [^"\s\\]+
space ~ [\s]+
__DSL__
sub concat { shift; join q(), @_ }
sub list { [ $_[1], @{ $_[3] } ] }
sub second { $_[2] }
my $grammar = 'Marpa::R2::Scanless::G'->new({ source => \$dsl });
for my $string (
'"ab" "cd"',
'"ef" "gh ij"',
'kl mn',
'op "qr st"',
'"uv \"wx" yz',
'AB\ CD',
'EF"GH"',
'"IJ""KL""MN"',
'OP"QR"\ "ST"UV"WX YZ"\"ABC"DEF"\"GHI\"',
'"abc\ def"',
'"ghi "jkl"',
'mno "pqr stu',
) {
my $v;
eval {
$v = $grammar->parse(\$string, 'main');
1 } or warn "invalid $string\n";
say join '|', @$$v if $v;
}
####
ab|cd
ef|gh ij
kl|mn
op|qr st
uv "wx|yz
AB CD
EFGH
IJKLMN
OPQR STUVWX YZ"ABCDEF"GHI"
invalid "abc\ def"
invalid "ghi "jkl"
invalid mno "pqr stu
##
##
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord
}map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,