किसी भी सभ्य PHP पार्सर PHP में लिखा है? [बन्द है]


80

मैं PHP कोड में हेरफेर और विश्लेषण करने के लिए बहुत सारे काम करता हूं। आम तौर पर मैं ऐसा करने के लिए सिर्फ टोकनराइज़र का उपयोग करता हूं । अधिकांश अनुप्रयोगों के लिए यह पर्याप्त है। लेकिन कभी-कभी एक लेक्सर का उपयोग करके पार्सिंग बस विश्वसनीय (स्पष्ट रूप से) पर्याप्त नहीं होता है।

इस प्रकार मैं PHP में लिखे कुछ PHP पार्सर की तलाश कर रहा हूँ। मुझे hnw / PhpParser और kumatch / stagehand-php-parser मिला । दोनों के एक स्वचालित रूपांतरण द्वारा बनाई गई हैं zend_language_parser.y पीएचपी बजाय सी के साथ एक .y फाइल करने के लिए (और फिर एक LALR (1) पार्सर को संकलित)। लेकिन इस स्वचालित रूपांतरण के साथ काम नहीं किया जा सकता है।

तो, क्या PHP में कोई अच्छा PHP पार्सर लिखा है? (मुझे PHP 5.2 के लिए एक और 5.3 के लिए एक की आवश्यकता है। लेकिन उनमें से सिर्फ एक अच्छा प्रारंभिक बिंदु होगा, भी।)


1
आपका लक्ष्य क्या है? आप यहां क्या हासिल करने की कोशिश कर रहे हैं?
चार्ल्स

3
@Charles: ऐसी कई चीजें हैं जिनके लिए मैं इसका इस्तेमाल करूंगा। बस कुछ भी है कि एक एएसटी प्रतिनिधित्व में PHP स्रोत कोड की आवश्यकता है;)
NikiC

1
@mario: यह एक बहुत सारी जानकारी देता है। यह वास्तव में केवल फ़ाइल के बारे में कुछ जानकारी निकालने के कार्य के लिए डिज़ाइन किया गया है। इसलिए यह केवल क्लास स्टेटमेंट्स, मेथड स्टेटमेंट्स या रिटर्न स्टेटमेंट्स जैसी चीजों को रखता है, लेकिन उन सभी चीजों को नजरअंदाज कर देता है जिनकी मैं वास्तव में सबसे ज्यादा दिलचस्पी रखता हूं: कोड।
निकीक

2
मुझे नहीं लगता कि आपको PHP में किसी भी बड़े पैमाने पर, मजबूत भाषा पार्सर्स मिलेंगे। इसके लिए कोई कॉल नहीं है।
इरा बैक्सटर

4
पिछले सप्ताह में मैंने खुद एक पार्सर का प्रारंभिक संस्करण लिखा है: github.com/nikic/PHP-Parser मैंने इसे अपने कोडबेस के खिलाफ परीक्षण किया और इसने अच्छा काम किया। मैं इंटरफेस में सुधार पर काम करूंगा, ताकि यह वास्तव में प्रयोग करने योग्य हो।
निकीक

जवाबों:


128

पूर्ण और स्थिर पार्सर नहीं मिलने के बाद मैंने खुद एक लिखने का फैसला किया। यहाँ परिणाम है:

PHP-Parser : PHP में लिखा गया एक PHP पार्सर

परियोजना PHP 5.2 और PHP 7.1 के बीच किसी भी PHP संस्करण के लिए लिखे गए पार्सिंग कोड का समर्थन करती है।

स्वयं पार्सर के अलावा पुस्तकालय कुछ संबंधित घटक प्रदान करता है:

  • पीएचपी में एएसटी का संकलन ("सुंदर मुद्रण")
  • एएसटी का पता लगाने और बदलने के लिए बुनियादी ढाँचा
  • XML से और साथ ही साथ (मानव पठनीय रूप में डंपिंग) के लिए सरलीकरण
  • नामांकित नामों (उपनाम आदि) का समाधान

उपयोग अवलोकन के लिए "मूल घटकों का उपयोग" दस्तावेज़ का अनुभाग देखें ।


2
यह कमाल का है! क्या आपके पास इसे बनाए रखने की योजना है?
माइकस्किंकेल

1
@NikiC धन्यवाद आदमी! यह एक महान पुस्तकालय है :-)
BVengerov

1
वाह, PHP 7.1 दिसंबर की शुरुआत में समर्थन '11!
डॉटान्चेन

9

यह आपके लिए एक बढ़िया विकल्प नहीं है, क्योंकि यह शुद्ध-पीएचपी अवरोध का उल्लंघन करता है, लेकिन:

