非常に基本的な Marpa 文法のように見えるものを機能させようとしています。私が使用するコードは以下のとおりです。
use strict;
use warnings;
use Marpa::R2;
use Data::Dumper;
my $grammar = Marpa::R2::Scanless::G->new(
{
source => \(<<'END_OF_SOURCE'),
:start ::= ExprSingle
ExprSingle ::= Expr AndExpr
Expr ~ word
AndExpr ~ word*
word ~ [\w]+
:discard ~ ws
ws ~ [\s]+
END_OF_SOURCE
}
);
my $reader = Marpa::R2::Scanless::R->new(
{
grammar => $grammar,
}
);
my $input = 'foo';
$reader->read(\$input);
my $value = $reader->value;
print Dumper $value;
これは印刷され$VAR1 = \'foo';
ます。そのため、1 つの単語を問題なく認識します。しかし、単語の文字列を認識したい
my $input='foo bar'
スクリプトは次のように出力します。
Error in SLIF G1 read: Parse exhausted, but lexemes remain, at position 4
これは、構造レベル G1 の代わりにトークン化レベル G0 の一部にする (match) 演算子をExprSingle
使用しているためだと思います。~
この:discard
規則では、G0 規則ではなく、G1 規則の間にスペースを許可します。したがって、文法を次のように変更します。
ExprSingle ::= Expr AndExpr
警告は表示されなくなりましたが、結果の値は、とundef
を含むものではなく. 以前、失敗した解析が実際のエラーをスローしたため、それが何を意味するのかは正直わかりません。'foo'
'bar'
文法を変更して、G0 ルールと G1 ルールと思われるものをさらに分離しようとしましたが、まだうまくいきません。
:start ::= ExprSingle
ExprSingle ::= Expr AndExpr
Expr ::= token
AndExpr ::= token*
token ~ word
word ~ [\w]+
:discard ~ ws
ws ~ [\s]+
最終的な値はまだundef
です。trace_terminals
「foo」と「bar」の両方がトークンとして受け入れられることを示しています。この文法を修正するにはどうすればよいですか (つまり、単に ではなく、文字列 'foo' と 'bar' を含む値を取得することを意味しますundef
)。