0Pricing
TypeScript Academy · درس

اجتياز AST باستخدام الزوّار

تنقّلوا بين عُقد شجرة الصياغة لتحليل بنية الشيفرة

اجتياز AST باستخدام الزوّار درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ما المقصود بـ AST؟

يحلل TypeScript الشيفرة المصدرية إلى شجرة بناء جملة مجرّدة (AST)، وهي شجرة من العُقد تمثل تراكيب اللغة مثل المتغيرات والدوال والتعبيرات.

import ts from "typescript";
const sf = ts.createSourceFile(
  "example.ts",
  "const x = 1;",
  ts.ScriptTarget.Latest
);

أنواع العُقد

تحتوي كل عقدة في AST على خاصية kind، وهي قيمة من تعداد ts.SyntaxKind، تحدد ما تمثله العقدة.

import ts from "typescript";
// Common kinds:
// ts.SyntaxKind.VariableDeclaration
// ts.SyntaxKind.FunctionDeclaration
// ts.SyntaxKind.Identifier

الزيارة باستخدام forEachChild

يستدعي ts.forEachChild(node, visitor) أداة الزيارة الخاصة بكم لكل ابن مباشر لعقدة. استخدموا العودية لاجتياز الشجرة كاملة.

function visit(node: ts.Node) {
  if (ts.isFunctionDeclaration(node)) {
    console.log("Function:", node.name?.text);
  }
  ts.forEachChild(node, visit);
}
visit(sourceFile);

دوال التحقق من النوع

يوفر TypeScript دوالًا للتحقق من النوع، مثل ts.isVariableDeclaration وts.isFunctionDeclaration، لتضييق أنواع العُقد بأمان.

ts.forEachChild(sf, node => {
  if (ts.isClassDeclaration(node)) {
    console.log("Class:", node.name?.getText());
  }
  if (ts.isInterfaceDeclaration(node)) {
    console.log("Interface:", node.name.getText());
  }
});

الحصول على نص العقدة

استخدموا node.getText(sourceFile) لاسترجاع النص المصدر الدقيق لعقدة، أو node.getFullText() للحصول عليه متضمنًا النصوص الوصفية.

ts.forEachChild(sf, node => {
  if (ts.isIdentifier(node)) {
    console.log("Id:", node.text);
  }
});

مواضع العُقد

تحتوي كل عقدة على موضعي pos وend، وهما إزاحتان محسوستان بعدد الأحرف، ويمكنكم استخدامهما لتحديد مواضع العُقد في المصدر.

ts.forEachChild(sf, node => {
  console.log(node.kind, "at", node.pos, "-", node.end);
});

الاجتياز باستخدام أداة مساعدة عودية

من الأدوات الشائعة دالة walk تطبّق زائرًا على كل عقدة في الشجرة بصورة递ّية.

function walk(node: ts.Node, visitor: (n: ts.Node) => void) {
  visitor(node);
  ts.forEachChild(node, child => walk(child, visitor));
}

العثور على جميع استدعاءات الدوال

استخدم اجتيازًا递ّيًا للعثور على جميع تعبيرات الاستدعاء في ملف المصدر، وهو أمر مفيد لاكتشاف استخدام واجهات API.

walk(sf, node => {
  if (ts.isCallExpression(node)) {
    const expr = node.expression.getText(sf);
    console.log("Call:", expr);
  }
});

الوصول إلى العقد الأصلية

لا تحتوي عقد AST على مؤشر إلى العقدة الأصلية افتراضيًا. استدعِ ts.setParent(sourceFile) أو استخدم program.getSourceFile، الذي يضبط العقد الأصلية تلقائيًا للبرامج.

// For manually created source files:
// (ts as any).setParents(sf);

استخدام TypeChecker مع العقد

ادمج اجتياز AST مع مدقق الأنواع لحل نوع TypeScript لأي عقدة تعبير.

const checker = program.getTypeChecker();
walk(sf, node => {
  if (ts.isExpression(node)) {
    const type = checker.getTypeAtLocation(node);
    console.log(checker.typeToString(type));
  }
});

مراجعة: اجتياز AST

اجتز شجرة AST في TypeScript باستخدام forEachChild ودوال حارسة للنوع. ادمج ذلك مع مدقق الأنواع لبناء أدوات قوية للتحليل الساكن وتوليد الشيفرة.

تحقق سريع

ما الدالة التي تزور العقد الأبناء递ّيًا في AST الخاصة بـ TypeScript؟

ما تعلمتموه

يستخدم اجتياز AST الدالة ts.forEachChild إلى جانب دوال حارسة للنوع لاجتياز كل عقدة في ملف TypeScript وفحصها. وبدمجه مع مدقق الأنواع، يمكن إنشاء أدوات linting ومحللات للشيفرة وأدوات لإعادة الهيكلة.

الأسئلة الشائعة

هل درس «اجتياز AST باستخدام الزوّار» مجاني؟

نعم — نص درس «اجتياز AST باستخدام الزوّار» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «اجتياز AST باستخدام الزوّار»؟

تنقّلوا بين عُقد شجرة الصياغة لتحليل بنية الشيفرة تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «اجتياز AST باستخدام الزوّار»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إنشاء برنامج TypeScript باستخدام API
  2. اجتياز AST باستخدام الزوّار
  3. المحوّلات المخصّصة وتوليد الشيفرة
  4. بناء أداة تدقيق بسيطة
← العودة إلى TypeScript Academy