कुछ समय पहले, php-internals लोगों ने फैसला किया कि वे लेमन को अपनी पार्सिंग तकनीक के रूप में बदल देंगे । PHP svn रेपो में एक शाखा है जिसमें आवश्यक परिवर्तन शामिल हैं।

उन्होंने इसे जारी नहीं रखने का फैसला किया , क्योंकि उन्होंने पाया कि उनका नींबू का घोल लगभग 10-15% धीमा है। लेकिन, शाखा अभी भी है।

वहाँ एक है बड़े नींबू पार्सर एक PHP विस्तार के रूप में लिखा है। आप इसके साथ काम करने में सक्षम हो सकते हैं। यह PEAR पैकेज भी है । वहाँ भी है इस दूसरे नींबू पैकेज (के माध्यम से इस बारे में ब्लॉग पोस्ट PGN )।

बेशक, भले ही आप इसे काम कर रहे हों, मुझे यकीन नहीं है कि आप डेटा के साथ क्या करेंगे, या डेटा भी कैसा दिखता है।

एक और निराला विकल्प Quercus , जावा में एक PHP कार्यान्वयन पर झांकना होगा । उन्हें एक पार्सर लिखा होगा, शायद यह जांच के लायक हो।


सबसे पहले: व्यापक शोध के लिए +1। मुख्य समस्या यह नहीं है कि PHP में पार्सर बनाने का कोई तरीका नहीं है। आपने पहले ही लेमन पीएचपी व्याकरण का उपयोग करने और इसे संकलित करने का उल्लेख किया है। इससे भी आसान शायद "असली" yacc / बाइसन व्याकरण का उपयोग करना होगा (इसके लिए कंपाइलर भी हैं)। समस्या अधिक है, कि यह वास्तव में है, वास्तव में बहुत अधिक एएसटी उत्पन्न करने के लिए याक पीएचपी कोड में ओपकोड बनाने के लिए याक सी कोड को बदलने के लिए काम करता है। तो मैं देख रहा था कि क्या किसी ने पहले ही वह काम कर लिया है।
NikiC

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

@ मैकेनिक, चार्ल्स: यह हमारे PHP पार्सर के लिए एक वास्तविक रोमांच था। दृष्टिकोण: लेक्सर / व्याकरण का प्रस्ताव करें, हजारों फाइलों पर प्रयास करें, गलत करें, समायोजित करें, फिर से प्रयास करें। खराब दस्तावेज़ वाली भाषा के लिए एक मजबूत पार्सर प्राप्त करने के लिए इस तरह के तेज़ होने में लगभग एक वर्ष लगता है। कम से कम इसने हमारे लिए किया। YMMV, लेकिन संभवत: ज्यादा नहीं।
इरा बैक्सटर

7

मैट्रिक्स टूल PHP डिपेंड में पूरी तरह से PHP में लिखे PHP स्रोत से एएसटी उत्पन्न करने के लिए कोड होता है। हालांकि यह टोकन के लिए PHP के अपने token_get_all का उपयोग करता है।

स्रोत कोड github पर उपलब्ध है: https://github.com/manuelpichler/pdepend/tree/master/src/main/php/PHP/Depend

गणितीय अभिव्यक्तियों जैसे कुछ हिस्सों के लिए एएसटी का कार्यान्वयन अभी तक पूरी तरह से अंतिम नहीं था जो मैंने जाँच की थी, लेकिन इसके लेखक के अनुसार यह लक्ष्य है।


