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



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

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

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

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$inputnn";
$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

我不知道如何把所有这些东西放到位。

包装异常处理程序中可能失败的行:

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: "fos
* The error was at line 1, column 5, and at character 0x006f 'o', ...
* here: o"
Marpa::R2 exception at so49932329.pl line 41.

如果需要,可以重新格式化它,以便用户看起来更好。

相关内容

  • 没有找到相关文章

最新更新