मैं मार्पा पार्सर के साथ पकड़ने जा रहा हूं और पहला प्रतीक वैकल्पिक होने पर एक समस्या का सामना करना पड़ा। यहाँ एक उदाहरण है:मार्पा पार्सर वैकल्पिक पहले प्रतीक से निपटने के लिए प्रतीत नहीं हो सकता है?
use strict;
use warnings;
use 5.10.0;
use Marpa::R2;
use Data::Dump;
my $grammar = Marpa::R2::Scanless::G->new({source => \<<'END_OF_GRAMMAR'});
:start ::= Rule
Rule ::= <optional a> 'X'
<optional a> ~ a *
a ~ 'a'
END_OF_GRAMMAR
my $recce = Marpa::R2::Scanless::R->new({grammar => $grammar});
dd $recce->read(\"X");
जब मैं इस चलाने के लिए, मैं निम्नलिखित त्रुटि मिलती है:
Error in SLIF parse: No lexemes accepted at line 1, column 1
* String before error:
* The error was at line 1, column 1, and at character 0x0058 'X', ...
* here: X
Marpa::R2 exception at small.pl line 20
at /usr/local/lib/perl/5.14.2/Marpa/R2.pm line 126
Marpa::R2::exception('Error in SLIF parse: No lexemes accepted at line 1, column 1\x{a}...') called at /usr/local/lib/perl/5.14.2/Marpa/R2/Scanless.pm line 1545
Marpa::R2::Scanless::R::read_problem('Marpa::R2::Scanless::R=ARRAY(0x95cbfd0)', 'no lexemes accepted') called at /usr/local/lib/perl/5.14.2/Marpa/R2/Scanless.pm line 1345
Marpa::R2::Scanless::R::resume('Marpa::R2::Scanless::R=ARRAY(0x95cbfd0)', 0, -1) called at /usr/local/lib/perl/5.14.2/Marpa/R2/Scanless.pm line 926
Marpa::R2::Scanless::R::read('Marpa::R2::Scanless::R=ARRAY(0x95cbfd0)', 'SCALAR(0x95aeb1c)') called at small.pl line 20
पर्ल संस्करण 5.14.2 (Debian खरखरा)
मारपा संस्करण २.०६८०००
(मैं देख रहा हूँ एक नया नया मार्पा 2.069 है जिसे मैंने अभी तक नहीं देखा है)
क्या यह कुछ है जो मैं अपने व्याकरण में गलत कर रहा हूं?
आमोन यह अधिकार नहीं है। एक लेक्सम शून्य लंबाई कभी नहीं हो सकता है, इसलिए यदि आप * का उपयोग करते हैं, तो इसका प्रभाव + होगा। मैंने लीक्सम पर प्रतिबंध लगाने पर विचार किया जो शून्य-लंबाई पर मेल खाता है, लेकिन इस तरह लेक्सम लिखना अक्सर सुविधाजनक होता है। –
+1: इसके लिए धन्यवाद। मैंने यहां G0/G1 नियम भेद को अनदेखा किया। आपका संशोधन मेरे उदाहरण के लिए काम किया। –
@ जेफरी केगलर: बीटीडब्ल्यू जब मैं अपना उदाहरण तैयार कर रहा था, तो मैंने गलती से अंतिम जी 0 नियम 'ए ~ ए' लिखा था। मुझे एहसास है कि यह काम नहीं कर सकता है लेकिन मुझे एक संदेश के बजाय एसईजीवी त्रुटि मिली है। क्या आप इसकी उम्मीद करेंगे? –