के साथ perl regexp का उपयोग करके नेस्टेड टुपल्स को पार्सिंग करना मैं एम्बेडेड कोड निष्पादन के साथ एक पर्ल रेगेक्सपी का उपयोग करके नेस्टेड टुपल्स के लिए एक अमूर्त वाक्यविन्यास पेड़ कैसे बनाना सीखना चाहता हूं। मैं आसानी से प्रोग्राम कर सकता हूं कि एक पर्ल 6 व्याकरण का उपयोग करके और मुझे पता है कि पार्सिंग मॉड्यूल का उपयोग करके पर्ल 5 में कार्य को सरल बना दिया जाएगा, लेकिन मुझे लगता है कि इस तरह के सरल कार्यों के लिए मुझे यह सीखकर मॉड्यूल के बिना ऐसा करने में सक्षम होना चाहिए कि कैसे यांत्रिक रूप से अनुवाद करना है व्याकरण परिभाषाएं। मुझे $^R को कम करने का कोई तरीका नहीं मिला, इसलिए मैं TUPLE नियम परिभाषा के अंत में अनैच्छिक घोंसले को पूर्ववत करने का प्रयास करता हूं, लेकिन आउटपुट गलत है, उदा। कुछ सबस्ट्रिंग दो बार दिखाई देते हैं।
use v5.10;
use Data::Dumper;
while (<DATA>) {
chomp;
/(?&TUPLE)(?{$a = $^R})
(?(DEFINE)
(?<TUPLE>
T \s (?&ELEM) \s (?&ELEM)
(?{ [$^R->[0][0],[$^R->[0][1],$^R[1]]] })
)
(?<ELEM>
(?: (a) (?{ [$^R,$^N] }) | \((?&TUPLE) \))
)
)/x;
say Dumper $a;
}
__DATA__
T a a
T (T a a) a
T a (T a a)
T (T a a) (T a a)
T (T (T a a) a) (T a (T a a))
अपेक्षित उत्पादन डेटा संरचना एक नेस्टेड सूची है:
['a','a'];
['a',['a','a']];
[['a','a'],'a'];
[['a','a'],['a','a']];
[[['a','a'],'a'],['a',['a','a']]]
मैं अपने पर्ल 6 कोड काम साझा करेंगे संदर्भ के लिए:
grammar Tuple {
token TOP { 'T ' <elem> ' ' <elem> }
token elem { 'a' | '(' <TOP> ')'}
}
class Actions {
method TOP($/) {make ($<elem>[0].made, $<elem>[1].made)}
method elem($/) {make $<TOP> ?? $<TOP>.made !! 'a'}
}
कूल डिबग मुश्किल है ;-),। आप parse_tuple में संदर्भ के रूप में स्ट्रिंग पैरामीटर क्यों पास करते हैं? – rubystallion
@ रूबस्टेलियन क्योंकि वर्तमान 'pos' जहां '\ G' एंकर स्ट्रिंग मान का हिस्सा हैं, हमें एक प्रतिलिपि नहीं बनाना चाहिए (या हमें प्रत्येक उप में फिर से' pos' असाइन करना होगा)। ध्यान दें कि 'parse_element()' उस मिलान को जारी रख सकता है जहां 'parse_tuple() 'समाप्त हो गया था क्योंकि' $$ ref' में सही pos है। बड़ी दस्तावेजों के लिए प्रतियां भी अक्षम होती हैं। – amon
मुझे लगता है कि यह उन स्थानों में से एक है जहां पैरामीटर के बजाय '$ _' का उपयोग करना समझदारी होगी। – ikegami