আমি জানি এই প্রশ্নটি 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;
};
আপনার প্রশ্নটি কীভাবে অতিক্রম করতে হবে? এই ক্ষেত্রে ট্র্যাভারিংয়ের নাম ভিজিটিং নোড । প্রতিটি নোডে পরিদর্শন করার জন্য প্রতিটি সিন্ট্যাক্স নোডের ডেটা কীভাবে মূল্যায়ন করা যায় তা নির্ধারণ করতে আপনি প্রতিটি নোড প্রকারের ব্যবহার প্রয়োজন।
এখানে সি এর অন্য একটি উদাহরণ যেখানে আমি কেবল প্রতিটি নোডের বিষয়বস্তু মুদ্রণ করি:
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
বিবৃতি নির্মাণ! মনে রাখবেন যে যদি বিবৃতিতে অন্য একটি haveচ্ছিক বিধিও থাকতে পারে। আসুন যদি আমাদের মূল নোড কাঠামোতে if-other বিবৃতি যুক্ত করা যাক। মনে রাখবেন যে বিবৃতিগুলি যদি বিবৃতিতেও থাকে তবে যদি আমাদের নোড সিস্টেমের মধ্যে এক ধরণের পুনরাবৃত্তি ঘটতে পারে। অন্য বিবৃতিগুলি alচ্ছিক তাই 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
এই সি কোড যুক্ত করে এএসটি রচনা বিবৃতিটি সমন্বিত করতে পারি :
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;
এর মত সহজ! উপসংহারে, সিনট্যাক্স ট্রি গাছের ট্যাগযুক্ত ইউনিয়নের গাছ এবং এটির নিজের ডেটা থেকে অনেক বেশি নয়!