我已经使用 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$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
我不知道如何将所有这些东西放在适当的位置。