ﻧﮑﺎﺗﻲ ﺑﺮﺍ ﻧﻮﺷﺘﻦ ﻣﺴﺘﻨﺪﺍﺕ ١ﺧﻮﺏ ﻣﺴﺘﻨﺪﺍﺕ ﺩﺭ ﻭﺍﻗﻊ ﺟﺎ ﮔﺰﻳﻦ ﺗﺤﻮﻳﻞ ﺣﻀﻮﺭ ﻫﺴﺘﻨﺪ .ﺩﺭ ﻧﺘﻴﺠﻪ ﺑﺎﻳﺪ ﻃﻮﺭ ﺑﺎﺷﻨﺪ ﮐﻪ ﺍﻭ ﹰﻻ ﺭﺍﺣﺖ ﻗﺎﺑﻞ ﻓﻬﻢ ﺑﺎﺷﻨﺪ ،ﺛﺎﻧﻴ ﹰﺎ ﻧﮑﺎﺕ ﮐﻠﻴﺪ ﻭ ﻧﺎﺑﺪﻳﻬﻲ ﮐﺎﺭ ﺷﻤﺎ ﺭﺍ ﺷﺎﻣﻞ ﺑﺎﺷﻨﺪ .ﻓﺮﺽ ﮐﻨﻴﺪ ﻣﻲﺧﻮﺍﻫﻴﺪ ﭘﺮﻭﮊﻩﺍ ﮐﻪ ﺍﻧﺠﺎﻡ ﺩﺍﺩﻩﺍﻳﺪ ﺭﺍ ﺑﻪ ﻃﻮﺭ ﺧﻼﺻﻪ ﺑﺮﺍ ﻳﮏ ﻧﻔﺮ ﻧﺎﻭﺍﺭﺩ ﺗﻮﺿﻴﺢ ﺩﻫﻴﺪ .ﭼﻴﺰﻫﺎﻳﻲ ﮐﻪ ﺑﻪ ﺍﻭ ﻣﻲﮔﻮﺋﻴﺪ ﺭﺍ ﺑﺎﻳﺪ ﺩﺭ ﻣﺴﺘﻨﺪﺍﺕ ﺑﻨﻮﻳﺴﻴﺪ ﻭ ﭼﻴﺰﻫﺎﻳﻲ ﮐﻪ ﺧﻮﺩﺵ ﺑﺪﻭﻥ ﻓﮑﺮ ﺯﻳﺎﺩ ﻣﻲﺗﻮﺍﻧﺪ ﺑﻔﻬﻤﺪ ﺭﺍ ﻻﺯﻡ ﻧﻴﺴﺖ. ﻭ ﺿﻤﻨ ﹰﺎ ﻫﻢ ﺑﺮﺍ ﺩﺭﮎ ﺑﻬﺘﺮ ﻣﻮﺿﻮﻉ ﻭ ﻫﻢ ﺑﻴﺎﻥ ﺩﻗﻴﻖ ﺟﺰﺋﻴﺎﺕ ،ﻣﺜﺎﻝ ﺯﺩﻥ ﺧﻴﻠﻲ ﻣﻲﺗﻮﺍﻧﺪ ﻣﻔﻴﺪ ﺑﺎﺷﺪ، ﻣﺨﺼﻮﺻ ﹰﺎ ﺯﺩﻥ ﻣﺜﺎﻝﻫﺎ ﺧﺎﺹ. ٢ ﻼ ﺩﺭ ﻓﺎﺯ ﺳﻮﻡ ﭘﺮﻭﮊﻩ ﮐﺎﻣﭙﺎﻳﻠﺮ ،ﺩﺭ ﻃﺮﺍﺣﻲ ﺟﺪﻭﻝ ﻧﻤﺎﺩﻫﺎ ﻧﮑﺎﺕ ﻧﺎﺑﺪﻳﻬﻲﺍ ﮐﻪ ﻭﺟﻮﺩ ﺩﺍﺷﺖ ﺍﻳﻦﻫﺎ ﻣﺜ ﹰ ﺑﻮﺩ :ﺳﺎﺧﺘﺎﺭ ﮐﻠﻲ ﺟﺪﻭﻝ ،ﻳﻌﻨﻲ ﺍﺯ ﭼﻪ ﮐﻼﺱﻫﺎﻳﻲ ﺍﺳﺘﻔﺎﺩﻩ ﮐﺮﺩﻩﺍﻳﺪ ﻭ ﻧﻘﺶ ﺁﻥﻫﺎ ﭼﻴﺴﺖ؟ ﺟﺰﺋﻴﺎﺕ ﻧﺎﺑﺪﻳﻬﻲ ﺍﻳﻦﻫﺎ ﻫﺴﺘﻨﺪ :ﭼﮕﻮﻧﮕﻲ ﭘﻴﺎﺩﻩﺳﺎﺯ extendsﻭ ﭼﮕﻮﻧﮕﻲ ﻧﮕﻪﺩﺍﺭ ﺁﺭﮔﻮﻣﺎﻥﻫﺎ ﺗﻮﺍﺑﻊ. ﻣﺜﺎﻝ ﺧﻮﺏ: .۱ MethodTableشامل اجزاي زیر است : یك > HashTable<String , Stringبه نام allVarsاست که به ازاي هر متغیر تعریف شدهدر کالس ،نام آن به همراه typeآن را به allVarsاضافه ميکنیم ( .مولفه ی اول مربوط به نام و مولفه ی دوم مربوط به نوع متغیر است(. یک > HashTable<String , Stringبه نام allParamsاست که به ازاي هر parameterتعریف شده در کالس ،نام آن به همراه typeآن را به allParamsاضافه ميکنیم. و همین طور یک > ArrayList<Stringبه نام paramsکه ترتیب پارامترها را در خود نگهمیدارد .وقتی متدی صدا زده می شود ،به کمک این لیست درست بودن ترتیب پارامترهای داده شده به آن را چک میکنیم . Parentکه نام کالسي که methodدر آن تعریف شده را در خود نگه ميدارد. returnType -که براي هر تابع مشخص شده را نگاه میدارد. ﻣﺜﺎﻝ ﺑﺪ: .۱در این فاز برای ساختن جدول سمبلها از کالس SymbolTableBuilderاستفاده میشود. این کالس گرههای درخت را پرمایش کرده و اسم و تایپ سمبلها را استخراج میکند .این documentation symbol table 1 2 کالس از سه کالس اصلی classSymbolو methodSymbolو fieldSymbolبرای شناسایی سمبل "کالس""،متد" و "فیلد"های کالسهای miniJavaکمک میگیرد .در همین مرحله اگر اسم دو کالس در برنامه یکی باشد و یا اینکه دو متد همنام یا فیلد همنام داشتهباشیم، semanticErrorدادهمیشود و بقیهی مراحل انجام نمیشود ← .ﻓﺎﻗﺪ ﺟﺰﺋﻴﺎﺕ ﮐﺎﻓﻲ .۲هر عضو سیمبل تیبل ۴عضو دارد ،اولی نشاندهنده ی کالسی است که در آن هستیم ، دومی نشان دهنده ی تابعی که در آن هستیم ،سومی نام این سیمبل است و آخری تایپ آن) .البته در مواقعی مانند وقتی که سیمبل یک کالس است ،تفاوتهای اندکی وجود دارد( ← ﻓﺎﻗﺪ ﺟﺰﺋﻴﺎﺕ ﮐﺎﻓﻲ دربارهی جزئیات انجام :type-checking ﻣﺜﺎﻝ ﺑﺪ: .۱طریقهی تایپ چکینگ ،کاملن معمولی است و به صورتِ بازگشتی روی درختِ برنامه انجام می شود .مثال برای یک عبارت جمع ،ابتدا چک می شود که تایپ سمت چپ اینتیجر باشد ،سپس چک می شود که تایپ سمت راست اینتیجر باشد و در انتها هم تایپ اینتیجر به عنوانِ تایپ کلی عبارت برگردانده می شود ← .ﻓﺎﻗﺪ ﺟﺰﺋﻴﺎﺕ ﮐﺎﻓﻲ .۲تابع visitرا صدا می زنیم که این تابع کار type checkingرا انجام می دهد که در این تابع duplicationرا نیز checkمی کنیم و هم چنین اینکه آیا متغیر تعریف شده یا نه ،یا اینکه متغیر جز فیلد های کالس هست یا نه .هم چنین برای method call ، checkها field ، argsرا که در traverseساخته بودیم با ، typeپارامترهای ورودی چک می کنیم ← ﻓﺎﻗﺪ ﺟﺰﺋﻴﺎﺕ ﮐﺎﻓﻲ .۳در زمان Type ،Parseمتغیرها به صورت L-Attributeدر گرههای درخت منتشر میشوند تا نهایتاً در Passمربوطه به Type Checkبر مبنای Attributeهای تولید شده کنترلهای الزم صورت گیرند ← .ﻓﺎﻗﺪ ﺟﺰﺋﻴﺎﺕ ﮐﺎﻓﻲ ﻣﺜﺎﻝ ﺧﻮﺏ: .۱برای عمل Type-Checkingالزم است یک بار درخت را طی کنیم .برای این کار برای هر node درخت به جز Expressionها یک متد با نام typeCheckتعریف شده است که در صورت وجود مشکل یک Exceptionاز نوع TypeExceptionرا Throwمیکند .برای Expressionها نیز یک متد با نام getTypeتعریف شده است که Typeآن Expressionرا برمیگرداند و در صورت وجود مشکل یک Exceptionاز نوع TypeExceptionرا Throw میکند .علت اینکه برای Expressionها متد متفاوتی تهیه شده است آن است که Expressionها دارای Typeهستند اما سایر nodeهای درخت Typeندارند .در طی کردن درخت از attributeاستفاده نشده است. .۲برای این کار از کالس TypeCheckerکه با توجه به الگوی Visitorپیادهسازی شده ،استفاده میشود. تابع )arg ،visit(node,برای nodeهای عبارت )،ExpressionNode IdentifierNodeو Nodeهای مربوط به جمع ،ضرب و (...نوع آنها را بازمیگرداند .بدین وسیله عملیات Type Checkingبهسادگی قابل انجام است .مثال در فراخوانی )( visitبرای یک Nodeمقایسه ،ابتدا دو طرف این عملگر )( visitمیشوند .نوع آنها باید intباشد. سپس این تابع نوع booleanرا به خروجی میدهد.
© Copyright 2025 Paperzz