2012-09-18 7 views
6

हास्केल पार्सर को हास्केल (और खुद को यातना देने) के अभ्यास के रूप में, मैं कॉन्फ़िगर करने योग्य हास्केल कोड ब्यूटीफायर लिखने पर विचार कर रहा हूं।एएसटी

यह एक विन्यास फाइल JSON या YAML में लिखा (या कुछ बेहतर है?) है कि आयात छँटाई छँटाई/data और class बयान, वर्गों के बीच लाइनों की संख्या, आदि

मैं कर रहा हूँ समूहीकरण जैसे विकल्पों को निर्दिष्ट करता है का समर्थन करेंगे हास्केल 98 के लिए एक पार्सर की तलाश है जो एक अमूर्त वाक्यविन्यास पेड़ (एएसटी) उत्पन्न करता है और टिप्पणियां बरकरार रखता है। अपने भाषा विस्तार के साथ जीएचसी पार्सिंग, एक बोनस होगा।

ऐसी चीज की अनुपस्थिति में, मुझे लगता है कि मैं एक रिकर्सिव-मूल पार्सर या एक पारसी या पार्सर जनरेटर का उपयोग कर लिख सकता हूं। शायद मेरी खुद की रोलिंग सीखने में वृद्धि होगी (और यातना :-))।

क्या कोई पूर्ण हास्केल-> एएसटी पार्सर ओपन सोर्स लाइसेंस में से एक के तहत उपलब्ध है? अगर मैं इस परियोजना पर कोई प्रगति करता हूं, तो मैं इसे गिटूब पर रखूंगा।

+0

मेरे पालतू शिखर में से एक बदसूरत कोड है। मेरा अधिकांश काम जावा में है और यह मुझे आश्चर्यचकित करता है कि लोग बिना किसी ब्रेस संरेखण, ऑपरेटरों के आस-पास असंगत अंतर आदि के कोड में कैसे जांच सकते हैं। क्या वे अपना कोड नहीं पढ़ते हैं? क्या यह उन्हें परेशान नहीं करता है? शायद यह मेरी ओसीडी है। वैसे भी, मैं मानता हूं कि आउट-ऑफ-बॉक्स हास्केल परिमाण निकर दिखने का एक आदेश है। लेकिन मैं अभी भी एक beautifier लिखना चाहता हूँ :-)। – Ralph

+0

हां। मैं वास्तव में मजाक कर रहा था, क्योंकि मुझे ऐसी चीजें पसंद हैं जो आप सुझा रहे हैं। कॉन्फ़िगरेशन फ़ाइल की भाषा के लिए खुद को हैकेल का उपयोग क्यों न करें? मुझे यकीन है कि मैंने धीरे-धीरे कॉन्फ़िगरेशन के लिए अपनी डोमेन विशिष्ट भाषा विकसित करने वाले किसी के बारे में पढ़ा है जब तक कि उन्हें एहसास नहीं हुआ कि वे केवल हैकेल चाहते थे, लेकिन [यह] (http://www.jmreardon.com/posts/2011-07-17-typesafe-config -in-haskell.html) सबसे नज़दीकी मुझे मिल सकता है। या आप [ConfigFile] (http://hackage.haskell.org/package/ConfigFile) पैकेज का उपयोग कर सकते हैं। – AndrewC

उत्तर

16

haskell-src-exts पैकेज में एक पार्सर उपलब्ध है। जीएससी एक्सटेंशन में से अधिकांश पार्सर पार्स न केवल पार्स करता है; यह सिंटैक्टिक एक्सएमएल अक्षरों जैसे अन्य एक्सटेंशन को भी पहचानता है और इसी तरह। यदि आप टिप्पणी जानकारी तक पहुंच प्राप्त करना चाहते हैं तो आपको parseModuleWithComments फ़ंक्शन का उपयोग करना चाहिए।

नोट, हालांकि, टिप्पणियां वास्तविक वाक्यविन्यास पेड़ में संग्रहीत नहीं हैं; वे स्थान जानकारी के साथ टिप्पणियों की एक अलग सूची के रूप में संग्रहीत हैं। पेड़ में टिप्पणियों को शामिल करने के लिए यह छोटा होना चाहिए, यदि आपको वास्तव में उन्हें वहां रखने की ज़रूरत है, तो एक रैखिक विलय एल्गोरिदम का उपयोग करके सूची के साथ पेड़ को विलय करके (दोनों अनुक्रमों को "क्रमबद्ध" माना जा सकता है)। टिप्पणियां भी संबंधित एएसटी नोड्स के साथ संग्रहीत की जा सकती हैं, क्योंकि "एनोटेटेड" एएसटी में प्रत्येक नोड में मनमाना मेटा डेटा हो सकता है (डिफ़ॉल्ट रूप से, केवल SrcSpanInfo)। वास्तविक haskell-src-exts पैकेज में ऐसा क्यों नहीं किया गया है, इसलिए संभवतः एएसटी पार्सर टिप्पणी पार्सर से पहले लिखा गया था।

2

मैंने एक सुपर सरल उपकरण लिखा है जो हास्केल कोड को स्वत: बना देता है। यह haskell-src-exts से पार्सिंग और सुंदर मुद्रण कार्यों का उपयोग करके करता है। आप इसे https://github.com/djv/small/blob/master/tidy.hs पर पा सकते हैं। यह कुछ और अधिक लचीला और शक्तिशाली के लिए एक शुरुआत हो सकती है।