2013-06-20 7 views
5

Ich habe eine ziemlich große Marpa-Grammatik (zum Parsen von XPath), und ich stieß auf ein Problem mit Tokenization. Ich habe ein minimaler Bruch Beispiel unten:Falsche Tokenisierung mit 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); 

Dieses Skript druckt die folgenden:

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 

Ich möchte die Eingabe als [Child] [DoubleColon] [word] Token versehen werden. Wie der Terminal-Trace zeigt, wird nur ein Doppelpunkt gelesen und verarbeitet. Es scheint, dass es versucht, den Anfang des Strings als [word] [':'] [word] zu token und auf halbem Wege fehlschlägt. Der Fehler wird nicht mehr ausgelöst, wenn Sie Zeile 10 der Grammatik (| word ':' word) entfernen.

Ich habe versucht, eine Priorität für DoubleColon (:lexeme ~ <DoubleColon> priority > 1), aber das hat nicht funktioniert. Kann mir jemand sagen, was zu tun ist, damit diese Grammatik die Eingabe richtig analysiert? Es muss noch in der Lage sein, child::ns:book usw. zu analysieren.

+0

Wenn Sie dies mit dem Update testen möchten, versuchen Sie die soeben hochgeladene Marpa-R2 2.059_000: https://metacpan.org/release/JKEGL/Marpa-R2-2.059_000 –

+0

Großartig! Ich weiß nicht warum, aber ich hatte Probleme mit der Installation von Hand ('perl Build.PL', etc.), aber die Installation mit' cpan' funktionierte einwandfrei. Jetzt habe ich einen funktionierenden XPath Parser. Woohoo! –

+0

Wunderbar! Der Fix wird in ein paar Tagen in eine indexierte CPAN-Version (ohne Entwickler) gehen. –

Antwort

7

Dies scheint ein Fehler in der aktuellen Version 2.058 von Marpa :: R2 zu sein. Ich entschuldige mich und danke Ihnen für die sorgfältige Aufarbeitung des Problems.

Ich habe eine Lösung, die die Testsuite besteht, und ich werde in Kürze eine neue Version bekommen.

+1

Ja! Ich danke dir sehr. –

Verwandte Themen