2013-06-20 3 views
5

के साथ गलत टोकननाइज़ेशन मेरे पास एक बड़ा मार्पा व्याकरण (XPath पार्स करने के लिए) है, और मैं टोकननाइज़ेशन के साथ एक समस्या में भाग गया। मैं एक न्यूनतम तोड़ने उदाहरण नीचे बनाया:मार्पा

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] रूप tokenized करना चाहते हैं:

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); 

यह स्क्रिप्ट निम्नलिखित प्रिंट करता है। टर्मिनल ट्रेस दिखाता है, केवल एक कोलन चरित्र पढ़ा और संसाधित किया जाता है। ऐसा लगता है कि यह स्ट्रिंग की शुरुआत [word] [':'] [word] के रूप में टोकननाइज़ करने की कोशिश करता है और इसके माध्यम से भाग में विफल रहता है। यदि आप व्याकरण की रेखा 10 (| word ':' word) हटाते हैं तो त्रुटि अब नहीं फेंक दी जाएगी।

मैंने डबलकॉलन (:lexeme ~ <DoubleColon> priority > 1) के लिए प्राथमिकता बनाने की कोशिश की, लेकिन यह काम नहीं किया। क्या कोई मुझे बता सकता है कि इस व्याकरण को इनपुट स्ट्रिंग को सही तरीके से पार्स करने के लिए क्या करना है? इसे अभी भी child::ns:book, आदि

+0

यदि आप इसे ठीक से जांचना चाहते हैं, तो बस अपलोड किए गए मार्पा-आर 2 2.059_000: https://metacpan.org/release/JKEGL/Marpa-R2-2.059_000 –

+0

शानदार! मुझे नहीं पता क्यों, लेकिन मुझे इसे हाथ से स्थापित करने में परेशानी थी ('perl Build.PL', आदि), लेकिन' cpan' के साथ स्थापना ठीक काम करती है। अब मेरे पास एक काम कर रहे XPath पार्सर है। वू हू! –

+0

अद्भुत! फिक्स कुछ दिनों में एक अनुक्रमित (पूर्ण, गैर-डेवलपर) सीपीएएन रिलीज में जाएगा। –

उत्तर

7

पार्स करने में सक्षम होना आवश्यक है यह वर्तमान रिलीज, 2.058, मार्पा :: आर 2 में एक बग प्रतीत होता है। मेरी माफ़ी और समस्या के सावधानीपूर्वक लिखने के लिए धन्यवाद।

मेरे पास एक फिक्स है, जो परीक्षण सूट पास करता है, और मुझे जल्द ही एक नई रिलीज मिल जाएगी।

+1

हां! बहुत बहुत धन्यवाद। –