Ho una grammatica Marpa piuttosto grande (per l'analisi di XPath) e ho riscontrato un problema con la tokenizzazione. Ho creato un esempio di rottura minimo di seguito:Tokenizzazione errata con Marpa
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);
Questo script stampa il seguente:
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
Voglio l'ingresso da token come [Child] [DoubleColon] [word]
. Come mostra la traccia terminale, solo un carattere dei due punti viene letto ed elaborato. Sembra che proverà a tokenizzare l'inizio della stringa come [word] [':'] [word]
e fallisce parzialmente. L'errore non verrà più generato se si rimuove la riga 10 della grammatica (| word ':' word
).
Ho provato a creare una priorità per DoubleColon (:lexeme ~ <DoubleColon> priority > 1
), ma non ha funzionato. Qualcuno può dirmi cosa fare per fare in modo che questa grammatica analizzi correttamente la stringa di input? Deve ancora essere in grado di analizzare
Se vuoi testare questo con la correzione, prova il Marpa-R2 appena caricato 2.059_000: https://metacpan.org/release/JKEGL/Marpa-R2-2.059_000 –
Grande! Non so perché, ma ho avuto problemi a installarlo a mano ('perl Build.PL', ecc.), Ma l'installazione con' cpan' funzionava bene. Ora ho un parser XPath funzionante. Woohoo! –
Meraviglioso! La correzione entrerà in una versione CPAN indicizzata (completa, non dello sviluppatore) in un paio di giorni. –