5

私は 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)
Marpa バージョン 2.068000

(まだ試していない新しい Marpa 2.069 があるようです)

これは私の文法が間違っているのでしょうか?

4

1 に答える 1

6

Marpa Scanless では、文法には 2 つのレベルがあります。アクションなどを属性付けできるメインの高レベル文法と、低レベルの語彙文法です。それらは独立して実行されます (これは、従来のパーサー/レクサーを使用している場合に予想されますが、正規表現から Marpa に移行すると非常に混乱します)。

低レベルの文法では、Marpa は入力をX「ゼロaの後に」ではなく、単一の として認識しますX。ただし、高水準の文法では、シンボルが存在する必要があります。optional a

これを回避する最善の方法はa、高レベルの文法でオプションにすることです。

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

<many a> ~ a*  # would work the same here with "a+"
a ~ 'a'
于 2013-09-05T11:19:51.530 に答える