我已经使用Marpa::R2实现了一个解析器。代码如下所示:
我在一个.t文件中有大量测试用例,我运行该文件来测试我的解析器。因此,如果在任何输入表达式中出现任何异常,测试不应该在mid中停止,它应该为已经给出错误的表达式提供适当的错误消息(使用异常处理),并且应该运行其余的测试用例。
我想在这个解析器中进行异常处理。如果在标记输入表达式时出现任何类型的异常,我希望向用户显示适当的消息,说明位置、字符串等或任何更多细节,以显示错误出现的位置。请帮帮忙。
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
我不知道怎么把这些东西放到合适的位置。
发布于 2018-04-20 18:47:17
对在exception handler中可能失败的行进行换行
use Try::Tiny;
⋮
try {
$recce->read(\$input);
my $value_ref = ${$recce->value};
print "Output:\n".Dumper($value_ref);
} catch {
warn $_;
};来自Marpa的完整错误消息将是$_格式的,它是一个包含换行符的单个长字符串。我选择使用warn将其打印到STDOUT,程序将继续运行。正如您在下面的示例错误消息中看到的,它包含解析失败的位置:
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.如果需要,您可以重新格式化它,使其对用户更好。
https://stackoverflow.com/questions/49932329
复制相似问题