Thông tin tài liệu:
Bài giảng Chương trình dịch - Bài giảng 6 trình bày về biên dịch dựa cú pháp. Các nội dung chính được trình bày trong bài giảng này gồm có: Cú pháp điều khiển, các loại thuộc tính, đồ thị phụ thuộc, lược đồ dịch, cú pháp điều khiển trong phân tích LL. Mời tham khảo.
Nội dung trích xuất từ tài liệu:
Bài giảng Chương trình dịch: Bài giảng 6 - Nguyễn Phương Thái NguyễnPhươngTháiBộmônKhoahọcMáytínhhttp://www.coltech.vnu.vn/~thainp/Nội dungCúphápđiềukhiểnCácloạithuộctínhĐồthịphụthuộcLượcđồdịchCúphápđiềukhiểntrongphântíchLLCú pháp điều khiểnCúphápđiềukhiển(syntaxdirecteddefinition):làmột dạngtổngquáthoácủavănphạmphingữcảnh,trong đómỗikýhiệuvănphạmcómộttậpthuộctínhđikèm, đượcchiathành2tậpconlàthuộctínhtổnghợp (synthesizedattribute)vàthuộctínhkếthừa(inherited attribute)củakýhiệuvănphạmđó.Mộtcâyphântíchcúphápcótrìnhbàycácgiátrịcủacác thuộctínhtạimỗinútđượcgọilàcâyphântíchcúpháp cóchúgiải(ngữnghĩa)(annotatedparsetree).Cú pháp điều khiển (tiếp)Địnhnghĩa: Trongmỗicúphápđiềukhiển,mỗisảnxuấtA> cóthể đượcliênkếtvớimộttậpcácquitắcngữnghĩacódạng b=f(c1,...,ck)vớiflàmộthàmvà blàmộtthuộctínhtổnghợpcủaA,cònc1,...,cklàcác thuộctínhcủacáckýhiệutrongsảnxuấtđó.Hoặc blàmộtthuộctínhkếthừacủamộttrongnhữngkýhiệu ởvếphảicủasảnxuất,cònc1,...,cklàthuộctínhcủa cáckýhiệuvănphạm.Ví dụ về thuộc tính tổng hợpSảnxuất LuậtngữnghĩaL>En Print(E.val)E>E1+T E.val=E1.val+T.valE>T E.val=T.valT>T1*F T.val=T1.val*F.valT>F T.val=F.valF>(E) F.val=E.valF>digit F.val=digit.lexval F1.val=3(syntax:F1>3semantic: F1.val=3.lexical) L F2.val=4(syntax:F2>3semantic: E1 n F2.val=4.lexical) T2.val=3(syntax:T2>F1semantic:T2.val=F1.val) E2 + T3 T1.val=3*4=12(syntax:T1>T2*F2semantic: T1.val=T2.val*F2.val) T1 F3 F3.val=4(syntax:F3>4semantic:T2 * F2 4 F3.val=4.lexical)F1 T3.val=4(syntax:T3>F3semantic:T3.val=F3.val) 4 E1.val=12+4=16(syntax:E1>E2+T3semantic:3 E1.val=E2.val+T3.val) “16”(syntax:L>E1nsemantic:print(E1.val))Câu vào “3*4+4”Ví dụ về thuộc tính kế thừaSảnxuất LuậtngữnghĩaD>TL L.in:=T.typeT>int T.type:=intergerT>real T.type:=realL>L1,id L1.in:=L.in;addtype(id.entry,L.in)L>id addtype(id.entry,L.in) Chúngtaduyệtvàthựchiệncáchànhđộngngữ nghĩatheochiềusâuvàtừtráisangphải.sẽ cókếtquảlầnlượtnhưsau: T.type=interger(syntax:T>intsemantic: D T.type=interger) L1.in=interger(syntax:D>TL1semantic: T L1 L1.in=T.type) L2.in=interger(syntax:L1>L2,a semantic:L2.in=L1.in) int L2 , a a.entry=interger(syntax:L1>L2,asemantic: addtype(a.entry,L1.in)) L3 , b L3.in=interger(syntax:L2>L3,b semantic:L3.in=L2.in) b.entry=interger(syntax:L2>L3,bsemantic: c addtype(b.entry,L2.in)) c.entry=interger(syntax:L3>csemantic: addtype(c.entry,L3.in))Câu vào “int c, b, a”Đồ thị phụ thuộcNếumộtthuộctínhbtạimộtnúttrongcâyphântíchcú phápphụthuộcvàomộtthuộctínhc,thìhànhđộngngữ nghĩachobtạinútđóphảiđượcthựchiệnsaukhithực hiệnhànhđộngngữnghĩachoc.Sựphụthuộcqualại củacácthuộctínhtổnghợpvàkếthừatạicácnúttrong mộtcâyphântíchcúphápcóthểđượcmôtảbằngmột đồthịcóhướnggọilàđồthịphụthuộc(dependency graph).Đồ thị phụ thuộc (tiếp) formỗinútntrongcâyphântíchcúphápdo formỗithuộctínhacủakýhiệuvănphạmtạindo xâydựngmộtnúttrongđồthịphụthuộcchoa; formỗinútntrongcâyphântíchcúphápdo formỗihànhđộngngữnghĩab:=f(c1,c2,...,ck) đikèmvớisảnxuấtđượ ...