मुझे पता है कि यह प्रश्न 4+ वर्ष पुराना है, लेकिन मुझे लगता है कि मुझे और विस्तृत उत्तर जोड़ना चाहिए।
सार सिंटैक्स पेड़ अन्य पेड़ों से अलग नहीं बनाए जाते हैं; इस मामले में अधिक सच बयान यह है कि सिंटैक्स ट्री नोड्स में नोड्स के रूप में पर्याप्त मात्रा में नोड्स की आवश्यकता होती है।
एक उदाहरण बाइनरी एक्सप्रेशंस है जैसे कि 1 + 2
एक सरल अभिव्यक्ति जो कि दाएं और बाएं नोड को पकड़े हुए एक एकल रूट नोड बनाएगी जो डेटा को संख्याओं के बारे में रखती है। सी भाषा में, यह कुछ इस तरह दिखेगा
struct ASTNode;
union SyntaxNode {
int64_t llVal;
uint64_t ullVal;
struct {
struct ASTNode *left, *right;
} BinaryExpr;
};
enum SyntaxNodeType {
AST_IntVal, AST_Add, AST_Sub, AST_Mul, AST_Div, AST_Mod,
};
struct ASTNode {
union SyntaxNode *Data;
enum SyntaxNodeType Type;
};
आपका सवाल यह भी था कि कैसे किया जाए? इस मामले में ट्रैवर्सिंग को विजिटिंग नोड्स कहा जाता है । प्रत्येक नोड का दौरा करने के लिए आवश्यक है कि आप प्रत्येक नोड प्रकार का उपयोग करके यह निर्धारित करें कि प्रत्येक सिंटैक्स नोड के डेटा का मूल्यांकन कैसे करें।
यहाँ C में इसका एक और उदाहरण दिया गया है जहाँ मैं प्रत्येक नोड की सामग्री को प्रिंट करता हूँ:
void AST_PrintNode(const ASTNode *node)
{
if( !node )
return;
char *opername = NULL;
switch( node->Type ) {
case AST_IntVal:
printf("AST Integer Literal - %lli\n", node->Data->llVal);
break;
case AST_Add:
if( !opername )
opername = "+";
case AST_Sub:
if( !opername )
opername = "-";
case AST_Mul:
if( !opername )
opername = "*";
case AST_Div:
if( !opername )
opername = "/";
case AST_Mod:
if( !opername )
opername = "%";
printf("AST Binary Expr - Oper: \'%s\' Left:\'%p\' | Right:\'%p\'\n", opername, node->Data->BinaryExpr.left, node->Data->BinaryExpr.right);
AST_PrintNode(node->Data->BinaryExpr.left); // NOTE: Recursively Visit each node.
AST_PrintNode(node->Data->BinaryExpr.right);
break;
}
}
ध्यान दें कि फ़ंक्शन किस प्रकार के नोड के अनुसार हम प्रत्येक नोड पर जाते हैं।
चलो एक अधिक जटिल उदाहरण जोड़ते हैं, एक if
बयान निर्माण! याद है कि अगर बयानों में एक वैकल्पिक विकल्प भी हो सकता है। आइए हमारे मूल नोड संरचना में if-else स्टेटमेंट जोड़ें। याद रखें कि यदि स्टेटमेंट्स में स्वयं स्टेटमेंट भी हो सकते हैं, तो हमारे नोड सिस्टम के भीतर एक प्रकार की पुनरावृत्ति हो सकती है। वैकल्पिक विवरण वैकल्पिक होते हैं इसलिए elsestmt
फ़ील्ड NULL हो सकती है जिसे पुनरावर्ती आगंतुक फ़ंक्शन अनदेखा कर सकता है।
struct ASTNode;
union SyntaxNode {
int64_t llVal;
uint64_t ullVal;
struct {
struct ASTNode *left, *right;
} BinaryExpr;
struct {
struct ASTNode *expr, *stmt, *elsestmt;
} IfStmt;
};
enum SyntaxNodeType {
AST_IntVal, AST_Add, AST_Sub, AST_Mul, AST_Div, AST_Mod, AST_IfStmt, AST_ElseStmt, AST_Stmt
};
struct ASTNode {
union SyntaxNode *Data;
enum SyntaxNodeType Type;
};
हमारे नोड विजिटर प्रिंट फंक्शन में वापस बुलाया जाता है AST_PrintNode
, हम if
इस C कोड को जोड़कर कथन AST निर्माण को समायोजित कर सकते हैं :
case AST_IfStmt:
puts("AST If Statement\n");
AST_PrintNode(node->Data->IfStmt.expr);
AST_PrintNode(node->Data->IfStmt.stmt);
AST_PrintNode(node->Data->IfStmt.elsestmt);
break;
इतना सरल है! अंत में, सिंटेक्स ट्री एक टैग किए गए पेड़ के पेड़ और उसके डेटा से बहुत अधिक नहीं है!