2013-09-05 8 views
5

मैं मार्पा पार्सर के साथ पकड़ने जा रहा हूं और पहला प्रतीक वैकल्पिक होने पर एक समस्या का सामना करना पड़ा। यहाँ एक उदाहरण है:मार्पा पार्सर वैकल्पिक पहले प्रतीक से निपटने के लिए प्रतीत नहीं हो सकता है?

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 है जिसे मैंने अभी तक नहीं देखा है)

क्या यह कुछ है जो मैं अपने व्याकरण में गलत कर रहा हूं?

उत्तर

6

मार्पा स्कैनलेस में, आपके व्याकरण के दो स्तर होते हैं: मुख्य, उच्च स्तरीय व्याकरण जहां आप क्रियाओं और निम्न स्तर के लेक्सिंग व्याकरण की विशेषता दे सकते हैं। उन्हें स्वतंत्र रूप से निष्पादित किया जाता है (यदि आप पारंपरिक पार्सर/लेक्सर्स का उपयोग करते हैं, तो यह अपेक्षा की जाती है, लेकिन जब आप रेगेक्स से मार्पा तक आते हैं तो बहुत भ्रमित होता है)।

अब निम्न स्तर के व्याकरण पर, मार्पा आपके इनपुट को एक X के रूप में पहचानता है, न कि "शून्य a एस और फिर X"। हालांकि, उच्च स्तरीय व्याकरण कोoptional a उपस्थित होने की आवश्यकता है। कि चारों ओर

वहाँ का सबसे अच्छा तरीका उच्च स्तरीय व्याकरण में a वैकल्पिक बनाने के लिए है:

<optional a> ::= <many a> 
<optional a> ::= # empty 

<many a> ~ a* # would work the same here with "a+" 
a ~ 'a' 
+2

आमोन यह अधिकार नहीं है। एक लेक्सम शून्य लंबाई कभी नहीं हो सकता है, इसलिए यदि आप * का उपयोग करते हैं, तो इसका प्रभाव + होगा। मैंने लीक्सम पर प्रतिबंध लगाने पर विचार किया जो शून्य-लंबाई पर मेल खाता है, लेकिन इस तरह लेक्सम लिखना अक्सर सुविधाजनक होता है। –

+0

+1: इसके लिए धन्यवाद। मैंने यहां G0/G1 नियम भेद को अनदेखा किया। आपका संशोधन मेरे उदाहरण के लिए काम किया। –

+1

@ जेफरी केगलर: बीटीडब्ल्यू जब मैं अपना उदाहरण तैयार कर रहा था, तो मैंने गलती से अंतिम जी 0 नियम 'ए ~ ए' लिखा था। मुझे एहसास है कि यह काम नहीं कर सकता है लेकिन मुझे एक संदेश के बजाय एसईजीवी त्रुटि मिली है। क्या आप इसकी उम्मीद करेंगे? –

संबंधित मुद्दे