2012-02-28 19 views
8

मैं पार्ससी के साथ काम कर रहा हूं और मुझे अपने कोड को डीबग करने में परेशानी है। उदाहरण के लिए, मैं ghci में ब्रेकपॉइंट सेट कर सकता हूं, लेकिन मुझे यकीन नहीं है कि इनपुट कितना इनपुट किया गया है, या ऐसी चीजें।Parsec डीबगिंग

क्या डिबगिंग पार्ससी कोड के साथ मदद करने के लिए उपकरण/दिशानिर्देश हैं?

+2

जब आप एक पार्सर चलाने - ParseError मुद्रण दिखाएगा - यह एक 'या तो ParseError A' लौटना चाहिए आप स्रोत स्थिति और किसी भी त्रुटि संदेश। टेक्स्ट एडिटर में अपना नमूना इनपुट होने का शायद यह देखने का सबसे आसान तरीका है कि स्रोत स्थिति कहां से मेल खाती है, हालांकि आप बाकी की इनपुट को कैप्चर करने और अपनी प्रारंभिक सामग्री प्रिंट करने के लिए अपना स्वयं का त्रुटि फेंकने वाला फ़ंक्शन लिख सकते हैं ('getInput' वापस लौटाता है शेष इनपुट)। –

उत्तर

8

This पृष्ठ सहायता कर सकता है।

Debug.trace आपका मित्र है, यह आपको अनिवार्य रूप से कुछ printf डिबगिंग करने की अनुमति देता है। यह अपने पहले तर्क का मूल्यांकन और प्रिंट करता है और फिर अपना दूसरा देता है। तो अगर आप की तरह

foo :: Show a => a -> a 
foo = bar . quux 

कुछ है आप निम्न के लिए foo बदलकर foo के पैरामीटर का 'मान' डिबग कर सकते हैं: के रूप में यह पहले किया था

import Debug.Trace(trace) 

foo :: Show a => a -> a 
foo x = bar $ quux $ trace ("x is: " ++ show x) x 

foo अब उसी तरह काम करेंगे, लेकिन जब आप foo 1 पर कॉल करते हैं तो अब मूल्यांकन के दौरान x is: 1 को stderr पर प्रिंट किया जाएगा।

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

ध्यान दें कि :force एक चर की सामग्री को पता लगाना में अधिक उपयोगी है, लेकिन यह भी बदल सकते हैं आपके कार्यक्रम के अर्थशास्त्र (यदि आपका कार्यक्रम आलस्य पर निर्भर करता है)।

  • उपयोग :list और :show context जाँच करने के लिए breakpoints
  • स्थापित करने के लिए

    • उपयोग :break जहां चर बाइंडिंग जाँच करने के लिए कोड
    • उपयोग :show bindings में हैं:

      एक सामान्य GHCi डिबगिंग कार्यप्रवाह कुछ इस तरह दिखता

    • :print का उपयोग करके देखें कि वर्तमान में
    • 0 का उपयोग करेंआवश्यक हो तो अपने बाइंडिंग

    जाँच करने के लिए आप एक अनंत लूप डिबग करने के लिए कोशिश कर रहे हैं, यह भी

    • :set -fbreak-on-error
    • :trace myLoopingFunc x y

    उपयोग करने के लिए तो फिर तुम हिट कर सकते हैं मदद करता है लूप के दौरान Ctrl-C और लूपिंग देखने के लिए :history का उपयोग करें।

    4

    आप अपने और आपके उपयोगकर्ताओं के लिए बेहतर त्रुटि संदेश बनाने के लिए Text.Parsec.Prim में the <?> operator का उपयोग करने में सक्षम हो सकते हैं। रियल वर्ल्ड हास्केल में कुछ examples हैं। यदि आपके पार्सर के पास अच्छे सब-पार्ट्स हैं तो आप कुछ सरल परीक्षण (या HUnit का उपयोग करके) सुनिश्चित कर सकते हैं ताकि वे अपेक्षाकृत अलग से काम कर सकें।

    +0

    हाँ, मुझे लगता है कि उदारतापूर्वक '' छिड़काव शायद सबसे अच्छा मैं कर सकता था। उम्मीद कर रहे थे कि विशेष रूप से पैरासेक डीबग करने के लिए डिज़ाइन किए गए टूल होंगे। – Xodarap

    0

    एक और उपयोगी चाल:

    _ <- many anyChar >>= fail यह एक की त्रुटि (Left) उत्पन्न करेगा:

    unexpected end of input 
    the remaining 'string' 
    
    संबंधित मुद्दे