2012-12-10 22 views
7

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

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

मुझे Automatically generate C++ file from header? देखा गया है लेकिन उत्तर C++ विशिष्ट प्रतीत होते हैं।

तो, उन लोगों के लिए जिन्हें सरल शब्दों में वर्णित प्रश्न की आवश्यकता है, मैं हेडर फ़ाइल को दिए गए कार्यान्वयन की पीढ़ी को कैसे स्वचालित कर सकता हूं? मैं एक मौजूदा उपकरण पसंद करूंगा - एक सरल समाधान पर मेरा वर्तमान सबसे अच्छा अनुमान pycparser का उपयोग कर रहा है।

अद्यतन धन्यवाद दोस्तों। दोनों अच्छे जवाब। मेरे वर्तमान हैक भी पोस्ट किया।

+0

अब आपने वास्तव में एक प्रश्न पूछा है जहां तक ​​मैं देखता हूं, लेकिन मैं आपके मौजूदा उपकरण की मांग कर रहा हूं जो ऐसा कर सकता है? दुर्भाग्य से मुझे कोई उपकरण नहीं पता है, लेकिन यह हल करने के लिए त्वरित पायथन (या किसी अन्य उच्च स्तरीय भाषा) कार्यान्वयन के लिए पर्याप्त बुनियादी लगता है? – Jite

+0

मैंने प्रश्न स्पष्ट किया है। हाँ, मैं ऐसा करने के लिए एक प्रोग्राम लिख सकता हूं। लेकिन यह मामूली नहीं है - उदाहरण के लिए, इसे एक सभ्य पार्सर की आवश्यकता होती है। हेडर काफी बड़ा है, और पर्याप्त जटिल है, कि एक विज्ञापन-hoc regexp आधारित kludge एक समय लेने वाली गड़बड़ होने जा रहा है। –

+0

हाय, क्या प्रक्रिया को आसानी से दोहराने की आवश्यकता है? उदाहरण के लिए, क्या आप एपीआई के नए संस्करण जारी किए जाने पर स्टब कार्यान्वयन को अपडेट करने में सक्षम होना चाहते हैं? – OlduwanSteve

उत्तर

1

यूएमएल मॉडलिंग उपकरण पसंद की भाषा में डिफ़ॉल्ट कार्यान्वयन उत्पन्न करने में सक्षम हैं। आम तौर पर स्रोत कोड आयात करने के लिए भी समर्थन होता है (सी हेडर सहित)। आप अपने हेडर आयात करने और उनसे स्रोत कोड जेनरेट करने का प्रयास कर सकते हैं। मुझे व्यक्तिगत रूप से Enterprise Architect के साथ अनुभव है और यह इन दोनों परिचालनों का समर्थन करता है।

+0

आह हाँ, शायद यह होगा (हालांकि प्रिंट स्टेटमेंट नहीं)। हालांकि शायद केवल भुगतान संस्करण में, और मेरे पास वर्षों तक लाइसेंस नहीं है। इसे जांच लेंगे। धन्यवाद। –

+0

मेरा मानना ​​है कि मुफ्त उपकरण भी हैं जो यह सामान कर सकते हैं, Google – SomeWittyUsername

+0

से पूछें कि यह मामला होता है कि मुफ्त uml उपकरण बहुत चूसते हैं (ईए के प्रशंसक हैं, सिर्फ ऐसे ग्राहक नहीं हैं जो उम चाहते हैं), लेकिन यह बदल गया हो सकता है। देखेंगे। –

1

चेतावनी: यह एक unresearched जवाब के रूप में मैं नहीं अपने आप को इसके साथ किसी भी अनुभव है है।

मुझे लगता है कि आप इकाई परीक्षण के लिए बनाया गया एक मजाक ढांचे के साथ कुछ भाग्य हो सकता है। इस तरह के एक ढांचे का एक उदाहरण है: cmock

परियोजना पेज चलता है कि यह एक हैडर से कोड जनरेट करेगा। फिर आप कोड ले सकते हैं और इसे ट्वीक कर सकते हैं।

+0

यह एक दिलचस्प विचार है, धन्यवाद। मैं वर्तमान में प्रारूप में हेडर प्राप्त करने के लिए सीपीपी के साथ लड़ने के बीच में हूं, लेकिन इस दृष्टिकोण के बारे में और सोचूंगा। –

2

इसलिए, मैं "सुझाव" के रूप में ई सुझाव को चिह्नित करने जा रहा हूं क्योंकि मुझे लगता है कि यह शायद सामान्य रूप से सबसे अच्छा विचार है। हालांकि मुझे लगता है कि cmock सुझाव tdd दृष्टिकोण में बहुत अच्छी तरह से काम करेगा जहां लाइब्रेरी विकास परीक्षण विफलताओं द्वारा संचालित किया गया था, और मैं इसे कोशिश कर सकता हूं। लेकिन अभी के लिए, मुझे एक त्वरित + गंदे दृष्टिकोण की आवश्यकता है जो एक इंटरेक्टिव तरीके से काम करता है (प्रश्न में पुस्तकालय एक अन्य, इंटरैक्टिव, प्रोग्राम के लिए गतिशील रूप से लोड प्लगइन है, और मैं एपीआई कॉल के अनुक्रम को इंजीनियर करने की कोशिश कर रहा हूं ...)

तो मैं जो कर रहा हूं वह एक पाइथन स्क्रिप्ट लिख रहा था जो pycparse को कॉल करता है। अगर मैं दूसरों की मदद करता हूं, तो मैं इसे यहां शामिल कर दूंगा, लेकिन यह बिल्कुल सामान्य नहीं है (उदाहरण के लिए, सभी फ़ंक्शंस int int को मानते हैं, और टाइप किए गए फ़्लीफ़ीफ़ के अंदर func defs से बचने के लिए हैक है)।

from pycparser import parse_file 
from pycparser.c_ast import NodeVisitor 


class AncestorVisitor(NodeVisitor): 

    def __init__(self): 
     self.current = None 
     self.ancestors = [] 

    def visit(self, node): 
     if self.current: 
      self.ancestors.append(self.current) 
     self.current = node 
     try: 
      return super(AncestorVisitor, self).visit(node) 
     finally: 
      if self.ancestors: 
       self.ancestors.pop(-1) 


class FunctionVisitor(AncestorVisitor): 

    def visit_FuncDecl(self, node): 
     if len(self.ancestors) < 3: # avoid typedefs 
      print node.type.type.names[0], node.type.declname, '(', 
      first = True 
      for param in node.args.params: 
       if first: first = False 
       else: print ',', 
       print param.type.type.names[0], param.type.declname, 
      print ')' 
      print '{fprintf(stderr, "%s\\n"); return 0;}' % node.type.declname 


print '#include "myheader.h"' 
print '#include <stdio.h>' 
ast = parse_file('myheader.h', use_cpp=True) 
FunctionVisitor().visit(ast) 
संबंधित मुद्दे