加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – Marpa解析器似乎无法应对可选的第一个符号?

发布时间:2020-12-16 06:26:19 所属栏目:大数据 来源:网络整理
导读:我一直在掌握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 ::= RuleRule ::= optional
我一直在掌握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 1x{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)',-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)
Marpa版本2.068000

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

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

解决方法

在Marpa Scanless中,你的语法有两个层次:主要的高级语法,你可以归因于动作等等,以及低级别的lexing语法.它们是独立执行的(如果你使用传统的解析器/词法分析器,这是预期的,但是当你从正则表达式转到Marpa时会非常混乱).

现在在低级语法上,Marpa将您的输入识别为单个X,而不是“零然后是X”.但是,高级语法要求存在可选的符号.

最好的方法是在高级语法中使其成为可选:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读