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.
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 –
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! –
Wunderbar! Der Fix wird in ein paar Tagen in eine indexierte CPAN-Version (ohne Entwickler) gehen. –