Разобрать строку в двойных кавычках, используя perl MARPA:: R2

Я реализую парсер с помощью MARPA::R2.

у меня есть G1 rule лайк:

PARAM ::= STRING | REGEX_STRING

а также L0 rule лайк:

STRING                     ~ [^ \/\(\),&:\"~]+   -----> works fine
REGEX_STRING               ~ [\"([^:]*?)\"] -----> doesn't work

С помощью REGEX_STRINGЯ пытаюсь разобрать строки, заключенные в двойные кавычки, но что-то не так с регулярным выражением. Кроме того, я хочу удалить двойные кавычки и хранить содержимое только между кавычками.

Итак, если я приведу ввод с помощью кода ниже:

my $recce = Marpa::R2::Scanless::R->new({grammar => $grammar});
my $input = "\"foo\"";  --> here, it should parse "foo" and give me foo.
print "Trying to parse:\n$input\n\n";
$recce->read(\$input);
my $value_ref = ${$recce->value};
print "Output:\n".Dumper($value_ref);

Другие примеры: "bar123", "foo(123)" и т. Д.

2 ответа

Решение
use 5.026;
use strictures;
use Data::Dumper qw(Dumper);
use Marpa::R2 qw();

my $grammar = Marpa::R2::Scanless::G->new({
    bless_package => 'parsetree',
    source        => \<<'',
:default ::= action => [values] bless => ::lhs
lexeme default = action => [ start, length, value ] bless => ::name latm => 1
:start ::= expression
expression ::= funcname params
params ::= epsilon | lparen param rparen
epsilon ::=
funcname ~ [a-z0-9]+
lparen ~ '('
param ::= unquotedparam | quotedparam
unquotedparam ::= [a-z0-9]+
quotedparam ::= '"' stringliteral '"'
stringliteral ~ [^"]+
rparen ~ ')'

});
say $grammar->show_rules;

for my $input (qw[
    func("foo")
    bar123
    foo(123)
]) {
    my $r = Marpa::R2::Scanless::R->new({
        grammar => $grammar,
        trace_terminals => 1
    });
    $r->read(\$input);
    say Dumper $r->value;
}

Строка в кавычках: не забудьте исключить \"себя из строки 'body'

\"([^\"]*)\"

Строка в кавычках с некоторыми запрещенными символами (например, ':')

\"([^\":]*)\"
Другие вопросы по тегам