نمط المترجم
في برمجة الحاسوب ، يُعد نمط المفسر نمط تصميم يُحدد كيفية تقييم الجمل في لغة برمجة معينة. وتتلخص الفكرة الأساسية في وجود فئة لكل رمز ( نهائي أو غير نهائي ) في لغة برمجة متخصصة . شجرة بناء الجملة في اللغة هي مثال على نمط التركيب ، وتُستخدم لتقييم (تفسير) الجملة للمستخدم. [ 1 ] : 243 انظر أيضًا نمط التركيب .
ملخص
يُعد نمط تصميم المفسر [ 2 ] أحد أنماط تصميم GoF الثلاثة والعشرين المعروفة التي تصف كيفية حل مشكلات التصميم المتكررة لتصميم برامج كائنية التوجه مرنة وقابلة لإعادة الاستخدام، أي كائنات يسهل تنفيذها وتغييرها واختبارها وإعادة استخدامها.
ما المشاكل التي يمكن أن يحلها نمط تصميم المترجم؟
المصدر: [ 3 ]
- ينبغي تحديد قواعد اللغة البسيطة
- حتى يمكن تفسير الجمل في اللغة.
عندما تحدث مشكلة ما بشكل متكرر، يمكن اعتبار تمثيلها كجملة بلغة بسيطة ( لغات خاصة بالمجال ) بحيث يمكن للمترجم حل المشكلة عن طريق تفسير الجملة.
على سبيل المثال، عندما يتعين تحديد العديد من تعابير البحث المختلفة أو المعقدة، فإن تنفيذها (دمجها) مباشرةً في فئة ما يُعدّ غير مرن لأنه يُلزم الفئة بتعابير محددة ويجعل من المستحيل تحديد تعابير جديدة أو تغيير التعابير الموجودة بشكل مستقل عن الفئة (دون الحاجة إلى تغييرها).
ما الحل الذي يصفه نمط تصميم المترجم؟
- قم بتعريف قواعد اللغة البسيطة من خلال تحديد
Expressionالتسلسل الهرمي للفئات وتنفيذinterpret()عملية ما. - قم بتمثيل جملة في اللغة بواسطة شجرة بناء جملة مجردة (AST) تتكون من
Expressionأمثلة. - قم بتفسير الجملة عن طريق استدعاء
interpret()شجرة التحليل النحوي (AST).
تُركّب كائنات التعبير بشكل متكرر في بنية مركبة/شجرية تُسمى شجرة بناء الجملة المجردة (انظر نمط التركيب ). لا يصف نمط المفسر كيفية بناء شجرة بناء الجملة المجردة. يمكن القيام بذلك إما يدويًا بواسطة العميل أو تلقائيًا بواسطة المحلل اللغوي .
انظر أيضًا إلى مخطط فئات وكائنات UML أدناه.
الاستخدامات
- لغات استعلام قواعد البيانات المتخصصة مثل SQL .
- لغات برمجة متخصصة تُستخدم غالبًا لوصف بروتوكولات الاتصال.
- تتضمن معظم لغات البرمجة ذات الأغراض العامة في الواقع العديد من اللغات المتخصصة .
بناء
مخطط فئات وكائنات UML

