2013-06-20 9 views
5

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

+0

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 –

+0

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! –

+0

Meraviglioso! La correzione entrerà in una versione CPAN indicizzata (completa, non dello sviluppatore) in un paio di giorni. –

risposta

7

Questo sembra essere un bug nella versione corrente, 2.058, di Marpa :: R2. Le mie scuse e grazie per l'attenta revisione del problema.

Ho una correzione, che supera la suite di test e riceverò una nuova versione a breve.

+1

Sì! Grazie mille. –

Problemi correlati