首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MARPA ::R2 perl解析双引号字符串

使用MARPA ::R2 perl解析双引号字符串
EN

Stack Overflow用户
提问于 2018-03-20 23:58:19
回答 1查看 139关注 0票数 2

我正在使用MARPA::R2实现一个解析器。

我有一个G1 rule,类似于:

代码语言:javascript
复制
PARAM ::= STRING | REGEX_STRING

L0 rule喜欢:

代码语言:javascript
复制
STRING                     ~ [^ \/\(\),&:\"~]+   -----> works fine
REGEX_STRING               ~ [\"([^:]*?)\"] -----> doesn't work

使用REGEX_STRING,我试图解析用双引号括起来的字符串,但是正则表达式有问题。另外,我希望删除双引号,并且只保留引号之间的内容。

因此,如果我使用以下代码提供输入:

代码语言:javascript
复制
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)”等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-21 09:03:24

代码语言:javascript
复制
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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49396033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档