سؤال

واغفر لي، أنا جديدة تماما لتحليل ويكس / ياك، وأنا ربما في الطريق فوق رأسي، ولكن مع ذلك:

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

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

لا أحد يعرف كيف يمكن أن تحدد، بشكل أساسي، وهو 'التقاط أي شيء أن تبقى "رمزية؟ أم أن هناك طريقة أفضل يمكنني التعامل مع هذا؟

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

المحلول

وهناك المدمج في رمز error في ياك. يمكنك أن تفعل عادة شيء من هذا القبيل:

و

line: goodline | badline ;

badline : error '\n' /* Error-handling action, if needed */

وgoodline : equation '\n' ;

وسيتم التعامل مع أي الخط الذي لا يطابق equation التي كتبها badline.

وقد ترغب في استخدام yyerrok في الخطأ التعامل مع إجراءات لضمان معالجة الخطأ تتم إعادة تعيين للخط المقبل.

نصائح أخرى

وتعريف رمز (نهاية المدخلات)، وجعل الناتج lexer الخاص بك هو في نهاية الإدخال.

وهكذا من قبل، إذا كان لديك هذه الرموز:

'1' 'PLUS' '1'

وأنت الآن لديك:

'1' 'PLUS' '1' 'END_OF_INPUT'

والآن، يمكنك تعريف القاعدة المستوى الأعلى في محلل الخاص بك. بدلا من (على سبيل المثال):

Equation ::= EXPRESSION

وسيكون لديك

Equation ::= EXPRESSION END_OF_INPUT

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

وأنا عادة استخدام "قارئ الأمر 'منفصل للحصول على أمر كاملة - ربما خط في قضيتك - إلى سلسلة متغيرة المضيف، ومن ثم ترتيب لمحلل معجمي لتحليل السلسلة، بما في ذلك تقول لي عندما ألم ر تصل إلى النهاية. هذا من الصعب اقامة، ولكن جعل بعض الفئات من الخطأ التقارير أسهل. واحدة من الأماكن لقد استعملت هذه التقنية بشكل روتيني لديها أوامر متعدد الخطوط مع 3 اتفاقيات تعليق، مجموعتين من السلاسل بين علامات الاقتباس، وبعض غيرها من الأشرار لوضع أسناني على حافة الهاوية (السياق حساسة tokenization - يوك).

وإلا، وتقديم المشورة دون مع ياك رمز 'خطأ' جيدة.

ويبدو أنك قد وجدت بالفعل حلا ولكن سأضيف اقتراح آخر في حال كنت أنت أو الآخرين المهتمين في نهج بديل.

وأنت تقول أنك تستخدم رقائق لكن هل هذا لأنك تريد المترجم لتشغيل في بيئة بيثون؟ إذا كان الأمر كذلك، قد تفكر في أدوات أخرى أيضا. لمثل هذه الوظائف إنني كثيرا ما تستخدم ANTLR ( http://www.antlr.org ) التي لديها مولد رمز بيثون . ANTLR ديه الكثير من الحيل لتفعل أشياء مثل تناول حفنة من المدخلات على مستوى lexer ذلك محلل أبدا يراها (على سبيل المثال تعليق)، والقدرة على استدعاء القاعدة الفرعية (على سبيل المثال المعادلة) ضمن قواعد أكبر (والتي يجب إنهاء مرة واحدة تم مطابقة الحكم دون معالجة أي إدخال أكثر ... يبدو الى حد ما مثل ما تريد القيام به) ولطيفة جدا اليسار العوملة الخوارزمية.

وANTLRs تحليل القدرة جنبا إلى جنب مع استخدام StringTemplate ( http://www.stringtemplate.org ) محرك يجعل مزيج جميل وكلا بيثون الدعم (ضمن أشياء أخرى كثيرة).

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