هذا هو الأمر btyacc الذي يمكن تشغيله في موفر الاستضافة المجاني OnWorks باستخدام إحدى محطات العمل المجانية المتعددة عبر الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت
برنامج:
اسم
بتياك - ان لالر(1) مولد محلل مع دعم التراجع
موجز
بتياك [-ب بادئة] [-د] [-داسم ...] [-E] [-l] [-r] [-S x.ske] [-تلفزيون]
اسم الملف.y
الوصف
btyacc هو نسخة معدلة من byacc (Berkeley YACC)، والذي بدوره هو مجال عام
نسخة من مولد المحلل اللغوي AT&T YACC الأصلي.
يقرأ btyacc المواصفات النحوية في الملف اسم الملف.y ويولد ملف LR(1)
محلل لذلك. يتكون المحلل من مجموعة من لالر(1) تحليل الجداول وروتين السائق
مكتوبة بلغة البرمجة C. يقوم btyacc عادةً بكتابة جداول التحليل وملف
روتين سائق إلى الملف بادئة.tab.c، حيث بادئة الإعدادات الافتراضية هي `y'.
للحصول على وصف تفصيلي لشكل المواصفات النحوية، وممتاز
برنامج تعليمي حول كيفية استخدام الأدوات المشابهة لـ YACC، راجع دليل المعلومات الخاص بـ GNU البيسون. بتياك-
يتم شرح ملحقات محددة أدناه.
ملحوظة: يتم تجميع هيكل المحلل اللغوي الذي يوفره مؤلف btyacc فقط كـ C++. يستخدم
الهيكل العظمي /usr/doc/btyacc/examples/btyacc-c.ske لإنشاء محلل يجمع كليهما
مثل C وC++. (لسوء الحظ، هذا الهيكل البديل لا يتحقق حاليًا من malloc()
القيم المرجعة.)
مزيد من الخيارات
-b بادئة قم بتغيير البادئة المُلحقة بأسماء ملفات الإخراج إلى السلسلة المُشار إليها بـ
بادئة. البادئة الافتراضية هي الحرف `y'.
-d قم بإنشاء ملف رأس يسمى بادئة.tab.h الرائعة بالإضافة إلى بادئة.tab.c,
تحتوي على تعريفات الرمز وإعلان النوع و يلفال.
-Dاسم تعريف متغير المعالج btyacc اسم، للاستعمال مع ٪ ifdef اسم
التوجيهات في الملف النحوي.
-E اطبع القواعد النحوية المُجهزة مسبقًا إلى الإخراج القياسي.
-ل لا تدخل #خط التوجيهات في رمز المحلل اللغوي الذي تم إنشاؤه.
-r اكتب رمز المحلل اللغوي والجداول المرتبطة بملفات مختلفة. في حين أن
يمكن العثور على الجداول في بادئة.tab.c كما كان من قبل، يتم الآن كتابة التعليمات البرمجية
إلى بادئة.code.c.
-S x.ske حدد هيكلًا محللًا مختلفًا. يتم ربط الهيكل العظمي الافتراضي في
البرنامج، ولكن يمكن العثور على نسخة في الملف btyaccpa.ske.
-t يتسبب في تجميع تعليمات برمجية لتصحيح الأخطاء في المحلل اللغوي الذي تم إنشاؤه.
-v اكتب وصفًا يمكن قراءته بواسطة الإنسان للمحلل اللغوي الذي تم إنشاؤه y.output. هذا
يتضمن حالات المحلل اللغوي وإجراءات رمز التطلع المستقبلي ومعلومات حول أي منها
الصراعات.
بتياكك اضافات المتصفح
التراجع تقنية
عندما يواجه المحلل اللغوي الذي تم إنشاؤه بواسطة btyacc خطأً في تقليل الإزاحة أو تقليل التقليل في ملف
في جدول التحليل، يتذكر نقطة التحليل الحالية (حالة المكدس ودفق الإدخال)، ويذهب
في وضع التحليل التجريبي. ثم يستمر في التحليل، متجاهلاً معظم إجراءات القاعدة. إذا تم تشغيله
إلى خطأ (إما من خلال جدول التحليل أو من خلال استدعاء الإجراء ييرور)، هو - هي
يتراجع إلى نقطة الصراع الأخيرة ويحاول بديلاً مختلفًا. لو أنه
يجد مسارًا ناجحًا (يصل إلى نهاية الإدخال أو استدعاءات الإجراء YYVALID)، هو - هي
يتراجع إلى النقطة التي دخل فيها لأول مرة في وضع التحليل التجريبي، ويستمر بملف كامل
تحليل (تنفيذ جميع الإجراءات)، باتباع مسار التجربة الناجحة.
الإجراءات في btyacc تأتي في نكهتين: {} الإجراءات التي يتم تنفيذها فقط عندما لا تكون موجودة
الوضع التجريبي، و [] الإجراءات التي يتم تنفيذها بغض النظر عن الوضع.
مثال: في قواعد YACC للغة C، هناك اختراق قياسي يُعرف باسم "اختراق ردود الفعل lexer".
تستخدم للعثور على أسماء typedef. يستخدم المعجم المعلومات الدلالية لتحديد ما إذا كان هناك أي منها
المعرف هو اسم typedef أم لا ويقوم بإرجاع رمز مميز. مع btyacc، لا
تعد بحاجة للقيام بذلك؛ يجب على المعجم دائمًا إرجاع المعرف. بتياك
النحو يحتاج بعد ذلك إلى قاعدة النموذج:
أكتب اسم: ID [ if (!IsTypeName(LookupId($1))) ييررور؛ ]
ومع ذلك، لاحظ أن إضافة قواعد التراجع يؤدي إلى إبطاء المحلل اللغوي. في الممارسة العملية، أنت
يجب أن نحاول تقييد عدد التعارضات في القواعد بما هو مطلق
ضروري. فكر في استخدام "اختراق تعليقات lexer" إذا كان حلاً نظيفًا، و
احتياطي التراجع لعدد قليل من الحالات الخاصة.
تجري btyacc تجاربها باستخدام القاعدة "حاول التبديل أولاً، ثم حاول تقليل الترتيب
أن القواعد المتعارضة تظهر في ملف الإدخال". وهذا يعني أنه يمكنك التنفيذ
قواعد توضيح الدلالات مثل، على سبيل المثال: (1) إذا بدا وكأنه إعلان، فهو كذلك،
وإلا (2) إذا بدا وكأنه تعبير فهو كذلك، وإلا (3) فهو خطأ نحوي
[إيليس وستروستروب، الدليل المرجعي المشروح لـ C++، صفحة 93]. لتحقيق ذلك، ضع كل
قواعد الإعلانات قبل قواعد التعبيرات في الملف النحوي.
يتم تشغيل التراجع فقط عندما يصل التحليل إلى إزاحة/تقليل أو تقليل/تقليل
الصراع في الجدول. إذا لم يكن لديك أي تعارض في قواعد اللغة الخاصة بك، فلا توجد تكلفة إضافية،
بخلاف بعض التعليمات البرمجية الإضافية التي لن يتم استدعاؤها أبدًا.
حاليا، ينفذ المحلل اللغوي الذي تم إنشاؤه لا تشذيب مسارات التحليل البديلة. لتجنب
انفجار هائل للمسارات المحتملة (ووقت التحليل)، عليك أن تخبره يدويًا
المحلل اللغوي عندما يمكنه التخلص من المسارات المحفوظة باستخدام YYVALID إفادة. في
الممارسة، تبين أن هذا أمر سهل إلى حد ما. على سبيل المثال، يمكن لمحلل C++ فقط
تحتوي على [YYVALID؛] بعد كل قاعدة إعلان وبيان كاملة، مما يؤدي إلى
يتم تقليم حالة التراجع بعد رؤية `؛' أو `}' - لن يكون هناك أبدًا
الوضع الذي يكون فيه من المفيد التراجع عن أي منهما.
تحسن رمز ان يرتفع المركز معالجة
غالبًا ما يحتاج المترجمون إلى بناء ASTs (أشجار بناء جملة مجردة) بحيث تكون كل عقدة في الشجرة
يمكن أن ترتبط بمصدر البرنامج الذي تم تحليله والذي جاء منه. ال YYPOSN آلية مدعومة
بواسطة btyacc يساعدك في أتمتة حساب موضع النص وتعيين
مواضع النص المحسوبة إلى العقد AST.
في YACCs القياسية، يحتوي كل رمز مميز وكل محطة غير طرفية على النوع القيمة الدلالية
أضفها له. مع btyacc، كل رمز مميز وكل محطة غير طرفية لها أيضًا عنوان YYPOSN نص
الموقف الملحق به. YYPOSN هو نوع محدد من قبل المستخدم.
يحتفظ btyacc بمكدس قيم موضع النص بنفس الطريقة التي يحتفظ بها بالمكدس
من القيم الدلالية. للاستفادة من ميزة موضع النص، عليك القيام بذلك # تعريف القادم
التالية:
YYPOSN رمز المعالج المسبق لنوع C/C++ لموضع النص المرفق بكل
رمزية وغير المحطة.
yyposn متغير عالمي من النوع YYPOSN. يجب على المعجم تعيين موضع النص للملف
تم إرجاع الرمز المميز إلى yyposn، تمامًا كما يعين القيمة الدلالية لـ
تم إرجاع الرمز المميز إلى yylval.
YYREDUCEPOSNFUNC
رمز المعالج المسبق لوظيفة يتم استدعاؤها مباشرة بعد الوظيفة العادية
تم إجراء تقليل القواعد النحوية لتقليل مواضع النص الموجودة في
المدخنة.
عادةً، تقوم هذه الوظيفة باستخراج مواضع النص من قاعدة الجانب الأيمن
المكونات وإما أن تقوم بتعيينها إلى البنية/الشجرة $$ التي تم إرجاعها، أو إذا لم يكن الأمر كذلك
يتم إرجاع قيمة $$، مما يضعها في موضع النص حيث ستكون
التقطتها قواعد أخرى في وقت لاحق. النموذج الأولي الخاص به هو:
باطل تقليلPosn(
YYPOSN& عطن,
يبوسن* term_posns,
YYSTYPE* term_vals,
مادبا term_no,
مادبا stk_pos,
مادبا yychar,
YYPOSN& yyposn,
نوع المستخدم احتفل على);
ret مرجع إلى موضع النص الذي أرجعته القاعدة. يجب عليك الكتابة فوق
هذا مع موضع النص المحسوب الذي تنتجه القاعدة، مشابهًا لـ
القيمة الدلالية $$.
term_posns
مصفوفة من مكونات قاعدة الجانب الأيمن YYPOSN مواضع النص،
مماثل لـ $1، $2، ...، $N للقيم الدلالية.
term_vals صفيف مكونات قاعدة الجانب الأيمن' النوع قيم. هؤلاء هم
$1، ...، $N أنفسهم.
term_no عدد المكونات الموجودة على الجانب الأيمن من القاعدة المخفضة، أي
حجم صفائف term_posns وterm_vals. يساوي أيضًا N في $1، ...،
$ن.
stk_pos النوع/YYPOSN موقف المكدس قبل التخفيض.
رمز yychar Lookahead الذي يتبع مباشرة الجانب الأيمن المصغر
المكونات.
yyposn YYPOSN من الرمز الذي يتبع مباشرة الجانب الأيمن المصغر
المكونات.
تم تمرير وسيطة إضافية محددة من قبل المستخدم إلى ReducPosn.
YYREDUCEPOSNFUNCARG
تم تمرير وسيطة إضافية إلى الدالة ReducPosn. هذه الحجة يمكن أن تكون أي
متغير محدد في btyaccpa.ske.
رمز إلغاء التخصيص أثناء خطأ استرجاع
بالنسبة لمعظم مولدات المحلل اللغوي المشابهة لـ YACC، فإن عمل المحلل اللغوي الذي تم إنشاؤه عند مواجهته
خطأ التحليل هو التخلص من القيم الدلالية ورموز الإدخال حتى تحتوي القاعدة على
الخاصة غير الطرفية خطأ يمكن أن تكون مطابقة. يتم التخلص من الرموز المميزة ببساطة عن طريق
الكتابة فوق المتغيرات وإدخالات الصفيف من النوع النوع بقيم جديدة.
ولسوء الحظ، يؤدي هذا النهج إلى تسرب الذاكرة إذا النوع هو نوع المؤشر. com.btyacc
يتيح لك توفير وظائف لتنظيف القيم الدلالية وموضع النص، من خلال
# تعريفوضع الرموز التالية في مقدمة ملف القواعد الخاص بك:
YYDELETEVAL
رمز المعالج المسبق لوظيفة يتم استدعاؤها قبل القيمة الدلالية للرمز المميز
أو يتم التخلص من غير المحطة.
YYDELETEPOSN
رمز المعالج المسبق لوظيفة يتم الاتصال بها قبل موضع النص للرمز المميز
أو يتم التخلص من غير المحطة.
يتم استدعاء كلتا الدالتين باستخدام وسيطتين. الوسيطة الأولى من النوع النوع or YYPOSN
هي القيمة التي سيتم التخلص منها. الوسيطة الثانية هي من النوع مادبا وهي واحدة من
ثلاث قيم:
0 تجاهل رمز الإدخال
1 حالة تجاهل على المكدس
2 تنظيف المكدس عند الإجهاض
مفصل بناء الجملة خطأ التقارير
إذا كنت # تعريف متغير المعالج المسبق YYERROR_DETAILED في ملف القواعد الخاص بك، يجب عليك
حدد أيضًا وظيفة معالجة الأخطاء التالية:
باطل yyerror_detailed(
فحم * نص,
مادبا يخطئ,
YYSTYPE&
errt_value,
YYPOSN& errt_posn);
رسالة خطأ نصية
رمز الخطأ للرمز المميز الذي تسبب في الخطأ
errt_value
قيمة الرمز المميز الذي تسبب في الخطأ
موضع نص errt_posn للرمز المميز الذي تسبب في حدوث خطأ
قبل المعالج توجيهات
يدعم btyacc تعريف الرموز والتصرف عليها من خلال التوجيهات الشرطية بداخلها
الملفات النحوية، لا تختلف عن المعالج الأولي للغة C.
٪يُعرِّف اسم
حدد رمز المعالج اسم. أي ما يعادل تبديل سطر الأوامر
-Dاسم.
٪ ifdef اسم
إذا كان المعالج المتغير اسم تم تعريفه ومعالجة النص من هذا ٪ ifdef إلى
الختام ٪إنهاء إذا، وإلا تخطيها.
%endif التوجيه الختامي لـ ٪ ifdef. ٪ ifdefلا يمكن أن تكون متداخلة.
٪يشمل اسم الملف
محتويات عملية الملف المسمى اسم الملف. مستوى تعشيش واحد فقط ٪يشمل
مسموح.
معرف٪ STRING
أدخل `# معرف STRING"التوجيه في ملف الإخراج. STRING يجب أن يكون
ثابت السلسلة محاط بـ "".
موروث سمات
السمات الموروثة غير موثقة. (انظر README والكود المصدري btyacc لـ a
القليل من المعلومات.) إذا كنت تعرف كيفية عملهم، اتصل بي علىatterer@debian.org>!
البق
إن التعقيد الأسوأ للتحليل هو أمر أسي بالنسبة لأي قواعد نحوية تسمح بذلك
التراجع أن يحدث. بمعنى آخر، يشكل المحلل اللغوي الذي تم إنشاؤه بواسطة btyacc ملفًا
خطأ رفض الخدمة إذا تم استخدامه في التطبيقات التي يستطيع المهاجم توفيرها
البيانات المعدة خصيصا كمدخلات إلى المحلل اللغوي. (بالنسبة لجميع بيانات الإدخال "العادية"، فإن ملف
لا يمثل التعقيد الأسي المحتمل مشكلة في العادة.)
البيسون ٪توقع التوجيه غير معتمد.
لا يوجد ٪آخر و ٪ ifndef. ٪ ifdefالصورة و ٪يشمللا يمكن أن تكون متداخلة.
المؤلفون
روبرت كوربيتrobert.corbett@eng.sun.com> /corbett@berkeley.edu> كان واحدا من
المؤلفون الأصليون لبيركلي byacc. كريس دودchrisd@reservoir.com> كان متألقا
فكرة إضافة قدرات التراجع، وهو المسؤول عن التراجع الأولي
التغييرات. فاديم ماسلوفvadik@siber.com> تحسين الكود بشكل أكبر.
تمت كتابة هذه الوثيقة بواسطة ريتشارد أتيريرatterer@debian.org> لديبيان
توزيعة جنو/لينكس، ولكن تم التبرع بها للملكية العامة وبالتالي يمكن استخدامها بحرية
لأي غرض.
ملفات
/usr/doc/btyacc/examples/btyaccpa.ske
/usr/doc/btyacc/examples/btyacc-c.ske
/usr/doc/btyacc/README
يرى أيضا
البيسون(1) (أو "معلومات البيسون")، byacc(1), ياك(1), أنتلر(1)
بتياك(1)
استخدم btyacc عبر الإنترنت باستخدام خدمات onworks.net