2012-05-16 16 views
8

आप किस मामले में वैश्विक चरम या @ मेम्बर्स घोषणा की एक चर घोषित करना पसंद करेंगे? ऐसा लगता है कि वे एक ही उद्देश्य के लिए सेवा कर सकते हैं?एंटर ग्लोबल नियम स्कोप घोषणा बनाम @ मेम्बर्स घोषणा

अद्यतन यहां एक व्याकरण है जिसका अर्थ है कि मेरा क्या मतलब है।

grammar GlobalVsScope; 

scope global{ 
    int i; 
} 
@lexer::header{package org.inanme.antlr;} 
@parser::header{package org.inanme.antlr;} 

@parser::members { 
    int j; 
} 

start 
scope global; 
@init{ 
    System.out.println($global::i); 
    System.out.println(j); 
}:R EOF; 

R:'which one'; 
+0

उदाहरण के लिए व्याकरण देखें। –

+0

आह, लक्ष्य भाषा का * स्कोप * नहीं, लेकिन एएनटीएलआर- * स्कॉप्स *। मै समझता हुँ। –

उत्तर

9

ध्यान दें कि वैश्विक (ANTLR) स्कोप के अलावा, आप भी स्थानीय नियम-स्कोप हो सकता है, इस तरह:

grammar T; 

options { backtrack=true; } 

parse 
scope { String x; } 
parse 
: 'foo'? ID {$parse::x = "xyz";} rule* 
| 'foo' ID 
; 

rule 
: ID {System.out.println("x=" + $parse::x);} 
; 

केवल समय मैं स्थानीय rule- उपयोग करने पर विचार करता हूँ स्कॉप्स तब होता है जब बहुत सारी भविष्यवाणियां होती हैं, या वैश्विक बैकट्रैकिंग सक्षम होती है (जिसके परिणामस्वरूप सभी नियम उनके सामने भविष्यवाणी करने के लिए होते हैं)। उस स्थिति में, आप सदस्य चर String x (या इसे वैश्विक दायरे में परिभाषित करें) बनाते हैं और इसे parse नियम में सेट करते हैं, लेकिन हो सकता है कि आप इस इंस्टेंस/स्कोप वेरिएबल को बदल रहे हों जिसके बाद पार्सर बैकट्रैक कर सकता है, और यह बैकट्रैकिंग वैश्विक चर को इसके मूल रूप/स्थिति में सेट करने का कारण बन जाएगा! स्थानीय स्कोप्ड वैरिएबल भी "अनसेट" हो जाएगा, लेकिन यह संभवतः जोखिम से कम होगा: वे एक नियम के लिए स्थानीय हैं।

संक्षेप में: हाँ, आप सही हैं, वैश्विक क्षेत्र और सदस्य/आवृत्ति चर समान हैं। लेकिन मैं दोस्ताना वाक्यविन्यास की वजह से सदस्यों-चर के लिए जल्द ही चयन करूंगा।

+0

अभी भी पचाने, बहुत बहुत धन्यवाद! –

+0

@ मर्टिनन, क्षमा करें, मेरा पहला जवाब बिल्कुल सही नहीं था (और थोड़ा अस्पष्ट, शायद)। मेरा संपादित संस्करण देखें। –

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