يجب أن أكتب مترجم لغة موديل تظليل Direct3D باستخدام Flex / YACC؟

StackOverflow https://stackoverflow.com/questions/2239710

سؤال

سأقوم بإنشاء مترجم لغلق لغة تظليل Direct3D. البيئة المستهدفة للمنصة والتنمية في برنامج التحويل البرمجي موجودة في Windows / VC ++. بالنسبة لأولئك الذين ليسوا على دراية بلغة نموذج التظليل، فيما يلي أمثلة على الإرشادات التي تتكون لغةها من (بعض التعليمات قديمة بعض الشيء، ولكن بناء الجملة هو نفس النسخة التي سأستفصل إليها).

هنا

و هنا

أنا أفكر في Flex / YACC كإطار لتطوير المحول البرمجي. هل ستكون هذه مناسبة لهذا المنصب؟ هل هناك أي إطار أفضل للتطوير في C ++ الأصلي؟

هل كانت مفيدة؟

المحلول

في رأيي، لن يساعد مولد Lexer و / أو المحلل النباتي العادي عادة في كتابة مجمع. إنهم مفيدون في الغالب في التعامل مع قواعد النحوية المعقدة نسبيا، ولكن في حالة وجود مجمع، فإن "القواعد النحوية" عادة ما يكون هذا المولد أكثر عائقا من المساعدة.

يعد المجمع النموذجي في الغالب طاولة طاولة - تبدأ بإنشاء جدول من رموز OP المعرفة، وخصائص التعليمات التي سيولدها (مثل عدد وأنواع السجلات التي يجب تحديدها لذلك). لديك عادة (أصغر، في حالة التظليل، ربما كثير أصغر) الجدول تحديد كيفية تشفير أوضاع المعالجة ومثل هذا.

يعمل معظم أعمال المجمع عن طريق الاستشارة إلى أن الجدول - أي أنه يقرأ شيئا من المدخلات، ومحاولات البحث عنه في الجدول. إذا لم يكن الأمر موجودا، فهو يعطي رسالة خطأ تقول إنها منظمة صحيحة غير معروفة. إذا تم العثور عليه، فهو يحصل على معلومات من الجدول حول عدد المعاملات المرتبطة بهذا الرمز المرجع. يحاول أن تقرأ أن العديد من المعاملات. إذا لم يستطع أنه، فإنه يعطي خطأ يقول خطأ في التعليمة. إذا كان بإمكانه، فإنه يرمز التعليمات، ويبدأ أكثر من ذلك.

هناك بعض الأماكن التي يجب أن تتعامل معها أكثر قليلا من ذلك، بالطبع. حيث / عندما تحدد شيئا مثل التسمية، يتعين عليه تسجيل اسم وموقف هذه الملصق في جدول الرمز. عندما يواجه شيئا مثل فرع لهذا العنوان، يتعين عليه البحث عن الهدف وترميز عنوانه بشكل مناسب.

فقط عندما / إذا قررت دعم وحدات الماكرو التي تغادر الكثير من هذا النموذج الأساسي. اعتمادا على مدى صعودك معهم، قد يكون من المفيد استخدام مولد محلل المحلل ومثله لمرفق توسيع ماكرو. ثم مرة أخرى، بالنظر إلى أن التظليل غالبا ما تكون صغيرة جدا، فإن وحدات الماكرو ليس من المحتمل أن تكون أولوية عالية للغاية لمثل هذا المجمع.

تحرير: إعادة قراءة ذلك، ربما يجب أن أوضح / صحيح نقطة واحدة. استخدام مولد المحلل المحلل ليس كثيرا عندما يصبح القواعد نفسها معقدا، كما عندما يسمح القواعد بتصريحات معقدة. النظر في قواعد اللغة التافهة حقا:

expression := expression '+' value
            | expression '-' value
            | value

على الرغم من أن هذا يسمح فقط بالإضافة والطرح، إلا أنه لا يزال يحدد العبارات المعقدة المعقدة بشكل تعسفي (أو على الأقل سلاسل طويلة تعسفا من القيم التي تتم إضافتها أو طرحها). بالطبع، حتى الآن لغة حقيقية تافهة إلى حد ما، ستحتوي عادة على مكالمات الضرب والقسمة والدالة، إلخ.

هذا يختلف كثيرا عن لغة التجميع النموذجية، حيث تحتوي كل تعليمات على تنسيق ثابت. على سبيل المثال، تتميز عملية الإضافة أو الطرح بالضبط المعاملتين المصدرين وأمعاء وجهة واحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top