5

में कक्षाओं का प्रतिनिधित्व कैसे करें मैंने संबंधित प्रश्न पढ़े हैं, लेकिन उनमें से कोई भी सीधे प्रश्न का समाधान नहीं कर रहा है। मैं एक PHP स्क्रिप्ट दुभाषिया लिखने पर काम कर रहा हूं। मेरे पास एएसटी कक्षाओं को छोड़कर सब कुछ के लिए उचित नोड उत्पन्न कर रहा है। हैंडलिंग कक्षाएं कार्यों को संभालने से थोड़ा अलग हैं, इसलिए मैं उन वर्गों को संभालने के लिए देख रहा हूं जो स्टैंडअलोन हैं, और यह अन्य वर्गों का विस्तार करता है।एक सार सिंटेक्स ट्री आधारित इंटरप्रेटर

मैंने एएनटीएलआर को देखा है, लेकिन मैं ओवरहेड पर खर्च नहीं कर सकता क्योंकि यह एक एम्बेडेड प्लेटफ़ॉर्म के लिए है। जो मैं खोज रहा हूं वह एएसटी में कक्षाओं के पीछे अवधारणा सिद्धांत है ताकि उन्हें दुभाषिया के निष्पादक भाग द्वारा निष्पादित किया जा सके। इस मुद्दे के विशिष्ट उत्तरों के साथ अच्छे लिंक निश्चित रूप से सराहना की जाती हैं।

उत्तर

2

एएनटीएलआर आपकी समस्या के लिए कम या ज्यादा अप्रासंगिक है।

PHP में एक कक्षा मूल रूप से तारों से गुणों का नक्शा है। प्रत्येक विशेषता सार्वजनिक, निजी, संरक्षित हो सकती है। प्रत्येक विशेषता में एक मान भी होता है, जो स्थिर चर या विधि हो सकता है। तरीके फ़ंक्शन हैं जो (PHP में) इस पैरामीटर को एक निहित $ लेते हैं। तो आप मूल रूप से PHP में एक फैंसी सरणी ऑब्जेक्ट के रूप में कक्षा के बारे में सोच सकते हैं।

जब आप कोई ऑब्जेक्ट बनाते हैं, तो आप इसे अपने PHP क्लास ऑब्जेक्ट में पॉइंटर देते हैं। जब आप उस ऑब्जेक्ट पर कोई विधि कॉल करते हैं, तो आप क्लाइंट ऑब्जेक्ट के माध्यम से उस विधि को देखते हैं जिसे आप उस पॉइंटर से प्राप्त करते हैं।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

सही, लेकिन जब भी कक्षा तुरंत चालू होती है तो उस वस्तु के लिए टोकन को दोबारा व्याख्या करने की ओर जाता है? मुझे लगता है कि Google के वी 8 और अन्य जावास्क्रिप्ट कार्यान्वयन के बीच अंतर है, और मुझे इसे समझने की आवश्यकता है। जानकारी के लिए धन्यवाद। –

0

मुझे पता चला है कि शीर्ष डाउन कंपाइलर में सबसे अच्छी विधि है, आमतौर पर कार्यों की तरह कक्षाओं का इलाज करना सबसे अच्छा तरीका है, जिसमें वे केवल पेड़ में उतरने से पहले तर्कों का मूल्यांकन करने के बिना नोड्स हैं।

मतभेद निष्पादक में हैं, जिन्हें एक निष्पादन स्कोप बनाना है जिसमें कक्षा नोड शामिल विधियों और चर को समाहित करना है।

1

शायद आपको व्याख्या के लिए कुछ संरचनाओं की आवश्यकता है जो स्रोत व्याकरण से थोड़ी अधिक हटा दी गई हैं? मुझे PHP के बारे में बहुत कुछ पता नहीं है, लेकिन ऐसा लगता है कि आप वास्तव में पूछ रहे हैं कि प्रोग्राम मॉडल को इस तरह से कैसे व्यवस्थित किया गया है कि व्याख्या के लिए सुविधाजनक है। मैं एएनटीएलआर के माध्यम से उत्पन्न एएसटी को जो कुछ भी चाहता हूं उसके स्रोत के बहुत करीब के रूप में मानता हूं।

0

मैं जावा एसीसी (या कांटा फ्रीसीसी) का उपयोग करने और अपने एएसटी बनाने के लिए सुझाव देना चाहता हूं। जावासीसी एक पार्सर उत्पन्न करता है जिसमें कोई रनटाइम निर्भरता नहीं होती है। जावासीसी जेनरेट कोड के मुकाबले एक छोटा/तेज पार्सर लिखना मुश्किल है।

+0

कूल, मैं इसे देख लूंगा, एक बात जो मुझे देखना है वह यह है कि यह दलविक बाइटकोड के साथ संगत है, मैंने पाया है कि अधिकांश जावा क्लास फाइलें हैं, लेकिन कुछ –

+0

जावासीसी आउटपुट सिर्फ दो जोड़े नहीं हैं जावा क्लास फाइलों के। ये आपके नियमित कंपाइलर के साथ संकलित हो जाएंगे। जेनरिक्स के लिए फ्रीसीसी के पास बेहतर समर्थन है, इसलिए मैं आपके कोडिंग जावा 1.5 के बाद इसका उपयोग करूंगा। – brianegge

+0

मदद के लिए धन्यवाद, मैं देखता हूं कि मैं इसका उपयोग कर सकता हूं –

0

phc abstract grammar पर एक नज़र डालें, यह ठीक है। (संयोग से, ऐसा लगता है कि पीएचसी के फ्रंट एंड का उपयोग करने से पहिया को फिर से शुरू करने से बेहतर हो सकता है)।

Class_def ::= Class_mod CLASS_NAME extends:CLASS_NAME? implements:INTERFACE_NAME* Member* ; 
Class_mod ::= "abstract"? "final"? ; 

Interface_def ::= INTERFACE_NAME extends:INTERFACE_NAME* Member* ; 

Member ::= Method | Attribute ; 

Method ::= Signature Statement*? ; 
Signature ::= Method_mod is_ref:"&"? METHOD_NAME Formal_parameter* ; 
Method_mod ::= "public"? "protected"? "private"? "static"? "abstract"? "final"? ; 
Formal_parameter ::= Type is_ref:"&"? var:Name_with_default ; 
Formal_parameter ::= Type is_ref:"&"? var:Name_with_default ; 
Type ::= CLASS_NAME? ; 
Name_with_default ::= VARIABLE_NAME Expr? ; 

Attribute ::= Attr_mod vars:Name_with_default* ; 
Attr_mod ::= "public"? "protected"? "private"? "static"? "const"? ; 
+0

धन्यवाद पॉल, मैं अभी भी सी/सी ++ आधारित ग्राहकों के लिए पीएचसी का उपयोग कर रहा हूं, लेकिन मैं एंड्रॉइड (जावा/डाल्विक) पर इसका उपयोग कैसे कर सकता हूं? –

+0

मुझे लगता है कि देशी ऐप्स संभव नहीं हैं? तो शायद एक्सएमएल इंटरफेस का उपयोग कर वेब सेवा के रूप में? –

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