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

Perl 使用Marpa::R2实现的解析器中的异常处理,perl,error-handling,exception-handling,syntax-error,marpa,Perl,Error Handling,Exception Handling,Syntax Error,Marpa,我已经使用Marpa::R2实现了一个解析器。代码如下所示: 我在一个.t文件中有大量的测试用例,我运行它来测试我的解析器。因此,如果在任何输入表达式中出现任何异常,测试不应该在中间停止,它应该为出现错误的表达式提供适当的错误消息(使用异常处理),其余的测试用例应该运行 我想在这个解析器中进行异常处理。如果在标记输入表达式时出现任何类型的异常,我希望向用户显示适当的消息,说明位置、字符串等或任何其他详细信息,以显示错误的来源。请帮忙 use strict; use Marpa::R2; use

我已经使用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\")";
使用严格;
使用Marpa::R2;
使用数据::转储程序;
my$grammar=Marpa::R2::Scanless::G->new({
默认_action=>“[values]”,
source=>\(新({grammar=>$grammar});
打印“正在尝试分析:\n$input\n\n”;
$recce->read(\$input);
我的$value\u ref=${$recce->value};
打印“输出:\n”。转储程序($value\u ref);
my$input4=“func”(“foo\”);
我希望进行适当的错误处理,如:


我不知道如何把所有这些东西放在适当的位置。

将可能在以下情况下失败的行包装起来:

来自Marpa的完整错误消息将出现在
$\uuu
中,它是一个带有换行符的长字符串。我选择将其打印到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.

如果需要,您可以将其重新格式化,以便更好地显示给用户。

@daxim您可以为此提供帮助吗?您是否尝试在
$recce->read()周围放置
eval
call?@HåkonHægland您能举个例子吗,是的,我尝试过进行评估,但是我如何告诉用户错误是这个,而这个位置的这个特殊标记导致了这个错误?您能使用存储在
$@
中的异常字符串吗?它应该包含行和列的编号。如果出现类似这样的错误怎么办s foo&;这里的问题是在&;之后应该有一个字符串,但这种类型的表达式不会导致行号和列号。排序错误;在这种情况下,输入表达式本身是错误的。我如何投射这种错误?我想要正确的显示方式:直到字符串被成功解析,所有类似的东西我都得到了一个p谈论错误报告的时代:;但我不知道如何把这些东西放在适当的位置。
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.