190 likes | 728 Views
طراحي كامپايلر. گردآوري ، ترجمه و تنظيم : غلامرضا فهيمي كاشاني. تبديل عبارات با قاعده به DFA. مي توانيم يك عبارت با قاعده را بدون ايجاد NFA به DFA تبديل كنيم. در ابتدا به انتهاي عبارت باقاعده علامت # را اضافه مي كنيم داريم : r (r)#
E N D
طراحي كامپايلر گردآوري ، ترجمه و تنظيم : غلامرضا فهيمي كاشاني طراحي كامپايلر
تبديل عبارات با قاعده به DFA • مي توانيم يك عبارت با قاعده را بدون ايجاد NFA به DFA تبديل كنيم. • در ابتدا به انتهاي عبارت باقاعده علامت # را اضافه مي كنيم داريم : r (r)# • سپس درخت تجزيه و تركيب عبارت با قاعده مورد نظر را ترسيم مي نمائيم • در درخت فوق تمامي نشانه هاي حروف الفبا، # و جاهاي خالي در محل برگ ها قرار مي گيرند. • تمامي نودهاي داخلي در درخت مربوط به عملگرها خواهد بود. • سپس تمامي برگ ها را شماره گذاري مي كنيم. • به مثال در اسلايد بعد توجه نمائيد. طراحي كامپايلر
# 4 * a 3 | a b 1 2 مثال : تبديل عبارت با قاعده به DFA (a|b) * a (a|b) * a # عبارت با قاعده : • درخت ترسيم شده براي عبارت زير: • (a|b) * a # • هر كدام از جايگاه ها شماره گذاري شده اند • هر كدام از حروف ها در محل بر گ ها قرار دارند • نودهاي داخلي محل قرارگيري عملگرها مي باشد طراحي كامپايلر
Followposتابع در ادامه بايستي تابع Followpos را براي محل منتسب به برگ ها محاسبه مي كنيم followpos(i) : مجموعه مكان هايي است كه بعد از مكان i قرار مي گيرند لازم به ذكر است كه اين تابع فقط براي محل برگ ها تعريف مي شود و براي نودهاي داخلي قابل تعريف نيست. . براي مثال : ( a | b) * a # 1 2 3 4 followpos(1) = {1,2,3} followpos(2) = {1,2,3} followpos(3) = {4} followpos(4) = {} محل قرارگيري حروف در عبارت سطوح مختلف درخت طراحي كامپايلر
نحوه محاسبه توابعfirstpos, lastpos, nullable براي محاسبه تابع followpos نيازمند محاسبه توابع زير در درخت نحو مي باشيم : firstpos(n) -- مجموعه اولين حروف توليد شده بوسيله زير عبارت درمحل n • lastpos(n) -- • مجموعه آخرين حرف توليد شده بوسيله زير عبارت در محل n • nullable(n) -- • اين تابع در صورتيكه محل خالي عضوي از رشته توليد شده بوسيله زير عبارت در محل n باشد برابر true و در غير اينصورت مساوي false خواهد بود. طراحي كامپايلر
طريقه محاسبه توابع firstpos, lastpos, nullable OR node CAT node STAR node طراحي كامپايلر
n n C1 C2 C1 چگونه followposرا برآورد كنيم؟ followpos(i) = { firstpos(c2) } Cat-node براي محاسبه تابعfollowpos دو قانون زير را در نظر مي گيريم : 1 – اگر سطح n يك cat-node باشد و دو انشعاب c1(چپ) و c2 (راست) داشته باشد و i محلي در مجموعه lastpos(c1)باشد تمامي اعضاي firstpos(c2)در تابع followpos(i) قرار خواهند گرفت. 2 – اگر سطح n يك star-node باشد وi محلي در مجموعه lastpos(n)باشد تمامي اعضاي firstpos(n)در تابع followpos(i) قرار خواهند گرفت. اگر توابع firstpos و lastpos براي هر نود درخت محاسبه شوند تابع followpos با يك پيمايش عمقي در درخت نحوي قابل محاسبه خواهد بود. ilastpos(c1) firstpos(c2) followpos(i) = { firstpos(n) } Star-node firstpos(n) ilastpos(n) طراحي كامپايلر
{4} {1,2,3} {1,2,3} {3} {4} {4} {1,2} {1,2} {3} {3} # 4 {1,2} {1,2} * a 3 {1} {1} {2} {2} | a b 2 1 مثال ( a | b) * a # قرمزها– firstpos آبي ها – lastpos پس از محاسبه توابعfirstposو lastpos تابع followpos را به صورت زير محاسبه مي كنيم. followpos(1) = {1,2,3} followpos(2) = {1,2,3} followpos(3) = {4} followpos(4) = {} • پس از محاسبه followpos براي ايجاد DFA آماده مي شويم. • . طراحي كامپايلر
الگوريتم تبديل (عبارت باقاعده به DFA) • درخت نحو عبارت (r)# را ايجاد مي كنيم. • توابع followpos, firstpos, lastpos, nullable را محاسبه مي كنيم . • تابع firstpos(root) را بعنوان يك حالت علامت نخورده از حالات DFA در نظر مي گيريم. • تا زماني كه حالت S از مجموعه حالت هاي DFA علامت نخورده است مراحل زير انجام مي پذيرد: • حالت S را علامت مي زنيم. • براي هر ورودي با علامت a • در صورتيكه s1…….sn مكان هاي موجود در S بوده و ليبل آن مكان ها a باشد. • S’ followpos(s1) ... followpos(sn) • move(S,a) S’ • اگر S’ خالي نبوده و جزو حالتهاي DFA نيز نباشد آن را جزو حالت هاي علامت نخورده DFA قرار مي دهيم. • حالت شروع DFAfirstpos(root) مي باشد. • حالت پذيرش DFA تمامي حالت هايي است كه در آن مكان # وجود داشته باشد. طراحي كامپايلر
1 2 3 4 مثال -- ( a | b) * a # followpos(1)={1,2,3} followpos(2)={1,2,3} followpos(3)={4} followpos(4)={} S1=firstpos(root)={1,2,3} mark S1 a: followpos(1) followpos(3)={1,2,3,4}=S2 move(S1,a)=S2 b: followpos(2)={1,2,3}=S1 move(S1,b)=S1 mark S2 a: followpos(1) followpos(3)={1,2,3,4}=S2 move(S2,a)=S2 b: followpos(2)={1,2,3}=S1 move(S2,b)=S1 حالت شروعS1 حالت پذيرش {S2} b a a S1 S2 b طراحي كامپايلر
مثال -- ( a | ) b c* # 1 2 3 4 followpos(1)={2} followpos(2)={3,4} followpos(3)={3,4} followpos(4)={} S1=firstpos(root)={1,2} mark S1 a: followpos(1)={2}=S2 move(S1,a)=S2 b: followpos(2)={3,4}=S3 move(S1,b)=S3 mark S2 b: followpos(2)={3,4}=S3 move(S2,b)=S3 mark S3 c: followpos(3)={3,4}=S3 move(S3,c)=S3 S1شروع حالت{S3}حالت پذيرش S2 a b S1 b c S3 طراحي كامپايلر
پايان rezafahimi@yahoo.com طراحي كامپايلر