एक एएसटी है, लेकिन "गणितीय संचालन" के लिए नहीं (मैं आपको "भाव" का अर्थ देता हूं! यह लैशेज, एस्प का एक महत्वपूर्ण हिस्सा है। जब आप मानते हैं कि दोहरे-उद्धृत "स्ट्रिंग शाब्दिक" (एम्बेडेड अभिव्यक्ति के साथ) वास्तव में सिर्फ जटिल हैं। स्ट्रिंग एक्सप्रेशंस।
इरा बैक्सटर

2
आपको इनाम मिला, क्योंकि यह सवाल का सबसे करीबी जवाब है। लेकिन जाहिर है, यह वास्तव में प्रयोग करने योग्य नहीं है, क्योंकि इसमें
पीएच

इस पोस्ट की सामग्री पुरानी है। तब से सक्रिय विकास हुआ है, हालांकि मुझे नहीं पता कि यह PHP व्याकरण का कितना अच्छा समर्थन करता है।
न्हाथ्ठ

4

खैर, यह PHP में नहीं है, क्षमा करें, लेकिन इस तरह की मशीनरी का निर्माण कठिन है, और PHP भाषा प्रसंस्करण के कार्य के लिए विशेष रूप से अनुकूल नहीं है।

हमारा PHP फ्रंट एंड यह पूर्ण PHP 4.x और 5.x (EDIT 9/2016: अब PHP 7 को संभालता है) पार्सिंग प्रदान करता है, स्वचालित रूप से एक पूर्ण PHP व्याकरण के सभी विवरणों के साथ एएसटी बनाता है, एएसटी से संकलन योग्य स्रोत पाठ उत्पन्न कर सकता है। जब आप अजीब स्ट्रिंग शाब्दिक, कैप्चर की गई टिप्पणियों, संख्याओं-साथ-मूलांक, आदि सहित सभी पेचीदा विवरणों पर विचार करते हैं, तो यह कठिन है।

लेकिन एएसटी शायद ही पर्याप्त हैं (आप पहले ही देख चुके हैं कि टोकन भी मुश्किल से पर्याप्त नहीं हैं)।

जिस नींव पर यह बनाया गया है, वह डीएमएस सॉफ्टवेयर रेन्गिनियरिंग टूलकिट एएसटीएस के विश्लेषण और मध्यस्थ परिवर्तनों के लिए समर्थन प्रदान करता है। यह भी एक ही बार में फ़ाइलों के बड़े समूहों को पढ़ा, विश्लेषण और परिवर्तनों को सक्षम करने होंगे भर PHP फ़ाइलों।


1
पहले वाक्य की प्रतिक्रिया के रूप में: पहले से ही पार्सर जनरेटर हैं, जो एक याक ग्रामर (उदाहरण के लिए kmyacc) से एक पार्सर उत्पन्न कर सकते हैं। यानी कि PHP में इसे बनाने और किसी अन्य भाषा में इसे बनाने के बीच कोई बड़ा अंतर नहीं है। आपको बस इतना करना है, "just" (विडंबना) है z कोड_language_parser.y में C कोड को कुछ PHP कोड के साथ बदलें जो एक नोड ट्री बनाते हैं।
निकीक

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

@ninkic: सभी ट्यूरिंग मशीनें (PHP सहित) अन्य सभी ट्यूरिंग मशीनों का अनुकरण कर सकती हैं, हाँ, यह PHP में बनाना संभव है। लेकिन ए) वहाँ सिर्फ पार्सर का निर्माण होता है ; मुझे लगता है कि PHP पार्सर एक पेड़ बनाने के लिए डिज़ाइन नहीं किया गया है, बल्कि PHP पी-कोड जनरेटर को खिलाने के लिए बनाया गया है, और मुझे लगता है कि आप पाएंगे कि ज़रूरतें अलग हैं, और बी) लोग बार-बार यह मानने की गलती करते हैं कि अगर उनके पास है एएसटी, बाकी सब कुछ आसान है; वे यह गलती बड़े पैमाने पर करते हैं क्योंकि उन्हें एएसटी के साथ जटिल चीजें करने का कोई अनुभव नहीं है। मैंने डीएमएस बनाया क्योंकि यह धारणा झूठी है।
ईरा बाक्सटर

1
a) हां, PHP पार्सर एक पार्स ट्री बनाने के लिए डिज़ाइन नहीं किया गया है, यह एक ओपोड स्ट्रीम बनाने के लिए डिज़ाइन किया गया है। इसीलिए zend भाषा के पार्सर को PHP में स्वचालित रूप से परिवर्तित करना मुश्किल है। बी) मैं शायद यह गलती करने वालों में से एक हूं?) इस तथ्य से कि जटिल जोड़तोड़ का भार पहले से ही शुद्ध टोकन स्ट्रीम के साथ हो सकता है, मैंने निष्कर्ष निकाला (आपकी आंखों में गलती से?) कि एएसटी के साथ यह आसान होगा? ज्यादा स्थिर।
NikiC

@ मैकेनिक: कंपाइलर प्रौद्योगिकी के 50 वर्षों के सबक यह है कि प्रत्येक कार्यक्रम प्रतिनिधित्व कुछ चीजों को आसान बनाता है। आप सिर्फ पाठ पर कुछ प्रोग्राम मैनिनप्यूलेशन कर सकते हैं। आप टोकन पर अधिक कर सकते हैं। आप एएसटीएस पर अभी और कर सकते हैं। आप वास्तव में दिलचस्प सामान कर सकते हैं यदि आपके पास प्रतीक तालिकाओं, नियंत्रण और डेटा प्रवाह जानकारी (रेखांकन), चर उपनाम डेटा (अंक-विश्लेषण करने के लिए) है। जैसा कि आप पाते हैं कि आप परिष्कृत कोड पीढ़ी करने की कोशिश करते हैं कि यह सब वास्तव में, वास्तव में उपयोगी सामान है।
इरा बैक्सटर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.