في مخطط فئات UML أعلاه ، تشير الفئة إلى الواجهة المشتركة لتفسير التعبير . لا تحتوي هذه الفئة على عناصر فرعية، وتُفسر التعبير مباشرةً. تحتفظ الفئة بحاوية للتعبيرات الفرعية ، وتُعيد توجيه طلبات التفسير إليها . ClientAbstractExpressioninterpret(context)TerminalExpressionNonTerminalExpressionexpressionsexpressions
يوضح مخطط تعاون الكائنات التفاعلات أثناء التشغيل: Clientيرسل الكائن طلب تفسير إلى شجرة بناء الجملة المجردة. يُعاد توجيه الطلب (يُنفذ على) جميع الكائنات في بنية الشجرة نزولاً. تُعيد الكائنات NonTerminalExpression( ntExpr1,ntExpr2) توجيه الطلب إلى تعبيراتها الفرعية. تُنفذ الكائنات TerminalExpression( ) عملية التفسير مباشرةً.tExpr1,tExpr2,…
مخطط فئات UML
![]()
مثال
يعتمد هذا التطبيق بلغة C++23 على نموذج التعليمات البرمجية لما قبل C++98 الموجود في الكتاب.
استيراد std ؛باستخدام String = std :: string ؛ قالب < typename K , typename V > باستخدام TreeMap = std :: map < K , V > ؛ قالب < typename T > باستخدام UniquePtr = std :: unique_ptr <T> ؛class BooleanExpression { public : BooleanExpression ( ) = default ; virtual ~ BooleanExpression ( ) = default ; virtual bool evaluate ( Context & ) = 0 ; virtual UniquePtr <BooleanExpression> replace ( String & , BooleanExpression & ) = 0 ; virtual UniquePtr <BooleanExpression> copy ( ) const = 0 ; } ;class VariableExpression ;class Context { private : TreeMap < const VariableExpression * , bool > m ; public : Context () = default ;[[ nodiscard ] ] bool lookup ( const VariableExpression * key ) const { return m.at ( key ) ; }void assign ( VariableExpression * key , bool value ) { m [ key ] = value ; } };class VariableExpression : public BooleanExpression { private : String name ; public : VariableExpression ( const String & name ) : name { name } {}virtual ~ VariableExpression () = default ;[[ nodiscard ] ] virtual bool evaluate ( Context & context ) const { return context.lookup ( this ) ; }[ [ nodiscard ] ] virtual UniquePtr <VariableExpression> replace ( const String & name , BooleanExpression & exp ) { if ( this- > name == name ) { return std :: make_unique <VariableExpression> ( exp.copy ( ) ) ; } else { return std :: make_unique <VariableExpression> ( name ) ; } }[ [ nodiscard ] ] virtual UniquePtr <BooleanExpression> copy ( ) const { return std :: make_unique <BooleanExpression> ( name ) ; }VariableExpression ( const VariableExpression & ) = delete ; VariableExpression & operator = ( const VariableExpression & ) = delete ; };class AndExpression : public BooleanExpression { private : UniquePtr < BooleanExpression > operand1 ; UniquePtr < BooleanExpression > operand2 ; public : AndExpression ( UniquePtr < BooleanExpression > op1 , UniquePtr < BooleanExpression > op2 ) : operand1 { std :: move ( op1 )}, operand { std :: move ( op2 )} {}virtual ~ AndExpression () = default ;[[ nodiscard ]] virtual bool evaluate ( Context & context ) const { return operand1- > evaluate ( context ) && operand2- > evaluate ( context ); }[ [ nodiscard ] ] virtual UniquePtr <BooleanExpression> replace ( const String & name , BooleanExpression & exp ) const { return std :: make_unique <AndExpression> ( operand1- > replace ( name , exp ) , operand2- > replace ( name , exp ) ) ; }[[ nodiscard ] ] virtual UniquePtr <BooleanExpression> copy () const { return std :: make_unique <AndExpression> ( operand1- > copy ( ) , operand2- > copy ( )) ; }AndExpression ( const AndExpression & ) = delete ; AndExpression & operator = ( const AndExpression & ) = delete ; };int main ( int argc , char * argv []) { UniquePtr < BooleanExpression > expression ; Context context ; UniquePtr < VariableExpression > x = std :: make_unique < VariableExpression > ( "X" ); UniquePtr < VariableExpression > y = std :: make_unique < VariableExpression > ( "Y" ); UniquePtr < BooleanExpression > expression ; = std :: make_unique < AndExpression > ( x , y );context.assign ( x.get (), false ); context.assign ( y.get ( ) , true ) ; bool result = expression- > evaluate ( context ) ; std :: println ( " { } " , result ) ;context.assign ( x.get ( ), true ); context.assign ( y.get ( ) , true ) ; result = expression- > evaluate ( context ) ; std :: println ( " { }" , result ) ; return 0 ; }مخرجات البرنامج هي:
0 1انظر أيضاً
مراجع
- ↑ غاما، إريك ؛ هيلم، ريتشارد ؛ جونسون، رالف؛ فليسيدس، جون (1994). أنماط التصميم: عناصر البرمجيات القابلة لإعادة الاستخدام والموجهة للكائنات . أديسون-ويسلي. ISBN 0-201-63361-2.
- ↑ إريك غاما، ريتشارد هيلم، رالف جونسون، جون فليسيدس (1994). أنماط التصميم: عناصر البرمجيات القابلة لإعادة الاستخدام والموجهة للكائنات . أديسون ويسلي. ص 243 وما بعدها . ISBN 0-201-63361-2.
{{cite book}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) - ↑ "نمط تصميم المترجم - المشكلة والحل والتطبيق" . w3sDesign.com . تم الاطلاع عليه بتاريخ 12 أغسطس 2017 .
- ↑ "نمط تصميم المترجم - البنية والتعاون" . w3sDesign.com . تم الاطلاع عليه بتاريخ 12 أغسطس 2017 .
روابط خارجية
- أنماط تصميم البرمجيات
