سؤال

لقد كنت أبحث في Haskell وأرغب تمامًا في كتابة مترجم (كتمرين تعليمي) فيه، نظرًا لأن الكثير من ميزاته الفطرية يمكن تطبيقها بسهولة على مترجم (خاصة مترجم لائق متكرر).

ما لا أستطيع استيعابه هو كيفية تمثيل قواعد اللغة بطريقة هاسكل.كانت فكرتي الأولى هي استخدام تعريفات أنواع البيانات العودية، لكن لا يمكنني رؤية كيفية استخدامها للمطابقة مع الكلمات الرئيسية في اللغة ("if") على سبيل المثال.

الأفكار والاقتراحات موضع تقدير كبير،

بيت

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

المحلول

وهناك نوع البيانات العودية على ما يرام لهذا الغرض. على سبيل المثال، نظرا للغة:

expr ::= var
      |  "true"
      |  "false"
      |  "if" expr "then" expr "else" expr
      |  "(" expr ")"

وتعبيرا سبيل المثال في هذه اللغة ستكون كما يلي:

if true then x else (if false then y else true)

ولديك هاسكل نوع البيانات أن ننظر بشيء من هذا القبيل:

data Expr = Var String
          | Lit Bool
          | If Expr Expr Expr

ومحلل لديك ثم يأخذ الرعاية للترجمة، على سبيل المثال، x إلى Var "x"، وtrue إلى Lit True، الخ أي بمعنى:.

parse "if x then false else true" 
  ==  If (Var "x") (Lit False) (Lit True)

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

نصائح أخرى

أنت تمثل البرامج التي تستخدم أنواع البيانات الجبرية العودية المتبادلة، ولتحليل البرامج التي تستخدمها تحليل المجمعات.هناك مليون النكهات.سوف تجد ثلاث أوراق تعليمية مفيدة على الجدول الزمني لصفي ليوم الأثنين 23 مارس 2009م.هم

تعتبر ورقة Hutton and Meijer هي الأقصر والأبسط، ولكنها تستخدم المونادات، وهي ليست واضحة للهواة.ومع ذلك، لديهم قواعد نحوية لطيفة جدًا ومحلل للتعبيرات.إذا لم تكن تتقن استخدام المونادات بعد، فإن برنامج Fokker التعليمي هو الحل.

وربما يمكنك أن تبحث في بعض المشاريع في العالم الحقيقي لنرى كيف يفعلون ذلك؟

وقبل أقل من أسبوع، و لغة بيثون المشروع كان <لأ href = "http://Haskell.Org/pipermail/haskell-cafe/2009-March/058051.html" يختلط = "نوفولو noreferrer"> أعلن على في هاسكل-كافيه البريدية ل. انها بيثون محلل تنفيذها في هاسكل، وذلك باستخدام في سعيد محلل مولد و اليكس مولد lexer.

وبطبيعة الحال، هناك الصلصال ، تنفيذا ل<لأ href = "HTTP: // ديف. Perl.Org/perl6/ "يختلط =" نوفولو noreferrer "> بيرل 6 في هاسكل (أول تنفيذ بيرل 6 الذي يتوافق مع مجموعة فرعية هامة من مواصفات بيرل 6).

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

وتتمثل عادة

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

وتحول جوجل للبحث سريع يصل هذه القواعد BNF لهاسكل ، وربما يكون هناك آخرون هناك، في حال كنت ترغب في إرسال بريد مترجم هاسكل (ربما كنت ترغب في إرسال مترجم هاسكل في حزقيل؟) قواعد النحو BNF لC و Java يبدو أن شعبية.

وأخيرا، إذا كنت تبحث عن كتاب حول تصميم المترجم، النص الكلاسيكي هو " التنين كتاب ".

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

وستيف ييغج لديه حول كتابة المجمعين، اذا كنت بحاجة الى مزيد من التحفيز. انها مسلية.

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