gpt4 book ai didi

perl - Marpa 解析器似乎无法处理可选的第一个符号?

转载 作者:行者123 更新时间:2023-12-04 18:43:50 27 4
gpt4 key购买 nike

我一直在掌握 Marpa 解析器,但在第一个符号是可选的时遇到了问题。下面是一个例子:

use strict;
use warnings;
use 5.10.0;

use Marpa::R2;
use Data::Dump;

my $grammar = Marpa::R2::Scanless::G->new({source => \<<'END_OF_GRAMMAR'});
:start ::= Rule
Rule ::= <optional a> 'X'
<optional a> ~ a *
a ~ 'a'
END_OF_GRAMMAR

my $recce = Marpa::R2::Scanless::R->new({grammar => $grammar});
dd $recce->read(\"X");

当我运行它时,我收到以下错误:
Error in SLIF parse: No lexemes accepted at line 1, column 1
* String before error:
* The error was at line 1, column 1, and at character 0x0058 'X', ...
* here: X
Marpa::R2 exception at small.pl line 20
at /usr/local/lib/perl/5.14.2/Marpa/R2.pm line 126
Marpa::R2::exception('Error in SLIF parse: No lexemes accepted at line 1, column 1\x{a}...') called at /usr/local/lib/perl/5.14.2/Marpa/R2/Scanless.pm line 1545
Marpa::R2::Scanless::R::read_problem('Marpa::R2::Scanless::R=ARRAY(0x95cbfd0)', 'no lexemes accepted') called at /usr/local/lib/perl/5.14.2/Marpa/R2/Scanless.pm line 1345
Marpa::R2::Scanless::R::resume('Marpa::R2::Scanless::R=ARRAY(0x95cbfd0)', 0, -1) called at /usr/local/lib/perl/5.14.2/Marpa/R2/Scanless.pm line 926
Marpa::R2::Scanless::R::read('Marpa::R2::Scanless::R=ARRAY(0x95cbfd0)', 'SCALAR(0x95aeb1c)') called at small.pl line 20

Perl 版本 5.14.2 (debian wheezy)
马尔巴版本 2.068000

(我看到有一个我还没有尝试过的全新 Marpa 2.069)

这是我在语法上做错了吗?

最佳答案

在 Marpa Scanless 中,您的语法有两个级别:主要的高级语法,您可以在其中对 Action 等进行归因,以及低级词法语法。它们是独立执行的(如果您使用了传统的解析器/词法分析器,这是意料之中的,但是当您从正则表达式转为 Marpa 时会非常困惑)。

现在在低级语法上,Marpa 将您的输入识别为单个 X , 不是“零 a s 然后是 X ”。但是,高级语法需要 optional a要存在的符号。

最好的方法是制作 a高级语法中的可选:

<optional a> ::= <many a>
<optional a> ::= # empty

<many a> ~ a* # would work the same here with "a+"
a ~ 'a'

关于perl - Marpa 解析器似乎无法处理可选的第一个符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18634749/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com