Project - Phase 1.pdf

‫ﺗﻌﺮﯾﻒ ﻓﺎز اول ﭘﺮوژﻩ ﮐﺎﻣﭙﺎﯾﻠﺮ‬
‫ﻧﻴﻢﺳﺎل اول ‪ – 86-87‬دﮐﺘﺮ اﺑﻮاﻟﺤﺴﻨﯽ‬
‫ﻣﻮﻋﺪ ﺗﺤﻮﯾﻞ‪86/8/29 :‬‬
‫ﭘﺮوژﻩﯼ اﯾﻦ درس‪ ،‬ﯾﮏ ﮐﺎﻣﭙﺎﯾﻠﺮ ﮐﺎﻣﻞ از زﺑﺎن ‪ MiniJava‬ﺑﻪ زﺑﺎن ﻣﺎﺷﻴﻦ اﺳﺖ‪.‬‬
‫ﻃﯽ اﻧﺠﺎم ﺁن ﺷﻤﺎ ﺑﺎ ﻣﺮاﺣﻞ ﻃﺮاﺣﯽ و ﭘﻴﺎدﻩﺳﺎزﯼ ﯾﮏ ﮐﺎﻣﭙﺎﯾﻠﺮ ﺗﺎ ﺣﺪﯼ ﺁﺷﻨﺎ‬
‫ﺧﻮاهﻴﺪﺷﺪ‪ .‬اﯾﻦ ﭘﺮوژﻩ در ‪ 3‬ﯾﺎ ‪ 4‬ﻓﺎز ﺗﻌﺮﯾﻒ ﺧﻮاهﺪﺷﺪ‪ .‬ﺑﺮﻧﺎﻣﻪ را ﺑﺎﯾﺪ ﺑﻪ زﺑﺎن‬
‫‪ Java‬ﺑﻨﻮﯾﺴﻴﺪ‪ .‬ﺣﺠﻢ ﮐﺎر زﯾﺎد اﺳﺖ و ﺷﻤﺎ ﺑﺎﯾﺪ در ﮔﺮوﻩهﺎﯼ ﯾﮏ ﯾﺎ دو ﻧﻔﺮﻩ‬
‫ﺁنرا اﻧﺠﺎم دهﻴﺪ؛ ﮔﺮوﻩهﺎ ﭘﺲ از اﻧﺠﺎم ﻓﺎز اول ﻗﺎﺑﻞ ﺗﻐﻴﻴﺮ ﻧﺨﻮاهﻨﺪ ﺑﻮد‪ .‬در هﺮ‬
‫ﻓﺎز ﺑﻪ هﻤﺮاﻩ ﺧﻮد ﺑﺮﻧﺎﻣﻪ‪ ،‬ﺑﺎﯾﺪ ‪ documentation‬ﻧﻴﺰ ارﺳﺎل ﮐﻨﻴﺪ‪ ،‬ﺷﺎﻣﻞ‬
‫ﺗﻮﺿﻴﺤﺎﺗﯽ ﺟﺎﻣﻊ درﺑﺎرﻩﯼ اﯾﻦ ﮐﻪ ﭼﻪ ﮐﺎر ﮐﺮدﻩاﯾﺪ )ﻻزم ﻧﻴﺴﺖ ﺧﻴﻠﯽ ﻣﻔﺼﻞ‬
‫ﺑﺎﺷﺪ‪ ،‬ﺣﺪود ‪ 2‬ﺻﻔﺤﻪ(‪ ،‬و اﯾﺪﻩهﺎﯾﯽ ﮐﻪ ﺑﻪ ذهﻨﺘﺎن رﺳﻴﺪﻩ و اﻋﻤﺎل ﮐﺮدﻩاﯾﺪ‪.‬‬
‫در ﻓﺎز اول ﺑﺎﯾﺪ ﺑﺮﻧﺎﻣﻪاﯼ ﺑﻨﻮﯾﺴﻴﺪ ﮐﻪ اﻋﻤﺎل ‪ lexical analysis‬و ‪ parsing‬و‬
‫ﺳﺎﺧﺖ ‪ abstract syntax tree‬را اﻧﺠﺎم دهﺪ‪ .‬ﺑﺮاﯼ دو ﻋﻤﻞ اول ﺑﺮﻧﺎﻣﻪهﺎﯾﯽ‬
‫وﺟﻮد دارﻧﺪ ﮐﻪ ﺑﺎ ﮔﺮﻓﺘﻦ ﺳﺎﺧﺘﺎر زﺑﺎن‪ ،‬ﻗﺴﻤﺖ ﺳﻨﮕﻴﻦ ﮐﺎر را اﻧﺠﺎم ﻣﯽدهﻨﺪ؛‬
‫وﻟﯽ ﺑﺮاﯼ ﻋﻤﻞ ﺳﻮم ﺷﻤﺎ ﺑﺎﯾﺪ ﺣﺠﻢ اﺻﻠﯽ ﮐﺪ را ﺑﻨﻮﯾﺴﻴﺪ‪ .‬ﺗﺮﺗﻴﺐ زﯾﺮ ﺑﺮاﯼ‬
‫اﻧﺠﺎم اﯾﻦ ﮐﺎر ﭘﻴﺸﻨﻬﺎد ﻣﯽﺷﻮد‪:‬‬
‫‪ .1‬ﺑﺎ زﺑﺎن ‪ MiniJava‬ﺁﺷﻨﺎ ﺷﻮﯾﺪ! در ]‪ [1‬ﻣﯽﺗﻮاﻧﻴﺪ ﮔﺮاﻣﺮ اﯾﻦ زﺑﺎن را ﺑﺒﻴﻨﻴﺪ‪.‬‬
‫اﯾﻦ زﺑﺎن ﺑﺴﻴﺎر ﺷﺒﻴﻪ ‪ Java‬اﺳﺖ وﻟﯽ از ﺁن ﺳﺎدﻩﺗﺮ اﺳﺖ‪ .‬وﺟﻪ‬
‫ﺗﻤﺎﯾﺰهﺎﯼ ﺁن ﺑﺎ ‪ Java‬را ﯾﺎد ﺑﮕﻴﺮﯾﺪ‪ .‬ﺑﻪﻋﻼوﻩ دﻗﺖ ﮐﻨﻴﺪ ﮐﻪ ﮔﺮاﻣﺮ‬
‫دادﻩﺷﺪﻩ ﻣﺒﻬﻢ )‪ (ambiguous‬اﺳﺖ‪ .‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اوﻟﻮﯾﺖ اﭘﺮاﺗﻮرهﺎ‪ ،‬ﮐﻪ‬
‫هﻤﺎن اوﻟﻮﯾﺖ ﻣﻌﻤﻮﻟﯽ زﺑﺎن ‪ Java‬اﺳﺖ‪ ،‬ﮔﺮاﻣﺮ ﻏﻴﺮﻣﺒﻬﻤﯽ ﺑﺮاﯼ ﺁن ﺑﻪ‬
‫دﺳﺖﺁورﯾﺪ‪.‬‬
‫‪ .2‬ﺑﺎ ﻧﺮماﻓﺰار ‪ JLex‬ﺁﺷﻨﺎ ﺷﻮﯾﺪ! در ]‪ [2‬ﻣﯽﺗﻮاﻧﻴﺪ اﻃﻼﻋﺎت ﻣﺮﺑﻮﻃﻪ را ﭘﻴﺪا‬
‫ﮐﻨﻴﺪ و ﺑﺮﻧﺎﻣﻪ را درﯾﺎﻓﺖ ﮐﻨﻴﺪ‪ .‬اﯾﻦ ﺑﺮﻧﺎﻣﻪ ﺷﺒﻴﻪ ‪ Lex‬ﯾﮏ ‪lexical‬‬
‫‪ analyzer generator‬اﺳﺖ وﻟﯽ ﺧﺮوﺟﯽ ﺁن ﯾﮏ ﺑﺮﻧﺎﻣﻪﯼ ‪ Java‬اﺳﺖ‪.‬‬
‫ﻃﺮز ﮐﺎر ﺑﺎ ﺁن را ﯾﺎد ﺑﮕﻴﺮﯾﺪ‪ ،‬ﺳﭙﺲ ﻣﺸﺨﺼﺎت ‪ MiniJava‬را ﺑﻪ ﺁن ﺑﺪهﻴﺪ‬
‫و ﯾﮏ ‪ lexical analyzer‬ﺑﺮاﯼ ‪ MiniJava‬ﺑﺴﺎزﯾﺪ‪.‬‬
‫‪ .3‬ﺑﺎ ﻧﺮماﻓﺰار ‪ CUP‬ﺁﺷﻨﺎ ﺷﻮﯾﺪ! در ]‪ [3‬ﻣﯽﺗﻮاﻧﻴﺪ اﻃﻼﻋﺎت ﻣﺮﺑﻮﻃﻪ را ﭘﻴﺪا‬
‫ﮐﻨﻴﺪ و ﺑﺮﻧﺎﻣﻪ را درﯾﺎﻓﺖ ﮐﻨﻴﺪ‪ .‬اﯾﻦ ﺑﺮﻧﺎﻣﻪ ﺷﺒﻴﻪ ‪ Yacc‬ﯾﮏ ‪parser‬‬
‫‪ generator‬اﺳﺖ و ورودﯼ‪/‬ﺧﺮوﺟﯽ ﺁن ﺑﻪ ‪ Java‬اﺳﺖ‪ CUP .‬ﯾﮏ ‪LALR‬‬
‫‪ parser‬ﺗﻮﻟﻴﺪ ﻣﯽﮐﻨﺪ‪ .‬ﻃﺮز ﮐﺎر ﺑﺎ ﺁن را ﯾﺎد ﺑﮕﻴﺮﯾﺪ‪ .‬ﺳﭙﺲ ﺑﻪ ﮐﻤﮏ‬
‫ﻣﺸﺨﺼﺎت ‪) MiniJava‬ﮔﺮاﻣﺮ ﻏﻴﺮﻣﺒﻬﻤﯽ ﮐﻪ ﺳﺎﺧﺘﻪاﯾﺪ( و ﺧﺮوﺟﯽ‬
‫‪ ،JLex‬ﯾﮏ ‪ parser‬ﺑﺮاﯼ ‪ MiniJava‬ﺑﺴﺎزﯾﺪ‪.‬‬
‫‪ .4‬ﺳﺎﺧﺘﺎر )‪ abstract syntax tree (AST‬ﺧﻮد را ﻣﻌﻠﻮم ﮐﻨﻴﺪ‪ ،‬ﯾﻌﻨﯽ ﺗﻌﻴﻴﻦ‬
‫ﮐﻨﻴﺪ ﮐﻪ ‪node‬هﺎﯼ ‪ AST‬ﺷﻤﺎ از ﭼﻪ ﻧﻮﻋﯽ ﺑﺎﯾﺪ ﺑﺎﺷﺪ‪ ،‬و ﭼﮕﻮﻧﻪ ﺑﺎﯾﺪ ﺑﺎ‬
‫هﻢ ارﺗﺒﺎط داﺷﺘﻪﺑﺎﺷﻨﺪ‪ .‬ﺑﺮاﯼ ﺗﻌﺮﯾﻒ ‪ AST‬ﺑﻪ ﺑﺨﺶ ‪ 2.8.2‬ﮐﺘﺎب ﻣﺮاﺟﻌﻪ‬
‫ﮐﻨﻴﺪ‪ .‬ﻣﺒﺎﺣﺚ ﮐﺎﻣﻞﺗﺮ در اﯾﻦ ﻣﻮرد در ﻓﺼﻞ ‪ 5‬ﺁﻣﺪﻩاﺳﺖ‪ .‬ﻃﺮاﺣﯽ ﺷﻤﺎ‬
‫ﺑﺎﯾﺪ ﺑﻪ ﮔﻮﻧﻪاﯼ ﺑﺎﺷﺪ ﮐﻪ‪ ،‬اوﻻً در هﻨﮕﺎم ‪ parse‬ﺑﺘﻮان اﯾﻦ درﺧﺖ را ﺑﺪون‬
‫دردﺳﺮ زﯾﺎد ﺳﺎﺧﺖ‪ ،‬ﺛﺎﻧﻴﺎً ﺑﺘﻮان )ﺑﻌﺪاً( راﺣﺖ اﯾﻦ درﺧﺖ را ﻃﯽ ﮐﺮد و‬
‫ﻋﻤﻠﻴﺎﺗﯽ ﻣﺜﻞ ‪ type-checking‬و ﺗﻮﻟﻴﺪ ﮐﺪ ﻣﻴﺎﻧﯽ را روﯼ ﺁن اﻧﺠﺎم داد‪ .‬ﺑﻪ‬
‫ﺧﺼﻮص ﺑﻪ ‪node‬هﺎﯾﯽ ﺗﻮﺟﻪ ﮐﻨﻴﺪ ﮐﻪ ﺗﻌﺪاد ﻓﺮزﻧﺪاﻧﺸﺎن ﻣﺘﻐﻴﺮ اﺳﺖ‪،‬‬
‫ﻣﺜﻼً ‪function call‬هﺎ‪ .‬ﺷﺎﯾﺪ ]‪ [4‬ﺑﺘﻮاﻧﺪ ﺑﻪ ﺷﻤﺎ ﺑﺮاﯼ ﯾﮏ ﻃﺮاﺣﯽ ﺧﻮب‬
‫اﯾﺪﻩ ﺑﺪهﺪ‪.‬‬
‫‪ .5‬ﺑﺮﻧﺎﻣﻪﯼ ﺗﻮﻟﻴﺪﯼ ﺗﻮﺳﻂ ‪ ،CUP‬ﻓﻘﻂ ‪ parse‬ﻣﯽﮐﻨﺪ وﻟﯽ ‪ parse tree‬ﺑﻪ‬
‫ﺷﻤﺎ ﻧﻤﯽدهﺪ‪ .‬در ﻣﻘﺎﺑﻞ اﯾﻦ اﻣﮑﺎن را ﺑﻪ ﺷﻤﺎ ﻣﯽدهﺪ ﮐﻪ در هﻨﮕﺎم‬
‫‪ parse‬ﮐﺮدن‪ ،‬ﮐﺪهﺎﯼ دﻟﺨﻮاهﯽ را اﺟﺮا ﮐﻨﻴﺪ‪ .‬ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻃﺮاﺣﯽ ﺧﻮد در‬
‫ﻣﺮﺣﻠﻪﯼ ﻗﺒﻞ‪ ،‬ﮐﺪهﺎﯼ ﻣﺮﺑﻮﻃﻪ را ﺑﻨﻮﯾﺴﻴﺪ ﺗﺎ ﺑﻪ ﺑﺮﻧﺎﻣﻪاﯼ ﺑﺮﺳﻴﺪ ﮐﻪ‬
‫ﻋﻤﻞ ﺳﺎﺧﺖ ‪ AST‬را ﻧﻴﺰ اﻧﺠﺎم ﻣﯽدهﺪ‪ .‬اﯾﻦ ﻗﺴﻤﺖ ﺧﺴﺘﻪﮐﻨﻨﺪﻩﺗﺮﯾﻦ و‬
‫ﻃﻮﻻﻧﯽﺗﺮﯾﻦ ﻗﺴﻤﺖ ﮐﺎر اﺳﺖ‪.‬‬
‫ﻧﮑﺎت‪:‬‬
‫‪ 9‬اﯾﻦ ﭘﺮوژﻩ وﻗﺖﮔﻴﺮ اﺳﺖ و ﻣﻬﻠﺖ ﮐﺎر ﺑﻪ هﻤﻴﻦ دﻟﻴﻞ زﯾﺎد درﻧﻈﺮ ﮔﺮﻓﺘﻪ‬
‫ﺷﺪﻩ‪ .‬هﺮ ﭼﻪ ﺳﺮﯾﻊﺗﺮ ﮐﺎر را ﺷﺮوع ﮐﻨﻴﺪ ﺗﺎ وﻗﺖ ﮐﻢ ﻧﻴﺎورﯾﺪ‪ .‬ﻣﻬﻠﺖ‬
‫ﺗﻌﻴﻴﻦ ﺷﺪﻩ ﺗﻤﺪﯾﺪ ﻧﺨﻮاهﺪﺷﺪ‪ ،‬و دﯾﺮﮐﺮد ﺟﺮﯾﻤﻪ ﺧﻮاهﺪداﺷﺖ‪ .‬ﭘﺲ از‬
‫ﯾﮏ هﻔﺘﻪ ﭘﺲ از ﻣﻬﻠﺖ ﺗﻌﻴﻴﻦ ﺷﺪﻩ‪ ،‬ﻧﻤﺮﻩاﯼ ﻧﺨﻮاهﻴﺪﮔﺮﻓﺖ‪ .‬ﺑﻪﻋﻼوﻩ‪،‬‬
‫در ﻓﺎزهﺎﯼ ﺑﻌﺪﯼ از ﺧﺮوﺟﯽ اﯾﻦ ﻓﺎز ﺧﻮد اﺳﺘﻔﺎدﻩ ﺧﻮاهﻴﺪﮐﺮد ﭘﺲ‬
‫ﺳﻌﯽ ﮐﻨﻴﺪ ﺣﺘﻤﺎً ﺗﺎ زﻣﺎن ﺗﻌﻴﻴﻦ ﺷﺪﻩ ﺑﺮﻧﺎﻣﻪ را ﺗﮑﻤﻴﻞ ﮐﻨﻴﺪ‪.‬‬
‫‪ 9‬ﭘﺮوژﻩ در ﮔﺮوﻩهﺎﯼ ﺣﺪاﮐﺜﺮ دو ﻧﻔﺮﻩ ﺑﺎﯾﺪ اﻧﺠﺎم ﺷﻮد و ﺗﺎ ﻓﺎز اول‬
‫هﻢﮔﺮوهﯽهﺎﯼ ﺧﻮد را ﺑﺎﯾﺪ ﺷﻨﺎﺣﺘﻪ ﺑﺎﺷﻴﺪ‪ ،‬هﺮ ﻓﺮدﯼ در ﻓﺎز اول‬
‫هﻢﮔﺮوهﯽ ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ ﺑﺎﯾﺪ ﺗﻨﻬﺎﯾﯽ ﭘﺮوژﻩ را ﺗﺎ ﻓﺎز ﻧﻬﺎﯾﯽ ﺗﺤﻮﯾﻞ دهﺪ‪.‬‬
‫‪ 9‬ﻧﻤﺮﻩهﺎﯼ هﻢﮔﺮوهﯽهﺎ ﯾﮑﺴﺎن ﻧﺨﻮاهﺪ ﺑﻮد و ﺑﺮ اﺳﺎس ﻣﻴﺰان‬
‫ﻣﺸﺎرﮐﺖ در ﭘﺮوژﻩ ﺧﻮاهﺪ ﺑﻮد‪.‬‬
‫‪ 9‬ﺑﺮﻧﺎﻣﻪ ﻧﻬﺎﯾﯽ ﺧﻮد ‪ +‬ﻓﺎﯾﻞ ورودﯼ ﮐﻪ ﺑﻪ ‪ JLex‬دادﻩاﯾﺪ ‪ +‬ﻓﺎﯾﻞ ورودﯼ ﮐﻪ‬
‫ﺑﻪ ‪ CUP‬دادﻩاﯾﺪ ‪ documentation +‬را ﺑﻪ ﺻﻮرت ‪proj1-sn1-sn2.zip‬‬
‫درﺁوردﻩ )اﮔﺮ ﺗﻨﻬﺎ هﺴﺘﻴﺪ ﺑﻪ ﺻﻮرت ‪ (proj1-sn.zip‬و ﺑﻪ‬
‫‪ ce.compiler.course@gmail.com‬ارﺳﺎل ﮐﻨﻴﺪ‪ Subject .‬ﻧﻴﺰ ﺑﺎﯾﺪ‬
‫ﻣﺸﺎﺑﻪ اﺳﻢ ﻓﺎﯾﻞ ﺑﺎﺷﺪ‪ ،‬ﺑﺪون ﭘﺴﻮﻧﺪ‪ .‬ﭘﺮوژﻩ ﺗﺤﻮﯾﻞ ﺣﻀﻮرﯼ ﻧﻴﺰ ﺧﻮاهﺪ‬
‫داﺷﺖ‪ ،‬ﮐﻪ اﻋﻼم ﺧﻮاهﺪﺷﺪ‪.‬‬
‫‪ 9‬اﮔﺮ ﺳﻮاﻟﯽ داﺷﺘﻴﺪ در ‪ Discussion Area‬ﻣﻄﺮح ﮐﻨﻴﺪ ﯾﺎ ﺑﻪ‬
‫‪ abbas.mehrabian@gmail.com‬ﺑﻔﺮﺳﺘﻴﺪ‪.‬‬
‫‪ 9‬ﭘﺮوژﻩ را ﺑﺎﯾﺪ ﺧﻮدﺗﺎن اﻧﺠﺎم دهﻴﺪ‪ ،‬ﺑﺎ ﺗﻘﻠﺐ ﺑﻪ ﺷﺪت ﺑﺮﺧﻮرد ﺧﻮاهﺪﺷﺪ‪.‬‬
:‫ﻣﺮاﺟﻊ‬
[1] Minijava Grammar,
http://www.cambridge.org/us/features/052182060X/grammar.html
[2] JLex Homepage,
http://www.cs.princeton.edu/~appel/modern/java/JLex/
[3] CUP Homepage,
http://www.cs.princeton.edu/~appel/modern/java/CUP/
[4] JTB Auto-generated Classes,
http://compilers.cs.ucla.edu/jtb/jtb-2003/docs.html#auto