2013-02-21 11 views
8

मेरे पास एक व्याकरण है जो आयरनी कंसोल में काम करता है और पार्स करता है, लेकिन मुझे एएसटी वृक्षदृश्य में कुछ भी नहीं मिलता है। मैं बेसिक-> जावास्क्रिप्ट आलेख के साथ यहां अनुसरण कर रहा था: http://www.codeproject.com/Articles/25069/JSBasic-A-BASIC-to-JavaScript-Compiler, लेकिन ऐसा लगता है कि Ast सामान को सभी को स्थानांतरित/हटा दिया गया है। मुझे Irony.Interpreter .dll मिला, जिसमें इसमें कुछ अस्थिर चीज़ें हैं, लेकिन ऐसा लगता है कि अभिव्यक्ति नमूना कार्यान्वयन में सभी बंधे हैं।अब मैं आयरन में एएसटी के साथ कैसे काम करूं?

मुझे यहां क्या याद आ रही है? मैं अपने पेड़ पर चलना चाहता हूं और स्रोत कोड उत्पन्न करना चाहता हूं, और मुझे यकीन नहीं है कि कहां से शुरू करना है।

मैंने विज़िटर पैटर्न का उपयोग करने का कुछ उल्लेख देखा है, जिसे मैं ठीक कर रहा हूं, लेकिन मुझे नहीं पता कि इसे कैसे कार्यान्वित किया जाए और इसे आयरिश पसंद के तरीके में चलाएं।

+2

मैंने अभी एएनटीएलआर पर स्विच किया है, इसलिए मुझे लगता है कि यह सब अब म्यूट है। बहुत कम मदद, यह दर्द होता है। ओह ठीक है, किसी भी के लिए धन्यवाद जो देखने के लिए समय ले लिया! –

उत्तर

5

आयरनी पर बने व्याकरण, पार्सर और एएसटी के संदर्भ कार्यान्वयन के लिए उपयुक्त नाम Sarcasm प्रोजेक्ट देखें। मुझे एएसटी बनाने में मदद करने के लिए लेखक द्वारा blog entry मिला।

एएसटी को चलाने और चलाने के लिए निम्नलिखित सामान्य उद्देश्य मार्गदर्शिका है।

  1. अपने व्याकरण (example)
  2. परिभाषित एक सार आधार वर्ग (MyBaseNode) से AstNode (example) पाने बनाएँ।कॉपी/उदाहरण
  3. के लिए से तरीकों पेस्ट प्रत्येक टर्मिनल और गैर टर्मिनल MyBaseNode और

    1. अवहेलना Accept विधि (example) से आया एक नया वर्ग बनाने के लिए:

    public override void Accept(IMyNodeVisitor visitor) { visitor.Visit(this); }

    1. ओवरराइड Init (ज्यादातर टर्मिनल पर) या InitChildren (गैर-टर्मिना एलएस) उपयुक्त के रूप में। यह वह जगह है जहां एएसटी जादू होता है।
  4. एक अंतरफलक IMyNodeVisitor जोड़े और प्रत्येक वर्ग पिछले चरण में परिभाषित के लिए एक Visit विधि जोड़ने (example):

    void Visit(MyDerivedNode1 node);

  5. अपने टर्मिनलों में से प्रत्येक के लिए और गैर ASTNodeType सेट चरण 1 से अपने व्याकरण में टर्मिनलों।

    1. (example)

      : - (example)

      MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

    2. गैर टर्मिनलों के लिए - (example)

      var MyNonTerminal2 = new NonTerminal("MyNonTerminal2", typeof(MyDerivedNode2));

  6. व्याकरण सक्षम एएसटी निर्माण में टर्मिनलों के लिए

    LanguageFlags = LanguageFlags.CreateAst;

+0

पवित्र धूम्रपान करता है। सरकस्म सिर्फ एक संदर्भ कार्यान्वयन नहीं है, यह 'सरकस्म, एक ईबीएनएफ-जैसे डीएसएल है जो आयरनी उत्पन्न करता है! यह हमारेोबोरोस के साथ मिश्रित की तरह है। – fostandy

+0

सरकस्म परियोजना का लिंक मर चुका है। (या यह है कि कुछ प्रकार का जानबूझकर "पहले पर कौन है" मजाक जो मुझे नहीं मिला?) – alx9r

3

आयरन पार्सिंग में 2 चरणों में किया जाता है। सबसे पहले यह एक पार्स पेड़ बनाता है और फिर यह आपके एएसटी पेड़ बनाता है।

आप केवल पहला कदम देख रहे हैं।

  1. यह बताओ कैसे एएसटी नोड्स के लिए अपने NonTerminals मैप करने के लिए करने के लिए:

    जैसे विडंबना के लिए आदेश एएसटी आप कर सकते हैं बनाने के लिए विडंबना नमूना व्याकरण ExpressionEvaluatorGrammar हम देखते हैं पर देख रहे हैं:

    var BinExpr = new NonTerminal("BinExpr", typeof(BinaryOperationNode));`  
    

    यहाँ हम कह रहे हैं विडंबना एक BinaryOperationNode जो हमारे एएसटी नोड है BinExpr nonterminal मैप करने के लिए।

  2. जब पार्स करने यह एएसटी उत्पन्न करें:

    आप इस ध्वज एएसटी पेड़ उत्पन्न हो जाएगा जब आप पार्स सेट करते हैं।

    this.LanguageFlags = LanguageFlags.CreateAst; 
    

अपने एएसटी पेड़ की जड़ तो हो जाएगा:

parseTree.Root.AstNode 

मैं this स्रोत के लिए एक महान शुरुआती बिंदु मिल गया।

संबंधित मुद्दे