2016-12-13 22 views
5

मुझे पर्ल 5 नहीं पता, लेकिन मैंने सोचा कि मेरे पास पर्ल 6 के साथ एक खेल होगा। मैं इसकी व्याकरण क्षमताओं को आजमा रहा हूं, लेकिन अब तक मुझे कोई भाग्य नहीं है। यहाँ मेरी कोड दूर है:यह पर्ल 6 व्याकरण क्यों नहीं करता है?

grammar CopybookGrammar { 
     token TOP { {say "at TOP" } <aword><num>} 
     token aword { {say "at word" } [a..z]+ } 
     token num { {say "at NUM" } [0..9]+ } 
} 


sub scanit($contents) { 
     my $match1 = CopybookGrammar.parse($contents); 
     say $match1; 
} 

scanit "outline1"; 

उत्पादन इस प्रकार है:

at TOP 
at word 
(Any) 

किसी कारण के लिए, यह <num> नियम से मिलान करने के लिए प्रकट नहीं होता। कोई विचार?

उत्तर

8

आप character classes वाक्य रचना में कोणीय कोष्ठक भूल गया:

[a..z]+ होना चाहिए <[a..z]>+

[0..9]+<[0..9]>+

खुद को रखकर किया जाना चाहिए, वर्ग कोष्ठक [ ] बस पर्ल 6 regexes में एक non-capturing group के रूप में कार्य। तो [a..z]+ पत्र "ए" से मेल खाता है, उसके बाद किसी भी दो अक्षर के बाद, "z" अक्षर के बाद, और फिर पूरी चीज फिर से कई बार मिल जाएगी। चूंकि यह "रूपरेखा" शब्द से मेल नहीं खाता है, <aword> टोकन आपके लिए मेल नहीं खाता है, और पार्सिंग <num> टोकन जारी नहीं है।


पुनश्च: जब व्याकरण डीबगिंग, हर जगह {say ...} ब्लॉक जोड़ने के लिए एक और अधिक सुविधाजनक विकल्प, Grammar::Debugger उपयोग करने के लिए है। उस मॉड्यूल को स्थापित करने के बाद, आप अस्थायी रूप से use Grammar::Debugger; को अपने कोड में जोड़ सकते हैं, और अपना प्रोग्राम चला सकते हैं - फिर यह आपके व्याकरण चरण (चरण जारी रखने के लिए ENTER कुंजी का उपयोग करके) के माध्यम से जाएगा, और आपको बताएगा कि कौन से टोकन/नियम मिलते हैं रास्ता।

+2

व्याकरण के लिए बहन मॉड्यूल :: डीबगर ** व्याकरण :: ट्रैसर ** ग्रामर :: डीबगर के समान स्थान से है। 'व्याकरण :: ट्रैसर का उपयोग करें;' और आपको इनपुट डेटा के विरुद्ध चलने वाले व्याकरण का पता लगाया जाएगा। – donaldh

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