2010-04-14 13 views
6

का उपयोग कर कस्टम व्हाइटस्पेस मैं अपने पार्सर बनाने के लिए Parsec's makeTokenParser का उपयोग करना चाहता हूं, लेकिन मैं whiteSpace की अपनी परिभाषा का उपयोग करना चाहता हूं। मेरी परिभाषा के साथ whiteSpace को निम्नलिखित स्थानांतरित करना, लेकिन सभी lexeme पार्सर्स अभी भी पुरानी परिभाषा का उपयोग करते हैं (उदा। P.identifier lexer पुराने व्हाइटस्पेस का उपयोग करेगा)।हास्केल पारसेक

... 
lexer :: P.TokenParser() 
lexer  = l { P.whiteSpace = myWhiteSpace } 
    where l = P.makeTokenParser myLanguageDef 
... 

makeTokenParser के लिए कोड को देखते हुए मुझे लगता है कि मुझे समझ में क्यों यह इस तरह से काम करता है। मैं जानना चाहता हूं कि makeTokenParser के लिए कोड को पूरी तरह डुप्लिकेट करने से बचने के लिए कोई कामकाज है या नहीं?

+0

संबंधित: http://stackoverflow.com/questions/5672142/in-parsec-is-there-a-way-to-prevent-lexeme-from-consuming-newlines –

उत्तर

7

अफसोस की बात है, मुझे नहीं लगता कि एक रास्ता है। makeTokenParser में उपयोग की जाने वाली स्थानीय परिभाषाएं स्वयं को संदर्भित करती हैं, और इसलिए, जैसा कि आपने ध्यान दिया है, lexemewhiteSpace का उपयोग whiteSpace रिकॉर्ड सदस्य के बजाय आपके lexer ऑब्जेक्ट में प्रतिस्थापित करने के बजाय किया गया है।

कोड taunting है क्योंकि यह makeTokenParser में स्थानीय कार्यों के रूप में और TokenParser कन्स्ट्रक्टर के रिकॉर्ड सदस्यों के समान नामों का उपयोग करता है। वे वास्तव में पूरी तरह से अलग इकाइयां हैं।

+2

अब अगर केवल 'टोकन पार्सर' लिखा गया था प्रकार कक्षाओं के साथ, हम जाने के लिए अच्छा होगा। – Steve

+1

.. और यदि यह 'पहचान' तक कठोर होने के बजाय मोनैडिक पार्सर्स (पारसी 3 में) बना सकता है। –