首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Marpa::R2实现的解析器中的异常处理

使用Marpa::R2实现的解析器中的异常处理
EN

Stack Overflow用户
提问于 2018-04-20 09:01:00
回答 1查看 127关注 0票数 4

我已经使用Marpa::R2实现了一个解析器。代码如下所示:

我在一个.t文件中有大量测试用例,我运行该文件来测试我的解析器。因此,如果在任何输入表达式中出现任何异常,测试不应该在mid中停止,它应该为已经给出错误的表达式提供适当的错误消息(使用异常处理),并且应该运行其余的测试用例。

我想在这个解析器中进行异常处理。如果在标记输入表达式时出现任何类型的异常,我希望向用户显示适当的消息,说明位置、字符串等或任何更多细节,以显示错误出现的位置。请帮帮忙。

代码语言:javascript
复制
use strict;
use Marpa::R2;
use Data::Dumper;

my $grammar = Marpa::R2::Scanless::G->new({
    default_action => '[values]',
    source => \(<<'END_OF_SOURCE'),
    lexeme default = latm => 1

:start ::= expression

expression ::= expression OP expression
expression ::= expression COMMA expression
expression ::= func LPAREN PARAM RPAREN
expression ::= PARAM
PARAM ::= STRING | REGEX_STRING
REGEX_STRING ::= '"' QUOTED_STRING '"'

:discard    ~ sp
sp          ~ [\s]+

COMMA                      ~ [,]
STRING                     ~ [^ \/\(\),&:\"~]+
QUOTED_STRING              ~ [^ ,&:\"~]+
OP                         ~ ' - ' | '&'
LPAREN                     ~ '('
RPAREN                     ~ ')'
func                       ~ 'func'

END_OF_SOURCE
});

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

my $input4 = "func(\"foo\")";

我想做一些适当的错误处理,比如:http://blogs.perl.org/users/jeffrey_kegler/2012/10/a-marpa-dsl-tutorial-error-reporting-made-easy.html

我不知道怎么把这些东西放到合适的位置。

EN

回答 1

Stack Overflow用户

发布于 2018-04-20 18:47:17

对在exception handler中可能失败的行进行换行

代码语言:javascript
复制
use Try::Tiny;
⋮
try {
    $recce->read(\$input);
    my $value_ref = ${$recce->value};
    print "Output:\n".Dumper($value_ref);
} catch {
    warn $_;
};

来自Marpa的完整错误消息将是$_格式的,它是一个包含换行符的单个长字符串。我选择使用warn将其打印到STDOUT,程序将继续运行。正如您在下面的示例错误消息中看到的,它包含解析失败的位置:

代码语言:javascript
复制
Error in SLIF parse: No lexeme found at line 1, column 5
* String before error: "fo\s
* The error was at line 1, column 5, and at character 0x006f 'o', ...
* here: o"
Marpa::R2 exception at so49932329.pl line 41.

如果需要,您可以重新格式化它,使其对用户更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49932329

复制
相关文章

相似问题

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