Неправильный токенизация с Marpa

У меня довольно большая грамматика Марпы (для разбора XPath), и я столкнулся с проблемой с токенизацией. Я создал минимальный пример взлома ниже:

use strict;
use warnings;
use Marpa::R2;

my $grammar = Marpa::R2::Scanless::G->new(
    {
        source => \(<<'END_OF_SOURCE'),
            :default ::= action => ::array
            :start ::= Start

            Start  ::= Child DoubleColon Token

            DoubleColon ~ '::'
            Child ~ 'child'
            Token ~
                word
                | word ':' word
            word ~ [\w]+

END_OF_SOURCE
    }
);
my $reader = Marpa::R2::Scanless::R->new(
    {
        grammar => $grammar,
        trace_terminals => 1,
    }
);

my $input = 'child::book';
$reader->read(\$input);

Этот скрипт печатает следующее:

Registering character U+0063 as symbol 10: [[\w]]
Registering character U+0063 as symbol 3: [[c]]
Registering character U+0068 as symbol 10: [[\w]]
Registering character U+0068 as symbol 4: [[h]]
Registering character U+0069 as symbol 10: [[\w]]
Registering character U+0069 as symbol 5: [[i]]
Registering character U+006c as symbol 10: [[\w]]
Registering character U+006c as symbol 6: [[l]]
Registering character U+0064 as symbol 10: [[\w]]
Registering character U+0064 as symbol 7: [[d]]
Registering character U+003a as symbol 1: [[\:]]
Rejected lexeme @0-5: Token; value="child"
Accepted lexeme @0-5: Child; value="child"
Registering character U+0062 as symbol 10: [[\w]]
Error in SLIF G1 read: No lexeme found at position 6
* String before error: child::
* The error  was at line 1, column 8, and at character 0x0062 'b', ...
* here: book

Я хочу, чтобы вход был маркирован как [Child] [DoubleColon] [word], Как показывает трассировка терминала, только один символ двоеточия читается и обрабатывается. Кажется, что он пытается токенизировать начало строки как [word] [':'] [word] и терпит неудачу на полпути. Ошибка больше не будет сброшена, если вы удалите строку 10 грамматики (| word ':' word).

Я попытался создать приоритет для DoubleColon (:lexeme ~ <DoubleColon> priority > 1), но это не сработало. Может кто-нибудь сказать мне, что нужно сделать, чтобы эта грамматика правильно анализировала входную строку? Все еще нужно уметь разбирать child::ns:book, так далее.

1 ответ

Решение

Это похоже на ошибку в текущем выпуске 2.058, Marpa::R2. Приношу свои извинения и спасибо за тщательное описание проблемы.

У меня есть исправление, которое проходит тестовый набор, и я скоро получу новую версию.

Другие вопросы по тегам