2011-02-14 10 views
7

मैंने Irony में एक साधारण व्याकरण परिभाषित किया है, और एक अच्छा कॉम्पैक्ट एएसटी उत्पन्न किया है।आयरनी: एएसटी नोड्स का मूल्यांकन करने पर ट्यूटोरियल?

अब मैं यह पता लगाने की कि यह कैसे मूल्यांकन करने के लिए कोशिश कर रहा हूँ। समस्या यह है कि, मुझे यह कैसे करना है इस पर कोई ट्यूटोरियल नहीं मिल रहा है।

class TagListNode : AstNode 
{ 
    public override void Init(ParsingContext context, ParseTreeNode treeNode) 
    { 
     base.Init(context, treeNode); 
     AsString = "TagList"; 
     foreach (var node in treeNode.ChildNodes) 
      AddChild(null, node); 
    } 

    public override void EvaluateNode(Irony.Interpreter.EvaluationContext context, AstMode mode) 
    { 
     foreach (var node in ChildNodes) 
      node.EvaluateNode(context, AstMode.Read); 
    } 
} 

class TagBlockNode : AstNode 
{ 
    public AstNode Content; 

    public override void Init(ParsingContext context,ParseTreeNode treeNode) 
    { 
     base.Init(context, treeNode); 
     AsString = treeNode.ChildNodes[0].FindTokenAndGetText(); 
     Content = AddChild(null, treeNode.ChildNodes[1]); 
    } 

    public override void EvaluateNode(EvaluationContext context, AstMode mode) 
    { 
     context.Write(string.Format("<{0}>", AsString)); 
     Content.EvaluateNode(context, AstMode.Read); 
     context.Write(string.Format("</{0}>", AsString)); 
    } 
} 

यह निम्न उत्पादन उत्पन्न होगा:

मैं सिर्फ 2 एएसटी नोड्स परिभाषित किया है

<html><head><title></title></head><body><h1></h1><p></p><p></p></body></html>3.14159265358979 

जबकि उत्पादन मैं चाहता है:

<html> 
    <head> 
     <title>page title</title> 
    </head> 
    <body> 
     <h1>header</h1> 
     <p>paragraph 1</p> 
     <p>3.14159265358979</p> 
    </body> 
</html> 

मैं डॉन मुझे लगता है कि मुझे Context.Write() का उपयोग करना चाहिए। नमूने context.Data पर पुशिंग सामग्री दिखाते हैं और उन्हें बंद कर देते हैं ... लेकिन मुझे पूरा यकीन नहीं है कि यह कैसे काम करता है।

मुझे लगता है कि pi अनुमान लगाया जाता है क्योंकि यह स्वचालित रूप से context.Data पर धक्का दिया जाता है और फिर अंत में एक तत्व पॉप हो जाता है ?? मैं बहुत पक्का नहीं हूँ।

कुछ पॉइंटर्स या ट्यूटोरियल का लिंक अच्छा होगा।

इसके अलावा, मैं विभिन्न नोड प्रकारों को कैसे संभालना चाहता हूं? प्रत्येक "टैग" में 4 अलग-अलग प्रकार की सामग्री हो सकती है: एक और टैग, एक स्ट्रिंग अक्षर, एक चर या एक संख्या। क्या मुझे जैसी चीजें EvaluateNode विधि में लिखनी चाहिए या क्या?


मैं this one पाया है लेकिन वे सिर्फ एएसटी से अधिक लूप और EvaluateNode का लाभ नहीं लेते।

और फिर this one जो डेटा स्टैक में एक ही मान को प्रतिस्थापित करता है ... लेकिन वास्तव में यह समझाता नहीं है कि यह कैसे आउटपुट या कुछ भी हो जाता है।


स्पष्ट रूप से, मैं विशेष रूप से पता है कि कैसे Irony.Ast.AstNode में EvaluateNode तरीकों ओवरराइड करने के लिए जो मैं चाहता करना चाहते हैं।

if (EvaluationContext.HasLastResult) 
     EvaluationContext.Write(EvaluationContext.LastResult + Environment.NewLine); 

कौन सा डिफ़ॉल्ट मूल्यांकन दिनचर्या में शामिल है .... शायद यह एक कैलकुलेटर अनुप्रयोग के लिए अच्छी तरह से काम करता है:


ठीक है, मैं इस लाइन के लिए अंत में पता लगाया है कि tidbit गए , लेकिन मेरे में इतना ज्यादा नहीं है। अब स्क्रिप्ट दुभाषिया को बाईपास करने का तरीका जानने का प्रयास कर रहा है, लेकिन तब मुझे नहीं पता कि ग्लोबल्स कैसे सेट करें।

उत्तर

0

एएसटी संरचना के माध्यम से पुनरावृत्ति करने का सबसे अच्छा तरीका आगंतुक pattern को कार्यान्वित करना है।

शायद यह link आपकी सहायता करता है।

+1

क्षमा करें, इनमें से कोई भी लिंक बहुत उपयोगी नहीं है ...बहुत यकीन है कि आयरनी पहले से ही आगंतुक पैटर्न, और mgrammar नियोजित करता है! = विडंबना। – mpen

+0

@ मार्क, अगर आप टैगबॉकनोड.इवलुएट नोड पर अगर अन्यथा उपयोग नहीं करना चाहते हैं, तो मुझे लगता है कि आपके व्याकरण को टैग के मूल्य से एक नया एस्टनोड बनाना चाहिए और विधि को ओवरराइड करना चाहिए या शायद टैगबॉकनोड बच्चे को कॉलिंग टूस्टिंग() ? ¿?. – Morvader

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