التعريف: بالنظر إلى لغة ، وتحديد تمثيل القواعد ، وتحديد مترجم يستخدم التمثيل لتفسير الجمل باللغة.
النوع: نمط سلوكي
مخطط الفصل:
وضع المترجم المترجم هو وضع نادراً ما يتم استخدامه ، ولم أستخدم هذا الوضع من قبل. دعنا نلقي نظرة على وضع المترجم المترجم.
هيكل وضع المترجم
مترجم مجردة: إعلان واجهة مجردة (أو فئة تجريدية) يتم تنفيذ جميع التعبيرات الملموسة إليها. الواجهة هي أساسا طريقة تفسير () ، تسمى عملية التفسير. يتم الانتهاء من مهمة التفسير المحددة من خلال فئات التنفيذ المختلفة ، ويتم الانتهاء من المترجم المحدد من قبل Terminator Terminalexpression و Outserexpression غير الطرفي غير الطرفي على التوالي.
تعبير المنهي: ينفذ عمليات التفسير المرتبطة بالعناصر في القواعد. عادة ، لا يوجد سوى تعبير واحد من المنهي في نمط مترجم ، ولكن هناك حالات متعددة ، تقابل أطراف مختلفة. نصف المنهي هو وحدة تشغيل في القواعد. على سبيل المثال ، هناك صيغة بسيطة R = R1+R2 ، حيث يكون R1 و R2 من المقبلات ، والمترجمين الفوريين المقابلين الذين يحجلين R1 و R2 هي أطراف.
التعبير غير الطرفي: كل قاعدة في القواعد النحوية تتوافق مع التعبير غير الطرفي. التعبيرات غير الطرفية هي عمومًا مشغليين أو كلمات رئيسية أخرى في القواعد. على سبيل المثال ، في الصيغة R = R1 + R2 ، + هي شخصية غير طرفية ، ومترجم تحليل + هو حرف غير طرفي. تزيد التعبيرات غير الطالبية وفقًا لتعقيد المنطق ، ومن حيث المبدأ تتوافق كل قاعدة قواعد النحوية مع التعبير غير الطرفي.
دور البيئة: يتم استخدام مهمة هذا الدور عمومًا لتخزين القيم المحددة المقابلة لكل مُمثلات في القواعد ، مثل R = R1+R2. نقوم بتعيين 100 إلى R1 و 200 إلى R2. يجب تخزين هذه المعلومات في دور البيئة. في كثير من الحالات ، نستخدم الخريطة للعمل كدور البيئة كافي.
مثال
دعنا نعطي مثالاً على الإضافة والطرح والضرب والتقسيم. فكرة التنفيذ تأتي من المثال في "Java and Pattern". يتم تنفيذ وظائف كل دور وفقًا للمواصفات المذكورة أعلاه.
// دور السياق (البيئة) ، استخدم hashmap لتخزين القيم العددية المقابلة لسياق فئة المتغيرات {private map valuemap = new hashmap () ؛ public void addvalue (متغير x ، int y) {Integer yi = new integer (y) ؛ valuemap.put (x ، yi) ؛ } public int lookupvalue (variable x) {int i = (integer) valuemap.get (x)). Intvalue () ؛ العودة أنا. }} // دور التعبير التجريدي ، يمكنك أيضًا استخدام واجهات لتنفيذ تعبير الفئة التجريدية {Public Abstract int transly (context con) ؛ }. ثابت عام (int i) {this.i = i ؛ } تفسير int العام (السياق con) {return i ؛ }} متغير الفئة يمتد Expression {public int truple (context con) {// هذا كائن متغير يدعو طريقة التفسير إلى إرجاع con.lookupvalue (هذا) ؛ }} // فئة دور التعبير غير المصممة إضافة تمديد التعبير {التعبير الخاص اليسار ، يمين ؛ العنوان العام (التعبير اليسار ، التعبير يمين) {this.left = left ؛ this.right = الحق ؛ } تفسير int العام (السياق con) {return left.InterPret (con) + right.InterPret (con) ؛ }} فئة طرح تمديد التعبير {التعبير الخاص اليسار ، يمين ؛ طرح عام (التعبير اليسار ، التعبير يمين) {this.left = left ؛ this.right = الحق ؛ } تفسير int العام (السياق con) {return left.interpret (con) - right.InterPret (con) ؛ }} class multiply يمتد التعبير {التعبير الخاص اليسار ، اليمين ؛ Multiply (التعبير اليسار ، التعبير يمين) {this.left = left ؛ this.right = الحق ؛ } int int pression (context con) {return left.InterPret (con) * right.InterPret (con) ؛ }} تقسيم الفئة يمتد التعبير {التعبير الخاص اليسار ، يمين ؛ القسم العام (التعبير اليسار ، التعبير يمين) {this.left = left ؛ this.right = الحق ؛ } تفسير int العام (السياق con) {try {return left.InterPret (con) / right.InterPret (con) ؛ } catch (ArithMeticexception ae) {system.out.println ("divorc is 0!") ؛ العودة -11111 ؛ }}} // اختبر البرنامج ، حساب (a*b)/(a-b+2) اختبار الفئة العامة {التعبير الثابت الخاص ؛ سياق ثابت خاص يخدع ؛ public static void main (string [] args) {con = new Context () ؛ // تعيين المتغيرات والثوابت المتغير A = متغير جديد () ؛ متغير B = متغير جديد () ؛ ثابت C = ثابت جديد (2) ؛ // تعيين المتغير con.addvalue (a ، 5) ؛ con.addvalue (b ، 7) ؛ // العملية ، نقوم بتحليل بنية الجملة بأنفسنا ، وبناء القسم الجديد = جديد مضاعف (أ ، ب) ، إضافة جديدة (طرح جديد (أ ، ب) ، ج)) ؛ System.out.println ("نتيجة العملية هي:"+ex.InterPret (con)) ؛ }} مزايا وعيوب وضع المترجم
المترجم هو أداة تحليل بناء الجملة بسيطة. ميزة أهمها هي قابليتها. يتطلب تعديل قواعد بناء الجملة فقط تعديل الأحرف غير الطرفية المقابلة. إذا قمت بتوسيع بناء الجملة ، فأنت بحاجة فقط إلى إضافة حرف غير طرفي.
ومع ذلك ، فإن نمط المترجم المترجم سيؤدي إلى توسيع الفئة ، ويحتاج كل بناء جملة لإنتاج تعبير غير طرفي. عندما تكون قواعد بناء الجملة معقدة نسبيًا ، قد يتم إنشاء عدد كبير من ملفات الفصل ، مما يسبب الكثير من المتاعب في الصيانة. في الوقت نفسه ، نظرًا لأن طريقة الاتصال العودية تم اعتمادها ، فإن كل تعبير غير طرفي يهتم فقط بالتعبيرات المتعلقة بنفسه. كل تعبير يحتاج إلى معرفة النتيجة النهائية ويجب أن يكون عودية. سواء كانت لغة موجهة نحو الكائن أو لغة موجهة نحو العملية ، فإن العودية هي طريقة غير موصى بها. نظرًا لاستخدام الكثير من الحلقات والتكرار ، فإن الكفاءة هي مشكلة لا يمكن تجاهلها. خاصة عند استخدامها لتفسير مجمع التحليل ، بناء الجملة المطولة ، تكون الكفاءة لا تطاق.
السيناريوهات المعمول بها لوضع المترجم
يمكن استخدام وضع المترجم المترجم في الحالات التالية:
هناك قاعدة بناء جملة بسيطة ، مثل بيان SQL. إذا كنا بحاجة إلى إجراء تحويل RM استنادًا إلى عبارات SQL ، فيمكننا استخدام نمط المترجم المترجم لتفسير البيان.
بعض المشكلات المتكررة ، مثل العمليات الأربع للإضافة والطرح والضرب والانقسام ، ولكن الصيغ مختلفة في كل مرة. في بعض الأحيان يكون A+BC*D ، وأحيانًا يكون CD*B+، وما إلى ذلك. الصيغ متغيرة باستمرار ، لكنها جميعها متصلة بأحرف الأربعة غير الطرفية للإضافة والطرح والتكاثر والتقسيم. في هذا الوقت ، يمكننا استخدام وضع المترجم.
أشياء يجب ملاحظتها
وضع المترجم المترجم هو في الحقيقة وضع نادرًا نسبيًا لأنه مزعج للغاية للحفاظ عليه. تخيل أنه إذا لم تكن مجموعة من المترجمين الفوريين غير الطرفي على دراية بقواعد القواعد المسبقة ، أو أن القواعد بسيطة بشكل خاص ، فسيكون من الصعب فهم منطقها. نادراً ما يستخدم وضع المترجم المترجم في تطوير النظام الفعلي لأنه يمكن أن يسبب مشاكل مثل الكفاءة والأداء والصيانة.