FinalProject.pdf

‫مفسر یک زبان سادٌ در هسکل‬
‫دس ایي پشٍطُ بب استفبدُ اص دادُّبی جبشی قسوتّبی هختلف یک هفسش بشای یک صببى سبدُ عشاحی خَاّذ ضذ‪ .‬بشای ایيکبس ابتذا‬
‫سضتِّبی هتي بشًبهِ ببیذ تَسظ یک ‪ lexical analyzer‬بِ لیستی اص تَکيّب تبذیل ضًَذ‪ .‬سپس یک پبسسش تَکيّب سا گشفتِ ٍ اص سٍی‬
‫آىّب یک ‪ abstract syntax tree‬بسبصد‪ .‬دس ًْبیت یک هفسش ‪ AST‬سا گشفتِ ٍ آى سا اجشا هیکٌذ‪ .‬دس ایي پشٍطُ بشای پیبدُسبصی پبسسش‬
‫اص یک سشی اپشاتَسّبی تبذیل پبسسشّب استفبدُ هیکٌین کِ بِ آىّب تشکیبگش پبسسشّب گفتِ هیضَد‪.‬‬
‫هطخعکشدى دستَسّبی صببى بب استفبدُ اص ‪AST‬‬
‫غَست کلی دستَسّبی صببى بِ ضکل صیش است‪.‬‬
‫‪‬‬
‫یک ‪ assignment‬کِ ضبهل دٍ قسوت هختلف خَاّذ بَد‪:‬‬
‫‪ .1‬یک هتغیش کِ قشاس است هقذاس دس آى رخیشُ ضَد‪.‬‬
‫‪ .2‬یک ػببست کِ هقذاس هَسدًظش سا هطخع هیکٌذ‬
‫‪‬‬
‫یک ‪ sequence‬کِ ضبهل دٍ قسوت خَاّذ بَد‪:‬‬
‫‪ .1‬یک دستَس کِ قشاس است اٍل اجشا ضَد‪.‬‬
‫‪ .2‬یک دستَس کِ قشاس است بؼذ اص دستَس اٍل اجشا ضَد‪.‬‬
‫‪‬‬
‫یک ‪ conditional‬کِ ضبهل سِ قسوت خَاّذ بَد‪:‬‬
‫‪ .1‬یک ػببست کِ هطخعکٌٌذُی هقذاسی است کِ ببیذ تست ضَد‪.‬‬
‫‪ .2‬یک دستَس کِ دس غَست دسست بَدى ػببست ببیذ اجشا ضَد‪.‬‬
‫‪ .3‬یک دستَس کِ دس غَست غلظ بَدى ػببست ببیذ اجشا ضَد‪.‬‬
‫‪‬‬
‫یک ‪ loop‬کِ ضبهل دٍ قسوت خَاّذ بَد‪:‬‬
‫‪ .1‬یک ػببست کِ هطخع هیکٌذ ػولیبت تب چِ صهبًی ببیذ اجشا ضَد‪.‬‬
‫‪Parser Combinators‬‬
‫‪1‬‬
‫‪ .2‬یک دستَس کِ تب صهبًی کِ ػببست دسست ببضذ ببیذ اجشا ضَد‪.‬‬
‫‪While X>Y‬‬
‫‪Do‬‬
‫;‪X := X-1‬‬
‫‪Z := Z*Z‬‬
‫‪End‬‬
‫غَست کلی دستَسّبی صببى ًحَُی پیبدُسبصی ‪ abstract syntax tree‬سا بِ ػٌَاى یک دادُی ببصگطتی بشای هب هطخع هیکٌذ‪ .‬ایي‬
‫دادُ کِ بب ًبم ‪ Command‬هطخع خَاّذ ضذ حبلتّبی هختلف یک ‪ abstract syntax tree‬بشای دستَسّبی صببى هَسدًظش سا‬
‫پیبدُسبصی خَاّذ کشد‪ .‬بشای ایي کبس فشؼ کٌیذ کِ یک دادُ بب ًبم‬
‫‪ Expr‬بشای ًوبیص ػببستّب ٍ یک دادُ بب ًبم ‪ Variable‬بشای‬
‫ًوبیص هتغیشّب دس صببى تؼشیف ضذُاًذ‪ .‬تؼشیف دادُی ‪ Command‬بب استفبدُ اص اعالػبت دادُضذُ دس هَسد دستَسّب اًجبم هیضَد‪.‬‬
‫‪= see later‬‬
‫‪type Variable‬‬
‫‪= see later‬‬
‫‪type Expr‬‬
‫________ ________ ‪type Command = Assign‬‬
‫________ ________ ‪| Seq‬‬
‫________ ________ ________ ‪| Cond‬‬
‫________ ________ ‪| While‬‬
‫‪deriving Show‬‬
‫ایي تؼشیف چْبس سبصًذُ بشای چْبس حبلت هختلف ّش دستَس ایجبد هیکٌذ‪.‬‬
‫________ ‪Assign ::‬‬
‫________ ‪::‬‬
‫‪Seq‬‬
‫________ ‪::‬‬
‫‪Cond‬‬
‫________ ‪While ::‬‬
‫تمریه ايل‪:‬‬
‫تؼشیف دادُضذُ بشای دادُی ‪ Command‬سا کبهل کٌیذ‪ّ .‬نچٌیي تبیپ سبصًذُّب سا هطخع ًوبییذ‪.‬‬
‫بب تَجِ بِ تؼشیف دادُضذُ اص ‪ Command‬هثبلی ضکل قبل سا هیتَاى بِ غَست صیش هطخع کشد‪:‬‬
‫‪Constructor‬‬
‫‪2‬‬
‫))‪While e (Seq (Assign v1 e1) (Assign v2 e2‬‬
‫دقت کٌیذ کِ دس ػببست ببال ‪ e2 ٍ e1 ،e‬هتغیشّبیی ًطبىدٌّذُی ػببستّب ٍ ‪ v2 ٍ v1‬هتغیشّبیی ًوبیصدٌّذُی هتغیشّبی ‪Z ٍ X‬‬
‫ّستٌذ‪.‬‬
‫بشای کبهل کشدى تؼشیف ببال ببیذ ػببستّبی استفبدُضذُ دس صببى سا تؼشیف کٌیذ‪ .‬بشای سبدگی فشؼ هی کٌین کِ ػببستّبی صببى اص‬
‫ثببتّبی غحیح‪ ،‬هتغیشّب ٍ سِ ػولگش دٍدٍیی‪ ،‬یؼٌی ‪ ،Greater ٍ Times ،Minus‬سبختِ ضذُاًذ‪ .‬بشای ًوبیص هتغیشّب اص سضتِی‬
‫سبدُ استفبدُ هیکٌین‪ ،‬یؼٌی بشای ًوبیص هتغیش ‪ X‬اص سضتِی ”‪ “X‬استفبدُ خَاّین کشد‪ّ .‬نچٌیي فشؼ هیکٌین کِ ًتیجِی ّش ػببست یک‬
‫ػذد غحیح است ٍ بشای ػببستّبی هٌغقی دسست اص‬
‫‪ ٍ 1‬بشای ػببستّبی هٌغقی غلظ اص‬
‫‪ 0‬استفبدُ هیکٌین‪ .‬بِ ایي تشتیب بِ‬
‫تؼشیفّبی صیش خَاّین سسیذ‪:‬‬
‫‪type Variable = String‬‬
‫‪type Val = Int‬‬
‫‪data Expr = Const Val‬‬
‫‪| Var Variable‬‬
‫________ ________ ‪| Minus‬‬
‫________ ________ ‪| Times‬‬
‫________ ________ ‪| Greater‬‬
‫‪deriving Show‬‬
‫تمریه‬
‫ديم‪ :‬تؼشیف دادُی ‪ Expr‬سا کبهل کٌیذ‪.‬‬
‫بب تَجِ بِ تؼشیف هطخعضذُ اص دادُی ‪ Expr‬هیتَاى ‪ AST‬هشبَط بِ کذ قبل سا بِ غَست کبهل ًَضت‪:‬‬
‫))”‪While (Greater (Var “X”) (Var “Y‬‬
‫)))‪(Seq (Assign “X” (Minus (Var “X”) (Const 1‬‬
‫))))”‪(Assign “Z” (Times (Var “Z”) (Var “Z‬‬
‫دقت کٌیذ کِ بب اًجبم تغییشات الصم دس دادُّبی ‪ Command ٍ Variable ،Expr‬هیتَاى سبختبس ّش صببًی سا پیبدُسبصی کشد‪.‬‬
‫هقذاس ػببستّب ٍ ‪ّStore‬ب‬
‫دقت کٌیذ کِ هحبسبِی هقذاس ػببستّب ٍابستِ بِ هقبدیشی است کِ دس هتغیشّب رخیشُ ضذُاست‪ .‬بشای فْویذى ٍضؼیت کًٌَی هتغیشّب‬
‫اص ‪ Store‬استفبدُ هیکٌین‪ .‬دقت کٌیذ کِ ‪ّCommand‬ب ّویطِ ًسبت بِ یک ‪ Store‬خبظ اجشا خَاٌّذ ضذ‪ .‬بشای ایي کبس هب یک‬
‫تبیپ جذیذ ‪ Store‬هؼشفی خَاّین کشد‪ .‬کبسّبی اٍلیِای کِ بش سٍی یک ‪ Store‬اًجبم خَاّذضذ بِ غَست صیش است ٍ بقیِی کبسّب بِ‬
‫ٍسیلِی ایي ‪ ۳‬ػولیبت قببل پیبدُسبصی خَاٌّذ بَد‪.‬‬
‫‪:: Store -> Variable -> Val‬‬
‫‪fetch‬‬
‫‪update :: Store -> Variable -> Val -> Store‬‬
‫‪:: Store‬‬
‫تببغ ‪ fetch‬هقذاس اختػبظ دادُضذُ بِ هتغیش ٍسٍدی دس‬
‫‪initial‬‬
‫‪ Store‬هَسد ًظش سا ببصهیگشداًذ‪ .‬تببغ ‪ update‬یک ‪ Store‬جذیذ ایجبد‬
‫هیکٌذ کِ کبهال ضبیِ ‪ٍ Store‬سٍدی است بب ایي تفبٍت کِ ٍضؼیت هتغیشی کِ بب ٍسٍدی دٍم هطخع هیضَد بِ هقذاسی کِ بب ٍسٍدیی‬
‫سَم هطخع هیضَد بِسٍص خَاّذ ضذ‪ّ .‬نچٌیي ‪ Store‬پیصفشؼ کِ بب ‪ initial‬هطخع ضذُاست هقذاس ‪ 0‬سا بب ّوِی هتغیشّب هتٌبظش‬
‫خَاّذ کشد‪.‬‬
‫دس هَسد تؼشیف ‪ Store‬بؼذا غحبت خَاّذ ضذ‪.‬‬
‫پیذا کشدى هقذاس ػببستّب‬
‫بب تَجِ بِ قبًَىّبی دستَسی صببى هیتَاى بِ ّش ػببست یک هقذاس اختػبظ داد‪ .‬بِ ػببست دیگش بش خالف دستَسّب کِ تؼشیفکٌٌذُی‬
‫یک ػولیبت ّستٌذ‪ ،‬ػببستّب تؼشیفکٌٌذُی هحبسببتی ّستٌذ کِ دس ًْبیت بِ یک هقذاس هٌتْی خَاّذ ضذ‪ .‬بشای پیذاکشدى هقذاس‬
‫ػببستّب هیتَاى اص تببغ صیش استفبدُ کشد‪.‬‬
‫‪eval :: Expr -> Store -> Val‬‬
‫ایي تببغ یک ػببست ٍ یک ‪ Store‬گشفتِ ٍ هقذاس ػببست دادُضذُ ًسبت بِ ‪ Store‬دادُضذُ سا هحبسبِ هیکٌذ‪.‬‬
‫هقذاس یک ػببست ثببت هستقل اص ‪ Store‬هطخع است‪ .‬اص عشف دیگش هقذاس یک هتغیش سا بب استفبدُ اص تببغ ‪ fetch‬هیتَاى بِ دست‬
‫آٍسد‪ .‬بشای بِ دست آٍسدى هقذاس ػببستّبیی کِ اص اپشاتَسّبی دٍدٍیی استفبدُ هیکٌٌذ ببیذ ابتذا هقذاس ّش یک اص ػولًٍذّب سا بِ دست‬
‫آٍسدُ ٍ سپس بب تَجِ بِ آىّب هقذاس ًْبیی سا هحبسبِ کشد‪.‬‬
‫تمریه سًم‪:‬‬
‫بب تَجِ بِ تَضیحبت ببال تببغ ‪ eval‬سا پیبدُسبصی کٌیذ‪.‬‬
‫تفسیش کشدى دستَسّب‬
‫حبل کِ هیتَاًین هقذاس ػببستّب سا پیذا کٌین تَاًبیی اجشای دستَسّب سا ًیض خَاّین داضت‪ .‬بشای تفسیش دستَسّب اص تببغ صیش استفبدُ‬
‫هیکٌین‪.‬‬
‫‪interpret :: Command -> Store -> Store‬‬
‫ایي تببغ ‪ Store‬بِ دست آهذُ اص اجشای دستَس دادُضذُ ًسبت بِ ‪ Store‬دادُضذُ سا ببصهیگشداًذ‪ .‬بِ ػببست دیگش هیتَاًیذ ایي تببغ سا‬
‫بِ ػٌَاى تببؼی دس ًظش بگیشیذ کِ بب گشفتي یک دستَس یک ػولگش بش سٍی‪ّStore‬ب ببصهیگشداًذ‪.‬‬
‫سبدُتشیي دستَس ایي صببى دستَس ‪ Assign‬است‪ .‬ایي دستَس ببیذ بب ایجبد تغییشات جضئی دس ‪ٍ Store‬سٍدی هقذاس هتغیش هطخعضذُ سا‬
‫بِ هقذاسی کِ اص ػببست هشبَط بِ دستَس بِ دست هیآیذ تغییش دّذ‪ .‬بشای ایيکبس ببیذ اص تببغ‪ update‬استفبدُ کٌین‪.‬‬
‫تمریه چهارم‪:‬‬
‫بب تَجِ بِ تَضیحبت ببال‪ ،‬قسوتی اص تؼشیف تببغ‬
‫‪ interpret‬سا کِ هشبَط بِ اجشای دستَسّبی سبختِ ضذُ بب‬
‫‪ Assign‬است بٌَیسیذ‪.‬‬
‫بشای اجشای دستَسّبی پطت سش ّن ببیذ دستَسّب سا بِ تشتیب ًسبت بِ‪ّStore‬بی هٌبسب اجشا کٌین‪.‬‬
‫تمریه پىجم‪:‬‬
‫قسوتی اص تؼشیف ‪ interpret‬کِ هشبَط بِ اجشای دستَسّبی سبختِضذُ بب ‪ّ Seq‬ستٌذ سا پیبدُسبصی کٌیذ‪ .‬دقت کٌیذ‬
‫کِ ّش قسوت اص ایي دستَس سا ًسب بِ چِ ‪Store‬ی ببیذ اجشا کٌین‪.‬‬
‫بشای اجشای حلقِّب یب دستَسّبی ضشعی ببیذ ابتذا هقذاس ػببست ضشعی سا پیذا کشدُ ٍ بب تَجِ بِ هقذاس آى دستَسّبی هختلفی سا اجشا‬
‫کٌین‪ .‬بشای ایيکبس اص تببغ صیش استفبدُ هیکٌین‪.‬‬
‫‪switch :: Val -> (Store -> Store) -> (Store -> Store) -> Store -> Store‬‬
‫ایي تببغ ببیذ بب تَجِ بِ هقذاس دادُضذُ یکی اص ػولگشّبی دادُضذُ سا بش سٍی ‪ Store‬دادُضذُ اجشا کٌذ‪( .‬دقت کٌیذ کِ ٍسٍدیّبیی کِ‬
‫اص ًَع ‪ّ Store -> Store‬ستٌذ دس ٍاقغ ػولگشّبیی بش سٍی ‪ّ Store‬ستٌذ‪).‬‬
‫تمریه ششم‪:‬‬
‫تببغ ‪ switch‬سا پیبدُسبصی کٌیذ‪ّ .‬نچٌیي بب استفبدُ اص ایي تببغ قسوتی اص تببغ ‪ interpret‬سا کِ هشبَط بِ اجشاکشدى‬
‫دستَسّبی بِ فشم ‪ Cond‬است بٌَیسیذ‪.‬‬
‫بشای یک حلقِ ػولیبتّبی هوکي اًجبم دادى ػولیبت هَجَد دس حلقِ ٍ اًجبم دٍببسُی حلقِ دس غَست ‪ 1‬بَدى هقذاس تست ٍ ّیچکبسی‬
‫اًجبمًذادى دس غَست ‪ 0‬بَدى هقذاس تست خَاّذ بَد‪.‬‬
‫تمریه‬
‫هفتم‪ :‬تببغ ‪ interpret‬سا بشای دستَسّبیی کِ بب ‪ While‬سبختِ ضذُاًذ بٌَیسیذ‪.‬‬
‫ًوبیص ‪ّStore‬ب‬
‫ّش ‪ Store‬دادُسبختبسی است کِ بِ هتغیشّب هقذاس هتٌبظش آىّب سا ًسبت هیدّذ‪ .‬دس ٍاقغ یک ‪ Store‬تببؼی اص فضبی هتغیشّب بِ فضبی‬
‫هقذاسّب است‪ .‬بٌببشایي بشای ًوبیص ‪ّStore‬ب اص یک تبیپ تببؼی استفبدُ هیکٌین‪.‬‬
‫‪type Store = Variable -> Val‬‬
‫ّوبىعَس کِ گفتِ ضذ ‪ initial‬یک ‪ Store‬است کِ بِ ّوِی هتغیشّب هقذاس ‪ 0‬سا ًسبت هیدّذ‪ .‬تببغ ‪ fetch‬تببؼی است کِ بب گشفتي‬
‫یک هتغیش ٍ یک ‪ Store‬هقذاس ًسبت دادُضذُ بِ آى هتغیش دس ‪ Store‬دادُضذُ سا ببصهیگشداًذ‪ .‬تببغ ‪ update‬تببؼی است کِ یک‬
‫‪ Store‬گشفتِ ٍ ‪ Store‬جذیذی ببصهیگشداًذ کِ دس آى هقذاس ٍ هتغیش جذیذ قشاس دادُضذُاًذ‪.‬‬
‫تمریه هشتم‪:‬‬
‫بب تَجِ بِ ًکتِّبی گفتِضذُ تببغّبی‬
‫‪ update ٍ fetch ،initial‬سا پیبدُسبصی کٌیذ‪ .‬دقت کٌیذ کِ پیچیذگی‬
‫ػولیبتّب ببیذ ًسبت بِ تؼذاد هتغیشّب خغی ببضذ‪.‬‬
‫بب پیبدُسبصی ایي تَابغ ضوب هیتَاًذ تببغ ‪ interpret‬خَد سا بش سٍی هثبلی کِ اص یک دستَس صدین اهتحبى کٌیذ‪:‬‬
‫))”‪interpret (While (Greater (Var “X”) (Var “Y‬‬
‫)))‪(Seq (Assign “X” (Minus (Var “X”) (Const 1‬‬
‫‪(Assign “Z” (Times (Var “Z”) (Var “Z”))))) initial‬‬
‫ًحَُی کبس پبسسش‬
‫حبل کِ ًحَُی تفسیش ‪ّ AST‬ب سا پیبدُسبصی کشدُاین ببیذ تَابغ هشبَط بِ خَاًذى تَکيّب ٍ تبذیل آىّب بِ ‪ AST‬سا پیبدُسبصی کٌین‪ .‬ایي‬
‫تَابغ بب استفبدُ اص تکٌیکّبی ‪ًَ higher-order programming‬ضتِضذُ ٍ بِ ساحتی بشای ًَضتي پبسسش صببىّبی دیگش ًیض قببل تغییش‬
‫ٍ استفبدُ خَاٌّذبَد‪.‬‬
‫بشای ایيکبس ابتذا ببیذ یک دادُ بشای ًوبیص تَکيّب هطخع کٌین‪.‬‬
‫‪data Token = Ident String‬‬
‫‪| Symbol String‬‬
‫‪| Number Int‬‬
‫بب استفبدُ اص ایي دادُ هیتَاًین قسوتّبی هختلف صببى بشًبهًَِیسی یؼٌی اػذاد‪ً ،‬وبدّبی صببى ٍ ‪ّindetifier‬ب سا هذلسبصی کٌین‪ .‬بشای‬
‫هثبل کذی کِ دس قسوتّبی قبل بشسسی ضذ یؼٌی‬
‫”‪“While X > Y Do X := X – 1; Z := Z * Z End‬‬
‫پس اص اًجبم ‪ lexical analysis‬بِ غَست لیستی اص تَکيّب دس خَاّذ آهذ‪:‬‬
‫‪*Symbol “While”, Ident “X”, Symbol “>”, Ident “Y”, Symbol “Do”, Ident “X”, Symbol “:=”, Ident “X”,‬‬
‫‪Symbol “-“, Number 1, Symbol “;”, Ident “Z”, Symbol “:=”, Ident “Z”, Symbol “*”, Ident “Z”, Symbol‬‬
‫‪“End”+‬‬
‫ٍظیفِی تببغ ‪ parse‬تبذیل ایي لیست اص تَکيّب بِ یک ‪ AST‬است‪ .‬ایي تببغ ببیذ ‪ Command‬ی کِ تَسظ لیست تَکيّب ًوبیصدادُ‬
‫هیضَد سا ببصگشداًذ‪ .‬بِ ػببست دیگش ایي تببغ ببیذ اص لیست تَکيّبی دادُضذُ دس ببال‪ Command‬صیش سا ایجبد کٌذ‪:‬‬
‫))”‪While (Greater (Var “X”) (Var “Y‬‬
‫)))‪(Seq (Assign “X” (Minus (Var “X”) (Const 1‬‬
‫))))”‪(Assign “Z” (Times (Var “Z”) (Var “Z‬‬
‫بشای ًَضتي یک پبسسش بشای ‪ّ Command‬ب هب ببیذ بشای قسوتّبی هختلفی کِ ایي دستَسات سا تطکیل هیدٌّذ پبسسش عشاحی کٌین‪،‬‬
‫بشای هثبل بشای ػببستّب‪ّassignment ،‬ب‪ّconditional ،‬ب ٍ غیشُ‪ .‬بشای ایيکِ بتَاًین ضکستخَسدى ػولیبت سا هطخع کٌین‬
‫تببغّبی پبسسش ببیذ یک دادُ اص ًَع ‪ Maybe‬ببصگشداًٌذ‪ّ .‬نچٌیي چَى ّشتببغ لضٍهب ّوِی تَکيّبی دادُضذُ سا ًویخَاًذ تَکيّبی‬
‫ببقیهبًذُ ًیض تَسظ تببغ ببصگشداًذُ خَاٌّذضذ‪ .‬بِ ایي تشتیب هیتَاى ‪ type‬یک پبسسش بشای یک هتغیش کلی ‪( a‬کِ هیتَاًذ ّشچیضی‬
‫هبًٌذ ‪ Command‬یب ‪ Expr‬یب ‪ Int‬ببضذ) بِ غَست صیش خَاّذ بَد‪:‬‬
‫)]‪type Parser a = [Token] -> Maybe (a, [Token‬‬
‫گشاهش دقیق صببى بشًبهًَِیسی‬
‫حبل کِ هیخَاّین بشای تَکيّبی صببى پبسسش بٌَیسین ًیبص داسین کِ گشاهش دقیق ٍ کبهل صببى سا هؼشفی کٌین‪ .‬بشای هؼشفی گشاهش اص چٌذ‬
‫قبػذُ دس هؼشفی گشاهشّب کوک هیگیشین‪:‬‬
‫‪ .1‬سضتِّبی قشاس گشفتِضذُ دس ”“ ببیذ بِ غَست لفظی دس سضتِ ٍجَد داضتِ ببضٌذ‪.‬‬
‫‪ .2‬قسوتّبی اختیبسی (یؼٌی قسوتّبیی کِ هیتَاًٌذ ٍجَد داضتِببضٌذ یب ٍجَد ًذاضتِببضٌذ) دس][ قشاس دادُ خَاٌّذ ضذ‪.‬‬
‫‪.3‬‬
‫دس غَستی کِ یک هتغیش چٌذ حبلت داضتِ ببضٌذ ایي حبلتّب بب استفبدُ اص| هطخع خَاٌّذ ضذ‪.‬‬
‫بب تَجِ بِ ایي قَاػذ گشاهش صببى سا بِ غَست صیش هؼشفی هیکٌین‪:‬‬
‫]‪aexp *“>” aexp‬‬
‫>=‬
‫‪exp‬‬
‫]‪bexp *“-“ aexp‬‬
‫>=‬
‫‪aexp‬‬
‫]‪cexp *“*” bexp‬‬
‫>=‬
‫‪bexp‬‬
‫‪“(“ exp “)” | number | variable‬‬
‫>=‬
‫‪cexp‬‬
‫]‪unitcom *“;” command‬‬
‫>=‬
‫‪command‬‬
‫‪whilecom | ifcom | assign‬‬
‫>=‬
‫‪unitcom‬‬
‫”‪“While” exp “Do” command “End‬‬
‫>=‬
‫‪whilecom‬‬
‫”‪“If” exp “Then” command “Else” command “EndIf‬‬
‫>=‬
‫‪ifcom‬‬
‫‪variable “:=” exp‬‬
‫>=‬
‫‪assign‬‬
‫تشکیبگش پبسسشّب‬
‫حبل بِ هسبلِ ًَضتي پبسسشّب بشهیگشدین‪ .‬هیخَاّین بشای قسوتّبی هختلف صببى پبسسش بٌَیسین‪ .‬بشای استفبدُ اص هفبّین بشًبهًَِیسی‬
‫بِ غَست ‪ higher-order programming‬ببیذ تالش کٌین کِ ببیٌین چغَس هیتَاًین اص سٍی پبسسشّبی قسوتّبی کَچکتش بشای‬
‫قسوتّبی بضسگتش پبسسش بسبصین‪ .‬البتِ دس ًْبیت ًیبص بِ ایجبد چٌذ پبسسش اٍلیِ خَاّین داضت‪ ،‬اهب ّوِی پبسسشّبی پیچیذُتش اص سٍی‬
‫ایي چٌذ پبسسش اٍلیِ سبختِ خَاٌّذضذ‪ .‬بشای هثبل یک پبسسش بشای ‪ً assignment‬یبص داسد کِ ابتذا یک هتغیش پیذا کشدُ سپس ًوبد‬
‫”=‪ “:‬سا پیذا کشدُ ٍ دس ًْبیت یک ػببست پیذا کٌذ‪ .‬دس ًتیجِ پبسسش هشبَط بِ ‪ assignment‬سا هیتَاى اص سٍی پبسسشّبی هشبَط بِ‬
‫هتغیش‪ ،‬هشبَط بِ ”=‪ ٍ “:‬هشبَط بِ ػببست ًَضت‪ .‬بشای ایيکبس تؼذادی تشکیبگش پبسسش تؼشیف هیکٌین کِ بب استفبدُ اص آىّب هیتَاًین‬
‫پبسسشّبی سبدُتش سا بب ّن تشکیب کٌین‪.‬‬
‫اگش یک تشکیبگش >&< (بخَاًیذ «ٍ سپس») تؼشیف کٌین کِ دٍ پبسسش سا تشکیب کشدُ ٍ پبسسش جذیذی کِ اص اجشای آى دٍ پبسسش بؼذ‬
‫اص یکدیگش بِ ٍجَد هیآیذ سا ببصگشداًذ هیتَاًین تؼشیف دادُضذُ بشای ‪ assignment‬سا پیبدُسبصی کٌین‪ .‬فشؼ کٌیذ کِ پبسسشّبی‬
‫اٍلیِی صیش هَجَد ببضٌذ‪:‬‬
‫‪:: Parser Variable‬‬
‫‪variable‬‬
‫‪:: Parser Expr‬‬
‫‪exp‬‬
‫‪:: String -> Parser String‬‬
‫‪literal‬‬
‫بِ ایي تشتیب هیتَاًین پبسسش هشبَط بِ ‪ assignment‬سا بِ غَست صیش بٌَیسین‪:‬‬
‫‪Variable <&> literal “:=” <&> exp‬‬
‫ّنچٌیي بشای هفَْم «یب» (کِ ّوبى | دس تؼشیف گشاهش است) یک تشکیبگش >|< سا هؼشفی هیکٌین کِ پبسسش حبغل اص ایي تشکیبگش‬
‫ابتذا پبسسش اٍل سا اهتحبى کشدُ ٍ سپس پبسسش دٍم سا اهتحبى هیکٌذ‪ .‬هثال هیتَاًین بٌَیسین‪:‬‬
‫‪Assign <|> whilecom <|> ifcom‬‬
‫ایي پبسسش دس غَست هَفق بَدى یب یک ‪ assignment‬پیذا هیکٌذ یب یک ‪ whilecom‬پیذا هیکٌذ ٍ یب یک ‪ ifcom‬پیذا هیکٌذ‪ .‬دس‬
‫غَستی کِ ّیچکذام اص آىّب پیذا ًطًَذ پبسسش ضکست خَسدُ است‪.‬‬
‫بِ ‪ type‬ایي تشکیبگشّب دقت کٌیذ‪:‬‬
‫‪<|> :: Parser a -> Parser a -> Parser a‬‬
‫)‪<&> :: Parser a -> Parser b -> Parser (a,b‬‬
‫دس ایيجب بِ یک تشکیبگش هْن دیگش ًیبص داسین کِ بِ هب اجبصُ هیدّذ ًتیجِی ببصگشداًذُضذُ اص یک پبسسش سا تغییش دّین‪ .‬بشای هثبل‬
‫دقت کٌیذ کِ هقذاس حبغل اص هَفقضذى یک پبسسش کِ بب >&< سبختِضذُ است یک صٍج اص هقبدیش ببصگشداًذُضذُ تَسظ قسوت اٍل‬
‫پبسسش ٍ قسوت دٍم پبسسش خَاّذ بَد‪ ،‬دس حبلی کِ هب احتوبال ًیبص داسین آى سا بِ ‪ type‬دیگشی تغییش دّین‪ .‬ایي تشکیبگش سا ‪modify‬‬
‫هیًبهین‪ .‬بشای هثبل دقت کٌیذ کِ پبسسش صیش‬
‫‪variable <&> literal “:=” <&> exp‬‬
‫دس ٍاقغ اص ًَع ))‪ Parser (Variable, (String, Expr‬است‪ .‬دس حبلی کِ هب اًتظبس داسین ایي پبسسش بشای هب‬
‫‪ّassignment‬ب سا‬
‫ببصگشداًذ‪ ،‬یؼٌی هقبدیشی اص ًَع ‪ .Command‬بشای ایي کبس تببؼی بشای تبذیل هقبدیش ببصگشداًذُضذُ تَسظ ایي پبسسش بِ هقذاس هَسد ًظش‬
‫خَد هیًَیسین‪:‬‬
‫‪mkAssignNode :: (Variable, (String, Expr)) -> Command‬‬
‫‪mkAssignNode (v, (s, e)) = Assign v e‬‬
‫حبل بب استفبدُ اص ایي تببغ ٍ تشکیبگش ‪ modify‬هیتَاًین پبسسش هشبَعِ بِ ‪ assignment‬سا بِ عَس کبهل پیبدُسبصی کٌین‪:‬‬
‫‪assign = (variable <&> literal “:=” <&> exp) `modify` mkAssignNode‬‬
‫ٍ اکٌَى ‪ assign‬یک پبسسش اص ًَع ‪ Parser Command‬است‪ ،‬یؼٌی ّوبىچیضی کِ اًتظبس داسین‪.‬‬
‫دس صیش ّشیک اص تشکیبگشّب سا ضشح هیدّین‪ .‬لغفب دٍببسُ تؼشیف ‪ Parser a‬سا هغبلؼِ کٌیذ ٍ دقت کٌیذ کِ ّش ‪ Parser a‬دس غَست‬
‫ضکست یک ‪ ٍ Nothing‬دس غَست هَفقیت یک )‪ Just (v,lst‬ببص هیگشداًذ کِ دس آى ‪ v‬هقذاس ‪ parse‬ضذُ تَسظ ‪( parser‬یؼٌی‬
‫هقذاسی اص ًَع ‪ lst ٍ )a‬لیست ببقیهبًذُی تَکيّب است‪.‬‬
‫پبسسشی کِ بِ غَست ‪ parser1 <|> parser2‬سبختِ هیضَد ابتذا ‪ parser1‬سا بش سٍی لیست تَکيّب اهتحبى هیکٌذ‪ .‬دس غَستی کِ‬
‫ایي پبسسش هَفق ببضذ هقذاس ببصگشداًذُضذُ تَسظ آى سا ببصهیگشداًذ‪ .‬اهب دس غَستی کِ ایي پبسسش ضکست بخَسد ‪ parser2‬سا بش سٍی‬
‫لیست ٍسٍدی اجشا کشدُ ٍ ًتیجِ سا ببصهیگشداًذ‪ .‬بِ ایي تشتیب اگش ّش دٍ قسوت ایي پبسسش ضکست بخَسًذ (بِ ػببست دیگش ‪Nothing‬‬
‫ببصگشداًٌذ) کل پبسسش ًیض ضکست هیخَسد ٍ ‪ Nothing‬ببص هیگشداًذ‪.‬‬
‫پبسسشی کِ بِ غَست ‪ parser1 <&> parser2‬سبختِ هیضَد ابتذا ‪ parser1‬سا بش سٍی لیست ٍسٍدی اجشا هیکٌذ‪ .‬دس غَستی کِ‬
‫ایي پبسسش ضکست خَسدُ ببضذ کل ػولیبت ضکست خَسدُاست ٍ ‪ Nothing‬ببصگشداًذُ هیضَد‪ .‬اهب دس غَست هَفقبَدى ایي پبسسش‬
‫ببقیهبًذُی لیست تَکيّب بِ ‪ parser2‬دادُ هیضَد تب قسوت بؼذی ایي پبسسش ًیض اًجبم ضَد‪ .‬اگش ‪ parser2‬ضکست بخَسد ببص ّن کل‬
‫ػولیبت ضکست خَسدُ ٍ ‪ Nothing‬ببصگشداًذُ هیضَد‪ .‬اهب دس غَستی کِ ‪ً parser2‬یض هَفق ببضذ هقذاس پبسسضذُ تَسظ ایي دٍ پبسسش‬
‫دس قبلب یک صٍج هشتب بِ ّوشاُ ببقیهبًذُی لیست تَکيّب بؼذ اص اجشای ‪ parser2‬ببصگشداًذُ هیضَد (بِ تؼشیف ‪ Parser a‬دقت‬
‫کٌیذ)‪.‬‬
‫پبسسشی کِ بِ غَست ‪ parser1 `modify` f‬سبختِ هیضَد ابتذا ‪ parser1‬سا بش سٍی لیست ٍسٍدی اجشا هیکٌذ‪ .‬دس غَستی کِ ایي‬
‫پبسسش ضکست بخَسد کل ػولیبت ضکست خَسدُ ٍ ‪ Nothing‬ببصگشداًذُ هیضَد‪ .‬اهب دس غَست هَفقیت آهیض بَدى ػولیبت ‪parser1‬‬
‫تببغ ‪ f‬بش سٍی هقذاسّبی پبسسضذُ تَسظ ایي پبسسش اجشا ضذُ ٍ هقذاس بِ دستآهذُ بِ ّوشاُ ببقیهبًذُ لیست تَکيّب ببصگشداًذُ‬
‫هیضَد‪.‬‬
‫ّنچٌیي دٍ پبسسش اٍلیِ ًیض کِ هَسد ًیبص است دس اختیبس ضوب قشاس هیگیشد‪.‬‬
‫اٍل ]‪ emptyseq :: Parser [a‬است کِ ّویطِ هَفق هیضَد صیشا بِ دًببل لیست خبلیای اص تَکيّبست ٍ ّیچ تَکٌی سا استفبدُ‬
‫ًویکٌذ‪ .‬هقذاس پبسسضذُ تَسظ ایي پبسسش ّویطِ یک لیست خبلی است‪ .‬یؼٌی ایي پبسسش ّویطِ )‪ ([], lst‬ببصهیگشداًذ کِ دس آى ‪lst‬‬
‫لیست تَکيّبیی است کِ بِ ایي پبسسش دادُ ضذُاست‪.‬‬
‫دٍم ‪ optional pr‬است کِ ایي پبسسش ًیض ّویطِ هَفق هیضَد‪ .‬ایي پبسسش دس ٍاقغ ّوبى ‪ pr <|> emptyseq‬است کِ ابتذا ‪ pr‬سا‬
‫اهتحبى هیکٌذ ٍ دس غَست ضکستخَسدى آى ّیچ تَکٌی هػشف ًویکٌذ (یؼٌی‬
‫‪ emptyseq‬سا اجشا هیکٌذ)‪ .‬اهب اص آىجبیی کِ‬
‫خشٍجی ‪ emptyseq‬اص ًَع ]‪ [a‬است ببیذ خشٍجی ‪ً pr‬یض تغییش دادُ ضذُ (یؼٌی ‪ modify‬ضَد) ٍ بِ غَست لیست دسبیبیذ تب بتَاى اص‬
‫تشکیبگش >|< استفبدُ کشد‪ .‬بِ ایي تشتیب هقذاس پبسسضذُ تَسظ ‪ optional pr‬دس غَست هَفق بَدى ‪ pr‬یک لیست بب یک ػضَ‬
‫است (کِ ایي ػضَ ّوبى هقذاس پبسسضذُ تَسظ ‪ pr‬است) ٍ دس غَست ضکستخَسدى ‪ pr‬یک لیست خبلی خَاّذ بَد‪ .‬دس ًتیجِ تببغ‬
‫‪ optional‬اص ًَع صیش خَاّذ بَد‪:‬‬
‫]‪Parser a -> Parser [a‬‬
‫پبسسشّبی اٍلیِ‬
‫تٌْب پبسسشّبی اٍلیِای کِ بشای ایي صببى الصم داسین سِ پبسسش صیش است‪:‬‬
‫‪:: Parser Val‬‬
‫‪number‬‬
‫‪:: Parser Variable‬‬
‫‪variable‬‬
‫‪:: String -> Parser String‬‬
‫‪literal‬‬
‫البتِ تببغ ‪ literal‬دس حقیقت یک تشکیبگش است اهب چَى بِ ًحَُی تؼشیف دادُی ‪ Token‬هشبَط است دس ایي قسوت قشاس دادُضذُ ٍ‬
‫بب تشکیبگشّبی دیگش کِ تب حذ خَبی ًسبت بِ تؼشیف ایي دادُّب هستقل ّستٌذ هؼشفی ًطذُاست‪.‬‬
‫بب تَجِ بِ تَضیحبت دادُضذُ بشای ‪ Parser a‬دقت کٌیذ کِ ‪ number‬ببیذ تببؼی ببضذ کِ لیستی اص تَکيّب سا هیگیشد ٍ سؼی هیکٌذ‬
‫یک ػذد بخَاًذ‪ .‬دس غَست ضکستخَسدى ببیذ‬
‫‪ Nothing‬ببصگشداًذُ ٍ دس غَست هَفقضذى ببیذ ػذد خَاًذُضذُ بِ اضبفِی‬
‫ببقیهبًذُی تَکيّب سا ببصگشداًذ‪ .‬یؼٌی تؼشیف ایي پبسسش بِ سبدگی بِ غَست صیش است‪.‬‬
‫)‪number (Number n : s) = Just (n,s‬‬
‫‪= Nothing‬‬
‫تمریه وهم‪:‬‬
‫_ ‪number‬‬
‫دٍ پبسسش اٍلیِی ‪ literal ٍ variable‬سا بشای هتغیشّب ٍ سضتِّبیی کِ بِ غَست لفظی دس صببى ٍجَد داسًذ پیبدُسبصی‬
‫کٌیذ‪ .‬دقت کٌیذ کِ ‪ literal str‬یک پبسسش است کِ دقیقب بِ دًببل سضتِی ٍسٍدیاش (یؼٌی ‪ )str‬دس هتي بشًبهِ خَاّذ گطت ٍ بٌب بش‬
‫ایي ببیذ تَکيّبی اص ًَع ‪ Symbol‬سا استفبدُ کٌذ‪.‬‬
‫ًَضتي پبسسش بشای دستَسّب ٍ ػببستّب‬
‫اکٌَى هیتَاًین بب کٌبس ّن قشاس دادى پبسسشّبی اٍلیِ ٍ تشکیبگشّب پبسسشّبی پیچیذُتش سا پیبدُسبصی کٌین‪ .‬بِ ضببّت بیي پیبدُسبصی ایي‬
‫پبسسشّب ٍ تؼشیف گشاهش صببى بشًبهًَِیسی دقت کٌیذ‪ .‬دس ٍاقغ‪ ،‬بِ جبی ّش سضتِی تشهیٌبل دس گشاهش ببیذ پبسسش هشبَط کِ بب استفبدُ اص‬
‫‪ literal‬سبختِ هیضَد سا قشاس دّین ٍ بشای ّش هتغیش ببیذ پبسسش هشبَط بِ آى هتغیش سا قشاس دّین‪ .‬بشای سبختي قسوتّبیی کِ پطت سش‬
‫ّن قشاس گشفتِاًذ اص تشکیبگش >&< استفبدُ کشدُ ٍ بشای سبختي قسوتّبیی کِ بب | سبختِ ضذُاًذ اص تشکیبگش >|< استفبدُ هیکٌین‪.‬‬
‫ّنچٌیي قسوتّبیی کِ دس بشاکت قشاس گشفتِاًذ سا هیتَاًین بب استفبدُ اص ‪ optional‬پیبدُسبصی کٌین‪ .‬بشای تغییش هقذاس پبسسضذُ تَسظ‬
‫پبسسشّبیی کِ بب ‪ optional‬سبختِ ضذُاًذ اص تَابؼی بب ًبم …‪ opt‬استفبدُ هیکٌین کِ بب استفبدُ اص تشکیبگش ‪ modify‬هقبدیش سا بِ فشهی‬
‫کِ ًیبص داسین دس خَاٌّذ آٍسد‪ .‬بشای هثبل پبسسش بشای ػببستّب بِ غَست صیش تؼشیف خَاّذ ضذ‪:‬‬
‫‪exp = (aexp <&> optional (literal “>” <&> aexp)) `modify` optGreater‬‬
‫‪= e1‬‬
‫)][ ‪optGreater (e1,‬‬
‫‪= Greater e1 e2‬‬
‫)])‪optGreater (e1, [(gt, e2‬‬
‫”‪= error “impossible‬‬
‫_ ‪optGreater‬‬
‫بِ ّویي تشتیب پبسسش بشای دستَسّبی ایي صببى بِ غَست صیش خَاّذ بَد‪:‬‬
‫‪command = (unitcom <&> optional (literal “;” <&> command)) `modify` optSeq‬‬
‫)‪unitcom = whilecom <|> (ifcom <|> assign‬‬
‫تمریه‬
‫‪= c1‬‬
‫)][ ‪optSeq (c1,‬‬
‫‪= Seq c1 c2‬‬
‫)])‪optSeq (c1, [(semicol, c2‬‬
‫”‪= error “impossible‬‬
‫_ ‪optSeq‬‬
‫دهم‪ :‬بب تَجِ بِ قَاًیي گشاهشی دادُضذُ بشای صببى بشًبهًَِیسی ٍ هثبلّبی ببال پبسسشّبی هشبَط بِ‪ cexp ٍ bexp ،aexp‬سا‬
‫بٌَیسیذ‪ .‬بشای ایيکبس بِ تَابغ ‪ً unparenth ٍ optMult ٍ optSub‬یبص خَاّیذ داضت‪ .‬تَابغ ‪ optMult ٍ optSub‬هطببِ تَابغ‬
‫‪ optGreater‬خَاٌّذ بَد ٍ تببغ ‪ unparenth‬ببیذ تٌْب پشاًتضّب سا اص هقذاس پبسسضذُ تَسظ ‪ cexp‬حزف کٌذ‪.‬‬
‫تمریه یازدهم‪:‬‬
‫پبسسشّبی هشبَط بِ ‪ assign ٍ ifcom ،whilecom‬سا بٌَیسیذ‪ .‬بشای ایي کبس بِ تَابغ‬
‫‪ٍ mkWhileNode‬‬
‫‪ً mkAssignNode ٍ mkIfNode‬یبص خَاّیذ داضت‪.‬‬
‫دقت کٌیذ کِ بشای سبدگی کبس پبسسشّب سا بذٍى تَاًبیی دقیقی بشای هطخعکشدى خغبّب سبختِاین‪ .‬بب ٍجَد ایي دقت کٌیذ کِ هی ضذ‬
‫تشکیبگشّب سا بِ سبدگی بِ گًَِای تغییش داد کِ بِ دسستی خغبّب سا اص پبسسشّبی کَچکتش گشفتِ ٍ خغبی ًْبیی سا هطخع کٌٌذ‪ .‬بب ایي‬
‫ٍجَد ًیبص بِ تببؼی داسین کِ ًتیجِی ًْبیی ػولیبت سا گشفتِ ٍ هطخع کٌذ کِ آیب ًتیجِ هَفق بَدُ است یب خیش ٍ دس غَست هَفق‬
‫بَدى ًتیجِ ‪ًْ AST‬بیی کِ ّوبى هقذاس پبسسضذُ تَسظ پبسسش ًْبیی است سا ببصگشداًذ‪ .‬دقت کٌیذ کِ ضکست خَسدى ًتیجِ هیتَاًذ بِ‬
‫دلیل ضکست خَسدى کل پبسسش ببضذ یب بِ دلیل ٍجَد تَکيّبیی کِ تَسظ پبسسش استفبدُ ًطذُاًذ‪( .‬دس غَست ٍجَد ایي تَکيّب یؼٌی‬
‫قسوتی اص بشًبهِ تَسظ پبسسش کلی بشًبهِّب استفبدُ ًطذُاًذ کِ یک خغب است)‪ .‬بشای ایي کبس ببیذ تببؼی اص ًَع صیش بٌَیسین‪:‬‬
‫‪report :: Maybe (a, [Token]) -> a‬‬
‫بشای هطخع کشدى تَکيّبی اضبفِ دس غَست اضبفِ آهذى تَکيّب ببیذ تببؼی داضتِ ببضین کِ آىّب سا بِ سضتِّبی خَاًب تبذیل کٌذ‪:‬‬
‫‪lit :: Token -> String‬‬
‫“ “ ‪lit (Ident s) = s ++‬‬
‫“ “ ‪lit (Symbol s) = s ++‬‬
‫“ “ ‪lit (Number s) = show s ++‬‬
‫حبل هیتَاًین تببغ ‪ report‬سا تؼشیف کٌین‪.‬‬
‫”‪= error “Parse Error‬‬
‫‪report Nothing‬‬
‫‪= c‬‬
‫))][‪report (Just (c,‬‬
‫‪= error (stringwith‬‬
‫))‪report (Just (c,xs‬‬
‫‪(“Syntax error \n Unparsed:-\n”,‬‬
‫))‪“ “, “\n”) (map lit xs‬‬
‫= ‪stringwith (front, sep, back) ls‬‬
‫‪let sepback [] = back‬‬
‫‪sepback [a] = a ++ back‬‬
‫‪sepback (a:xs) = a ++ sep ++ sepback xs‬‬
‫‪in‬‬
‫‪front ++ sepback ls‬‬
‫بِ ایي تشتیب هیتَاًین تببؼی کِ لیست تَکيّب سا گشفتِ ٍ یک‬
‫‪ Command‬تحَیل هیدّذ سا پیبدُسبصی کٌین‪( .‬دقت کٌیذ کِ کل‬
‫بشًبهِ دس ٍاقغ یک ‪ Command‬است)‪.‬‬
‫‪mainParser :: [Token] -> Command‬‬
‫‪mainParser = report . command‬‬
‫دس ایي لحظِ بْتش است حتوب تَابغ ًَضتِ ضذُی خَد سا بش سٍی ٍسٍدیّبی هختلف کِ ببیذ لیستی اص تَکيّب کِ بِ غَست دستی‬
‫سبختِضذُ ببضٌذ اجشا کٌیذ ٍ اص دسستی ػولکشد آىّب هغوئي ضَیذ‪.‬‬
‫ًَضتي ‪lexical analyzer‬‬
‫بشای ًَضتي ‪ lexical analyzer‬اص هبضیي حبلت هتٌبّی صیش استفبدُ هیکٌین‪.‬‬
‫بب تَجِ بِ ایي هبضیي‪ ،‬دس غَست سسیذى بِ کبساکتشّبی‬
‫‪ layout‬هبًٌذ فبغلِ دس ّوبى حبلت اٍلیِ هیهبًین‪ .‬دس غَست خَاًذى‬
‫کبساکتشّبی پشاًتض ًیض دس ّوبى حبلت اٍلیِ هیهبًین بب ایي تفبٍت کِ بشای پشاًتضّب تَکي هٌبسب سا ایجبد هیکٌین‪ .‬دس غَستی کِ یک‬
‫حشف ببیٌین بِ حبلت‬
‫‪ getword‬سفتِ ٍ تب صهبًی کِ حشف یب ػذد یب‬
‫‪ underline‬ببیٌین دس آى حبلت هیهبًین‪ .‬ایي حبلت‬
‫هطخعکٌٌذُی تَکيّبی اص ًَع ‪ identifier‬است‪ .‬البتِ دقت کٌیذ کِ تؼذادی اص ‪ّsymbol‬ب ًیض دس ایي حبلت قشاس هیگیشًذ کِ ببیذ‬
‫بؼذا جذا ضًَذ‪ّ .‬نچٌیي حبلتّبی ‪ getsymbol ٍ getnum‬بشای خَاًذى ػذدّب ٍ ‪ّsymbol‬بی ًطبًِای (هثال ”=‪ “:‬یب ”>“) ّستٌذ‪.‬‬
‫بشای جذاسبصی ‪ّsymbol‬بی حشفی (هبًٌذ ”‪ )“While‬اص ‪ّ identifier‬ب اص یک تببغ استفبدُ هیکٌین کِ یک سضتِ گشفتِ ٍ ‪keyword‬‬
‫بَدى یب ًبَدى آى سا هطخع هیکٌذ‪.‬‬
‫‪keyword :: String -> Bool‬‬
‫ّنچٌیي تببغ دیگشی هیًَیسین کِ بب استفبدُ اص خشٍجی ‪ keyword‬بشای هب تَکي هتٌبظش بب یک سضتِ سا بِ دسستی بسبصد‪ .‬یؼٌی اگش‬
‫‪ identifier‬بَد یک تَکي اص ًَع ‪ ٍ identifier‬اگش ‪ keyword‬بَد یک تَکي اص ًَع ‪ symbol‬بسبصد‪.‬‬
‫‪keycheck :: String -> Token‬‬
‫تمریه‬
‫ديازدٌ‪ :‬تببغّبی ‪ keycheck ٍ keyword‬سا پیبدُسبصی کٌیذ‪.‬‬
‫بشای تطخیع کبساکتشّبی خَاًذُضذُ بِ چٌذیي تببغ بشای هطخع کشدى ًَع کبساکتشّب ًیبص داسین‪.‬‬
‫تمریه‬
‫سیسدٌ‪ :‬تببغ ‪ isLetter‬سا پیبدُسبصی کٌیذ‪ .‬ایي تببغ ببیذ هطخع کٌذ کِ کبساکتش ٍسٍدیاش یک حشف کَچک یب بضسگ است‬
‫یب خیش‪.‬‬
‫تمریه چهاردٌ‪:‬‬
‫تببغ ‪ letDigEtc‬سا پیبدُسبصی کٌیذ‪ .‬ایي تببغ ببیذ هطخع کٌذ کبساکتش ٍسٍدیاش یک حشف‪ ،‬ػذد یب ‪underline‬‬
‫است یب خیش‪ .‬تببغ ‪ layout‬سا پیبدُسبصی کٌیذ کِ هطخع هیکٌذ کبساکتش ٍسٍدیاش یک کبساکتش اص ًَع فبغلِ است یب خیش‪ .‬تببغ‬
‫‪ symbolchar‬سا پیبدُسبصی کٌیذ کِ هطخع هیکٌذ کبساکتش ٍسٍدیاش یکی اص ًطبًِّبی‬
‫*‪ ; ٍ = ،: ،> ،- ،‬است یب خیش‪ .‬تببغ‬
‫‪ intOfDigit‬سا پیبدُسبصی کٌیذ کِ هقذاس ػذدی کبساکتش ٍسٍدی سا هطخع کٌیذ‪( .‬هثال بشای ٍسٍدی ’‪ ‘5‬ػذد ‪ 5‬سا ببصگشداًذ‪ ).‬ایي تببغ‬
‫اص ًَع ‪ Char -> Int‬خَاّذ بَد‪.‬‬
‫بشای ًَضتي ‪ lexical analyzer‬اص تببغ ّبی صیش استفبدُ خَاّین کشد‪.‬‬
‫]‪:: String -> String -> [Token‬‬
‫‪getword‬‬
‫]‪:: String -> String -> [Token‬‬
‫‪getsymbol‬‬
‫]‪:: Int -> String -> [Token‬‬
‫‪getnum‬‬
‫ایي تَابغ بِ غَست هطخع بِ حبلتّبی هختلف هبضیي حبلت هتٌبّی دادُضذُ هشبَط ّستٌذ‪ٍ .‬سٍدی اٍل ایي تَابغ بشای جوغآٍسی‬
‫کبساکتشّبی دیذُضذُی کًٌَی است‪ .‬بشای هثبل دس ‪ getword‬تب صهبًی کِ کبساکتشّبیی اص ًَع ‪ letDigEtc‬ببیٌین آىّب سا بب فشاخَاًی‬
‫ببصگطتی دس ٍسٍدی اٍل تببغ پطت سش ّن جوغآٍسی هیکٌین ٍ دس ًْبیت بب سسیذى بِ یک کبساکتش ‪ other‬یؼٌی صهبًی کِ ‪ word‬هَسد‬
‫ًظش توبم ضذُاست بب استفبدُ اص تببغ‬
‫‪ keycheck‬کِ قبال تؼشیف ضذُبَد تَکي هَسد ًظش سا هیسبصین‪ .‬بِ ّویي تشتیب تَابغ‬
‫‪ getnum ٍ getsymbol‬کبساکتشّبی اص ًَع ‪ digit ٍ symbol‬سا جوغآٍسی کشدُ ٍ دس ًْبیت بِ تَکي تبذیل هیکٌٌذ‪ .‬حبل هیتَاًین‬
‫تببغ ًْبیی سا بٌَیسین‪.‬‬
‫]‪lex :: String -> [Token‬‬
‫][ = ][ ‪lex‬‬
‫‪lex (a:x) = if layout a then lex x else‬‬
‫‪if a == ‘(‘ then Symbol “(“ : (lex x) else‬‬
‫‪if a == ‘)’ then Symbol “)” : (lex x) else‬‬
‫‪if isLetter a then getword [a] x else‬‬
‫‪if isDigit a then __________ else‬‬
‫‪if symbolchar a then ________ else‬‬
‫))‪error (“Lexical error: unrecognized token “ ++ (a:x‬‬
‫])‪= [keycheck (reverse l‬‬
‫][ ‪getword l‬‬
‫‪= if letDigEtc a‬‬
‫)‪getword l (a:x‬‬
‫‪then getword (a:l) x‬‬
‫))‪else (keycheck (reverse l)) : (lex (a:x‬‬
‫تمریه پاوسدهم‪:‬‬
‫پیبدُسبصی تببغ ‪ lex‬سا توبم کٌیذ‪ّ .‬نچٌیي تَابغ ‪ getnum ٍ getsymbol‬سا پیبدُسبصی کٌیذ‪ .‬بِ یبد داضتِ ببضیذ‬
‫کِ تببغ ‪ getnum‬ببیذ یک ػذد سا جوغآٍسی کٌذ (بب استفبدُ اص تببغ ‪ ًِ ٍ )intOfDigit‬یک سضتِ سا‪.‬‬
‫بِ ایي تشتیب هفسش کبهل هیضَد ٍ هیتَاًیذ آى سا بش سٍی بشًبهِّبیی کِ کبهال بِ غَست سضتِ ًَضتِ ضذُاًذ اجشا ٍ تست کٌیذ‪.‬‬