2016-03-21 6 views
5

एक रेगेक्स, टोकन या नियम के साथ, एक चर को परिभाषित करना संभव है;

token directive { 
    :my $foo = "in command"; 
    <command> <subject> <value>? 
} 

भाषा प्रलेखन here में इसके बारे में कुछ भी नहीं है, और S05 - Regexes and Rules में बहुत कम है, उद्धृत करने के लिए;

किसी भी व्याकरण regex वास्तव में सिर्फ विधि की तरह है, और आप एक पेट के किसी भी गुंजाइश declarator मेरी, हमारे, राज्य, और निरंतर सहित पर्ल 6 व्याकरण, द्वारा पार्स के बाद का उपयोग कर इस तरह के एक दिनचर्या में चर घोषित कर सकता है। (। अर्ध declarators, अस्थायी रूप है और यह भी मान्यता प्राप्त हैं) एक एकल बयान (एक समाप्त अर्धविराम या लाइन फाइनल समापन ब्रेस के माध्यम से) सामान्य पर्ल 6 कोड के रूप में पार्स किया जाता है:

token prove-nondeterministic-parsing { 
    :my $threshold = rand; 
    'maybe' \s+ <it($threshold)> 
} 

मैं भीतर कि regexen मिल कक्षाओं में विधियों के समान व्याकरण बहुत समान हैं; मुझे लगता है कि आप नियम के भीतर कहीं भी एक ब्लॉक शुरू कर सकते हैं और यदि सफलतापूर्वक उस बिंदु पर पार्सिंग हो जाती है, तो ब्लॉक निष्पादित किया जाएगा - लेकिन मुझे समझ में नहीं आता कि यह चीज़ पृथ्वी पर क्या है।

क्या कोई स्पष्ट रूप से परिभाषित कर सकता है कि इसका दायरा क्या है; समझाएं कि इसे किस चीज को पूरा करने और सामान्य उपयोग के मामले को देने की आवश्यकता है?

उत्तर

7

:my $foo; का क्या दायरा है?

:my $foo ...; में नियम/टोकन/रेगेक्स का lexical scope है जिसमें यह प्रतीत होता है।

(और :my $*foo ...; - ध्यान दें अतिरिक्त * एक गतिशील चर वाचक -। दोनों शाब्दिक और राज करो की dynamic scope/टोकन/जिसमें यह प्रतीत होता है regex)

क्या इस

के लिए प्रयोग किया जाता है

regex scope-too-small { # Opening `{` opens a regex lexical scope. 
    { my $foo =/bar/} # Block with its own inner lexical scope. 
    $foo     # ERROR: Variable '$foo' is not declared 
} 

grammar scope-too-large { # Opening `{` opens lexical scope for gramamr. 
    my $foo =/bar/; 
    regex r1 { ... }  # `$foo` is recognized inside `r1`... 
    ... 
    regex r999 { ... }  # ...but also inside r999 
} 

तो : ... ; वाक्य रचना वास्तव में desir प्राप्त करने के लिए प्रयोग किया जाता है:

यहाँ बिना होता है इस संरचना है एड स्कोप - न तो बहुत व्यापक और न ही बहुत संकीर्ण।

विशिष्ट उपयोग के मामलों

आमतौर पर इस सुविधा ढीला scoping से बचने के लिए (जो कीड़े को जन्म देती है) बड़ी या जटिल व्याकरण में प्रयोग किया जाता है।

सटीक शाब्दिक केवल देखते हुए की एक उपयुक्त उदाहरण के लिए घोषणा और token babble as defined in a current snapshot of Rakudo's Grammar.nqp source code में @extra_tweaks के उपयोग को देखते हैं।

पी 6 action objects का समर्थन करता है। ये व्याकरण में नियमों के साथ-साथ एक-दूसरे के साथ विधियों के साथ कक्षाएं हैं। जब भी कोई नियम मेल खाता है, तो यह इसकी संबंधित क्रिया विधि को कॉल करता है। Dynamic variables स्पष्ट रूप से ब्लॉक (विधि, नियम, इत्यादि) में वर्णित चर घोषित करने के लिए सही स्कोपिंग प्रदान करते हैं, जिन्हें वे दोनों अक्षय और गतिशील रूप से घोषित किए जाते हैं - जिसका अर्थ है कि वे इसी क्रिया विधि में भी उपलब्ध हैं। इसके उदाहरण के लिए, the declaration of @*nibbles in Rakudo's Grammar module और its use in Rakudo's Actions module देखें।

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

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