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 a> 'X'<optional a> ~ a *a ~ 'a'END_OF_GRAMMARmy $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: XMarpa::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)',-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'总结
以上是内存溢出为你收集整理的perl – Marpa解析器似乎无法应对可选的第一个符号?全部内容,希望文章能够帮你解决perl – Marpa解析器似乎无法应对可选的第一个符号?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)