私は(XPathを解析するための)かなり大きなMarpa文法を持っています。トークン化に問題がありました。私は以下の最小限の破壊の例を作成しました: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);
このスクリプトは、次のように出力されます
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]
としてトークン化することにしたいです。ターミナルトレースが示すように、1つのコロン文字のみが読み込まれ、処理されます。文字列の先頭をトークン化して、[word] [':'] [word]
とし、途中で失敗するようです。文法の10行目を削除するとエラーは発生しなくなりました(| word ':' word
)。
DoubleColon(:lexeme ~ <DoubleColon> priority > 1
)の優先度を作成しようとしましたが、これが機能しませんでした。誰かがこの文法を正しく入力文字列を解析するために何をすべきか教えてもらえますか? child::ns:book
などを解析できる必要があります。
これを修正してテストしたい場合は、Just-Uploaded Marpa-R2 2.059_000を試してください:https://metacpan.org/release/JKEGL/Marpa-R2-2.059_000 –
素晴らしい!なぜか分かりませんが手でインストールするのは困難でしたが( 'perl Build.PL'など)、' cpan'を使ってインストールしても問題ありませんでした。今私は動作しているXPathパーサーがあります。ウーホー! –
素晴らしい!この修正は、数日後にインデックス付き(完全版、非開発者版)のCPANリリースに入る予定です。 –