ÌåôáãëùôôéóôÝò Íßêïò Ðáðáóðýñïõ {nickie}@softlab.ntua.gr ÊùóôÞò Óáãþíáò {kostis}@cs.ntua.gr Åèíéêü Ìåôóüâéï Ðïëõôå íåßï Ó ïëþ Çëåêôñïëüãùí Ìç. êáé Ìç. Õðïëïãéóôþí ÅñãáóôÞñéï Ôå íïëïãßáò Ëïãéóìéêïý Ðïëõôå íåéïýðïëç, 15780 ÆùãñÜöïõ. Áðñßëéïò 2011 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 1 / 216
ÅéóáãùãÞ (i) Ãëþóóåò ðñïãñáììáôéóìïý ÌåôáãëùôôéóôÝò Áíáãêáéüôçôá êáé éóôïñéêþ áíáäñïìþ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 2 / 216
ÅéóáãùãÞ (i) Ãëþóóåò ðñïãñáììáôéóìïý ÌåôáãëùôôéóôÝò Áíáãêáéüôçôá êáé éóôïñéêþ áíáäñïìþ αρχικό πρόγραµµα τελικό πρόγραµµα µεταγλωττιστής διαγνωστικά µηνύµατα Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 2 / 216
ÅéóáãùãÞ (ii) Áñ éêþ ãëþóóá L A A T ÔåëéêÞ ãëþóóá L T Ãëþóóá õëïðïßçóçò L Y Y Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 3 / 216
ÅéóáãùãÞ (ii) Áñ éêþ ãëþóóá L A A T ÔåëéêÞ ãëþóóá L T Ãëþóóá õëïðïßçóçò L Y Y Óçìáóéïëïãßá ôïõ ðñïãñüììáôïò P óôç ãëþóóá L [[P ]] L : Inp(P ) Out(P ) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 3 / 216
ÅéóáãùãÞ (ii) Áñ éêþ ãëþóóá L A A T ÔåëéêÞ ãëþóóá L T Ãëþóóá õëïðïßçóçò L Y Y Óçìáóéïëïãßá ôïõ ðñïãñüììáôïò P óôç ãëþóóá L [[P ]] L : Inp(P ) Out(P ) Óçìáóßá åíüò ìåôáãëùôôéóôþ C [[C ]] LY : L A L T Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 3 / 216
ÅéóáãùãÞ (iii) Ïñèüôçôá ôïõ ìåôáãëùôôéóôþ: \ôï ìåôáãëùôôéóìýíï ðñüãñáììá ðñýðåé íá åßíáé éóïäýíáìï ìå ôï áñ éêü" Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 4 / 216
ÅéóáãùãÞ (iii) Ïñèüôçôá ôïõ ìåôáãëùôôéóôþ: \ôï ìåôáãëùôôéóìýíï ðñüãñáììá ðñýðåé íá åßíáé éóïäýíáìï ìå ôï áñ éêü" [[P ]] LA = [[[[C ]] LY (P )]] LT Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 4 / 216
ÅéóáãùãÞ (iv) Åßäç ìåôáãëùôôéóôþí: Áðëïß Áíôßóôñïöïé (decompilers) Ìåôá-ìåôáãëùôôéóôÝò (meta-compilers) ÅéäéêÝò ðåñéðôþóåéò ìåôáãëùôôéóôþí: ÐñïåðåîåñãáóôÝò (preprocessors) ÓõìâïëïìåôáöñáóôÝò (assemblers) ÃåííÞôïñåò ðñïãñáììüôùí (program generators) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 5 / 216
ÅéóáãùãÞ (v) ÓõíáöÞ åñãáëåßá Äéåñìçíåßò (interpreters) Äéá åéñéóôýò âéâëéïèçêþí (library managers) ÓõíäÝôåò (linkers) ÖïñôùôÝò (loaders) Åêäüôåò ðñïãñáììüôùí (program editors) ÅíôïðéóôÝò óöáëìüôùí (debuggers) Óôáôéóôéêïß áíáëõôýò (prolers) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 6 / 216
ÊáôáóêåõÞ ìåôáãëùôôéóôþ (i) ÂáóéêÝò áðáéôþóåéò: Íá ëåéôïõñãåß óùóôü Íá óõììïñöþíåôáé ìå ôéò ðñïäéáãñáöýò ôçò áñ éêþò êáé ôçò ôåëéêþò ãëþóóáò Íá ìåôáãëùôôßæåé ðñïãñüììáôá êüèå ìåãýèïõò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 7 / 216
ÊáôáóêåõÞ ìåôáãëùôôéóôþ (ii) Åðéðñüóèåôåò áðáéôþóåéò: Íá ðáñüãåé áðïäïôéêü êþäéêá Íá Ý åé ìéêñü ñüíï ìåôáãëþôôéóçò Íá Ý åé ìéêñýò áðáéôþóåéò ìíþìçò êáôü ôç ìåôáãëþôôéóç Íá äßíåé êáëü äéáãíùóôéêü ìçíýìáôá Íá óõíå ßæåé ýóôåñá áðü ëüèç Íá åßíáé ìåôáöýñóéìïò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 8 / 216
ÖÜóåéò êáé ðñïúüíôá ôçò ìåôáãëþôôéóçò αρχικό πρόγραµµα ËåêôéêÞ áíüëõóç Λεκτική ανάλυση λεκτικές µονάδες ÓõíôáêôéêÞ áíüëõóç Συντακτική Ανάλυση ÓçìáóéïëïãéêÞ áíüëõóç συντακτικό δέντρο Σηµασιολογική Ανάλυση ÐáñáãùãÞ åíäéüìåóïõ êþäéêá Πίνακας συµβόλων συντακτικό δέντρο Παραγωγή ενδιάµεσου κώδικα Χειριστής σφαλµάτων Âåëôéóôïðïßçóç ενδιάµεσος κώδικας Βελτιστοποίηση ενδιάµεσου κώδικα ÐáñáãùãÞ ôåëéêïý êþäéêá ενδιάµεσος κώδικας Παραγωγή τελικού κώδικα τελικός κώδικας Βελτιστοποίηση τελικού κώδικα τελικό πρόγραµµα Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 9 / 216
ÈÝìáôá õëïðïßçóçò ÏñãÜíùóç óå ðåñüóìáôá ÏñãÜíùóç óå åìðñüóèéï êáé ïðßóèéï ôìþìá (front-end / back-end) ëåã ïò ïñèüôçôáò Åßäç äéáãíùóôéêþí ìçíõìüôùí êáé áíüíçøç ÅóùôåñéêÜ (internal) ÓöÜëìáôá (errors) ÐñïåéäïðïéçôéêÜ ìçíýìáôá (warnings) ÁðëÜ ìçíýìáôá (messages) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 10 / 216
Åêêßíçóç { bootstrapping A T A T A T A A T T S S T T T ÂÞìá 1: ÌåôáãëùôôéóôÞò ãéá S A óôçí T. ÂÞìá 2: ÌåôáãëùôôéóôÞò ãéá ôçí A óôçí S. ÂÞìá 3: ÌåôáãëùôôéóôÞò ãéá ôçí A óôçí A. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 11 / 216
ÏñãÜíùóç óå Ýíá ðýñáóìá Εµπρόσθιο τµήµα Συντακτικός αναλυτής Λεκτικός αναλυτής Σηµασιολογικός αναλυτής Γεννήτορας ενδιάµεσου κώδικα Βελτιστοποιητής ενδιάµεσου κώδικα Χειριστής σφαλµάτων Πίνακας συµβόλων Γεννήτορας τελικού κώδικα Βελτιστοποιητής τελικού κώδικα Οπίσθιο τµήµα Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 12 / 216
ÊåöÜëáéï 2: ÔõðéêÝò ãëþóóåò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 13 / 216
ÔõðéêÝò ãëþóóåò (i) ÂáóéêÝò Ýííïéåò ÁëöÜâçôï Óýìâïëï ÓõìâïëïóåéñÜ ÌÞêïò óõìâïëïóåéñüò Óýíïëï óõìâïëïóåéñþí ìþêïõò n Óýíïëï üëùí ôùí óõìâïëïóåéñþí Σ = Σ n n=0 Σ a α α Σ n Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 14 / 216
ÔõðéêÝò ãëþóóåò (ii) ÂáóéêÝò Ýííïéåò ÊåíÞ óõìâïëïóåéñü (óõíý åéá) ÐáñÜèåóç óõìâïëïóåéñþí ÐáñÜèåóç óõìâïëïóåéñüò ìå ôïí åáõôü ôçò α 0 = ɛ α n+1 = αα n Ðñüèåìá, åðßèåìá, õðïóõìâïëïóåéñü ɛ αβ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 15 / 216
ÔõðéêÝò ãëþóóåò (iii) ÂáóéêÝò Ýííïéåò Ãëþóóá (óõíý åéá) íùóç ãëùóóþí L 1 L 2 = { α α L 1 α L 2 } ÐáñÜèåóç ãëùóóþí L 1 L 2 = { αβ α L 1 β L 2 } ÐáñÜèåóç ãëþóóáò ìå ôïí åáõôü ôçò L 0 = { ɛ } L n+1 = LL n Êëåßóéìï Þ Üóôñï ôïõ Kleene L = L n L + = LL n=0 L Σ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 16 / 216
ÔõðéêÝò ãëþóóåò (iv) ÃåííçôéêÜ ìïíôýëá ÃñáììáôéêÞ G = (T, N, P, S) T : ôåñìáôéêü óýìâïëá a N : ìç ôåñìáôéêü óýìâïëá A P : êáíüíåò ðáñáãùãþò α β S : áñ éêü óýìâïëï ÐáñáãùãÝò: áí α, β, γ, δ (T N) êáé (α β) P ôüôå γαδ γβδ Ãëþóóá: L(G) = { α T S + α } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 17 / 216
ÔõðéêÝò ãëþóóåò (v) Éåñáñ ßá Chomsky Ôýðïõ 0: üëåò ïé ãñáììáôéêýò, α β Ôýðïõ 1: ãñáììáôéêýò ìå óõìöñáæüìåíá (context-sensitive), α β ìå α β Ôýðïõ 2: ãñáììáôéêýò ùñßò óõìöñáæüìåíá (context-free) A β Ôýðïõ 3: êáíïíéêýò ãñáììáôéêýò (regular) A ab Þ A a ÅéäéêÞ ðåñßðôùóç: ãëþóóåò ðïõ ðáñüãïõí ôçí êåíþ óõìâïëïóåéñü Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 18 / 216
ÔõðéêÝò ãëþóóåò (vi) ÁíáãíùñéóôÝò Ôýðïõ 0: ìç áíþ Turing Ôýðïõ 1: ãñáììéêü ðåñéïñéóìýíç ìç áíþ Turing Ôýðïõ 2: áõôüìáôá óôïßâáò (push-down automata) ñþóéìá óôç óõíôáêôéêþ áíüëõóç Ôýðïõ 3: ðåðåñáóìýíá áõôüìáôá (nite automata) ñþóéìá óôç ëåêôéêþ áíüëõóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 19 / 216
ÊáíïíéêÝò ãëþóóåò (i) ÊáíïíéêÝò ãñáììáôéêýò Ìüíï êáíüíåò A ab Þ A a éóïäýíáìá A Ba Þ A a ÊáíïíéêÝò åêöñüóåéò (regular expressions) ÊåíÞ óõìâïëïóåéñü: ɛ ÊÜèå óýìâïëï ôïõ Σ: a ÐáñÜèåóç äýï êáíïíéêþí åêöñüóåùí: (rs) ÄéÜæåõîç äýï êáíïíéêþí åêöñüóåùí: (r s) Êëåßóéìï (Þ Üóôñï) Kleene: (r ) Óõíôïìïãñáößåò: áðáëïéöþ ðåñéôôþí ðáñåíèýóåùí r + [a 1, a 2,..., a n ] [a 1 a 2 ] r?. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 20 / 216
ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216
ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216
ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216
ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216
ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) ([1-9][0-9] 0) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216
ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) ðñïáéñåôéêü: õðïäéáóôïëþ êáé êëáóìáôéêü ìýñïò ([1-9][0-9] 0) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216
ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) ðñïáéñåôéêü: õðïäéáóôïëþ êáé êëáóìáôéêü ìýñïò ([1-9][0-9] 0)(\.[0-9] + )? Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216
ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) ðñïáéñåôéêü: õðïäéáóôïëþ êáé êëáóìáôéêü ìýñïò ðñïáéñåôéêü: åêèýôçò ìå Þ ùñßò ðñüóçìï ([1-9][0-9] 0)(\.[0-9] + )? Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216
ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) ðñïáéñåôéêü: õðïäéáóôïëþ êáé êëáóìáôéêü ìýñïò ðñïáéñåôéêü: åêèýôçò ìå Þ ùñßò ðñüóçìï ([1-9][0-9] 0)(\.[0-9] + )?((E e)(+ )?[0-9] + )? Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216
ÐåðåñáóìÝíá áõôüìáôá (i) 0 0 A 1 1 B ÊáôáóôÜóåéò êáé ìåôáâüóåéò ÍôåôåñìéíéóôéêÜ (ÍÐÁ), ìç íôåôåñìéíéóôéêü (ÌÐÁ) êáé ÌÐÁ ìå êåíýò ìåôáâüóåéò (ÌÐÁ-ɛ) Áñ éêþ êáôüóôáóç, ôåëéêýò êáôáóôüóåéò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 22 / 216
ÐåðåñáóìÝíá áõôüìáôá (ii) 0 0 A 1 1 B Ðïéá ãëþóóá áíáãíùñßæåé; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 23 / 216
ÐåðåñáóìÝíá áõôüìáôá (ii) 0 0 A 1 1 B Ðïéá ãëþóóá áíáãíùñßæåé; Ôç ãëþóóá ôùí óõìâïëïóåéñþí ðïõ áðïôåëïýíôáé áðü 0 êáé 1 êáé ðåñéý ïõí Üñôéï áñéèìü 1 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 23 / 216
ÊáíïíéêÝò ãëþóóåò, áíáóêüðçóç ÁíáãùãÝò êáé éóïäõíáìßåò êáíïíéêþ ãñáììáôéêþ ÌÐÁ-ɛ êáíïíéêþ Ýêöñáóç ÌÐÁ-ɛ ÌÐÁ-ɛ Åëá éóôïðïßçóç ÍÐÁ ÌÐÁ-ɛ êáíïíéêþ ãñáììáôéêþ ÌÐÁ-ɛ êáíïíéêþ Ýêöñáóç ÍÐÁ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 24 / 216
ÊåöÜëáéï 3: ËåêôéêÞ áíüëõóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 25 / 216
ËåêôéêÞ áíüëõóç ËåêôéêÝò ìïíüäåò (tokens) Áíáãíùñßæïíôáé ìå ðåðåñáóìýíá áõôüìáôá ðïõ: äéáâüæïõí åíäå ïìýíùò ðåñéóóüôåñïõò áñáêôþñåò ïðéóèïäñïìïýí áí ñåéáóôåß äéáèýôïõí Ýîïäï ðïõ ñçóéìïðïéåßôáé óôç óõíôáêôéêþ áíüëõóç Åéäéêüò óõìâïëéóìüò: äéáãñüììáôá ìåôüâáóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 26 / 216
ÄéáãñÜììáôá ìåôüâáóçò (i) ÁíáãíùñéóôéêÜ ôçò Pascal L 0 L 1 D Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 27 / 216
ÄéáãñÜììáôá ìåôüâáóçò (i) ÁíáãíùñéóôéêÜ ôçò Pascal L 0 L 1 D L L * όχι L/D 0 1 2 (T_id) D Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 27 / 216
ÄéáãñÜììáôá ìåôüâáóçò (ii) ÔåëåóôÝò > êáé >= 0 > 1 = 2 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 28 / 216
ÄéáãñÜììáôá ìåôüâáóçò (ii) ÔåëåóôÝò > êáé >= 0 > 1 = 2 * όχι = 2 (T_gt) 0 > 1 = 3 (T_ge) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 28 / 216
ÊáôáóêåõÞ ôïõ ËÁ (i) ÊáôáãñáöÞ êáé ôáîéíüìçóç áñáêôþñùí mapping : (ASCII { EOF }) Σ ÊáôáãñáöÞ êáé ôáîéíüìçóç ëåêôéêþí ìïíüäùí Êùäéêïðïßçóç ëåêôéêþí ìïíüäùí Áêïëïõèßá áñáêôþñùí (lexeme) Ó åäßáóç ôïõ äéáãñüììáôïò ìåôüâáóçò Õëïðïßçóç ôïõ ëåêôéêïý áíáëõôþ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 29 / 216
ÊáôáóêåõÞ ôïõ ËÁ (ii) ÅðéìÝñïõò èýìáôá Ôñüðïò äéá ùñéóìïý ëåêôéêþí ìïíüäùí Ó üëéá ÄéÜêñéóç ðåæþí / êåöáëáßùí ãñáììüôùí ÅíäéÜìåóç ìíþìç (buer) ÁíÜíçøç áðü óöüëìáôá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 30 / 216
ÊáôáóêåõÞ ôïõ ËÁ (iii) W 0. ; ( ) = + - EOF * 20 21 22 23 26 30 31 45 (T_dot) (T_smcolon) (T_lparen) (T_rparen) (T_eq) (T_plus) (T_minus) (T_eof) : < > / * Ó åäßáóç óõíïëéêïý äéáãñüììáôïò ìåôüâáóçò = 24 (T_assign) L E 1 6 40 όχι = * (T_colon) = όχι = = όχι = = όχι = * όχι * 25 (T_le) όχι L E D _ 2 3 4 5 45 41 (T_lt) * * 27 (T_ge) 42 (T_gt) * 28 (T_ne) 43 (T_div) * 29 (T_power) 44 (T_times) * L E D _ (T_id) όχι D. Ε όχι D Ε D * D 7. 8 E + - 9 10 D 11 όχι D 46 D Ε D D (T_const) { 12 } 0 όχι } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 31 / 216
ÊáôáóêåõÞ ôïõ ËÁ (iv) Åíáëëáêôéêïß ôñüðïé õëïðïßçóçò: åéñùíáêôéêü Ìå ðßíáêá ìåôáâüóåùí Ìå ôï ìåôáåñãáëåßï ex Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 32 / 216
Õëïðïßçóç ËÁ ìå ôï ex (i) Ìåôáåñãáëåßï ex: ãåííþôïñáò ËÁ Åßóïäïò: ìåôáðñüãñáììá ðïõ ðåñéãñüöåé ôéò ëåêôéêýò ìïíüäåò îïäïò: ðñüãñáììá óå C Ç óõíüñôçóç yylex õëïðïéåß ôï ËÁ ÅðéóôñÝöåé ôïí êùäéêü ôçò ëåêôéêþò ìïíüäáò ðïõ áíáãíùñßóôçêå, Þ 0 óôï ôýëïò ôçò óõìâïëïóåéñüò åéóüäïõ Ôïðïèåôåß óôç ìåôáâëçôþ yytext ôçí áíôßóôïé ç áêïëïõèßá áñáêôþñùí (lexeme) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 33 / 216
Õëïðïßçóç ËÁ ìå ôï ex (ii) ÄïìÞ ôïõ ìåôáðñïãñüììáôïò ÌÝñïò Á %% ÌÝñïò Â %% ÌÝñïò Ã Êáé ôá ôñßá ìýñç ìðïñïýí íá åßíáé êåíü Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 34 / 216
Õëïðïßçóç ËÁ ìå ôï ex (iii) ÌÝñïò Á, ðåñéý åé Ó üëéá, üðùò óôç C Êþäéêá C, ìýóá óå %{ êáé %} ÌíçìïíéêÜ ïíüìáôá ùò óõíôïìïãñáößåò êáíïíéêþí åêöñüóåùí Äçëþóåéò áñ éêþí êáôáóôüóåùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 35 / 216
Õëïðïßçóç ËÁ ìå ôï ex (iv) ÌÝñïò Á, ðáñüäåéãìá %{ #define T_eof 0 #define T_id 1... #define T_while 52 void ERROR (const char msg []); %} L [A-Za-z] /* letters */ D [0-9] /* digits */ W [ \t\n] /* white space */ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 36 / 216
Õëïðïßçóç ËÁ ìå ôï ex (v) ÌÝñïò Â, ðåñéý åé êáíüíåò ôçò ìïñöþò êáíïíéêþ Ýêöñáóç åíýñãåéá ÊÜèå åíýñãåéá åßíáé ìéá åíôïëþ ôçò C Ëåéôïõñãßá: ÄéáâÜæåôáé ôï ìáêñýôåñï ðñüèåìá ôçò óõìâïëïóåéñüò åéóüäïõ ðïõ ìðïñåß íá áíáãíùñéóôåß áðü êüðïéá êáíïíéêþ Ýêöñáóç Åêôåëåßôáé ç áíôßóôïé ç åíýñãåéá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 37 / 216
Õëïðïßçóç ËÁ ìå ôï ex (vi) ÊáíïíéêÝò åêöñüóåéò a Ï áñáêôþñáò a.. ÏðïéïóäÞðïôå áñáêôþñáò åêôüò ôçò áëëáãþò ãñáììþò. \x Áí x Ýíá áðü ôá a, b, f, n, r, t, v Þ 0, ôüôå üðùò óôç C, áëëéþò ï ßäéïò ï áñáêôþñáò x. \123 Ï áñáêôþñáò ASCII ìå ïêôáäéêþ ôéìþ 123. \x3f Ï áñáêôþñáò ASCII ìå äåêáåîáäéêþ ôéìþ 3F. "abc" Ç óõìâïëïóåéñü abc. [abc] íáò áðü ôïõò áñáêôþñåò a, b Þ c. [a-z] íáò áðü ôïõò áñáêôþñåò a Ýùò z. [ac-fs] íáò áðü ôïõò áñáêôþñåò a, c Ýùò f, Þ s. [^a-z] íáò áðü ôïõò áñáêôþñåò åêôüò üóùí áíþêïõí óôçí ðåñéï Þ a Ýùò z. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 38 / 216
Õëïðïßçóç ËÁ ìå ôï ex (vii) ÊáíïíéêÝò åêöñüóåéò {name} (óõíý åéá) Ç êáíïíéêþ Ýêöñáóç ìå ìíçìïíéêü üíïìá name. rs Ç ðáñüèåóç ôùí r êáé s. r s Ç äéüæåõîç ôùí r êáé s. (r) Ç êáíïíéêþ Ýêöñáóç r. Ïé ðáñåíèýóåéò ñçóéìïðïéïýíôáé ãéá ïìáäïðïßçóç. r* Ç r åðáíáëáìâüíåôáé ìçäýí Þ ðåñéóóüôåñåò öïñýò. r+ Ç r åðáíáëáìâüíåôáé ìéá Þ ðåñéóóüôåñåò öïñýò. r? Ç r åßíáé ðñïáéñåôéêþ (åðáíáëáìâüíåôáé ìçäýí Þ ìéá öïñü). r{7} Ç r åðáíáëáìâüíåôáé áêñéâþò 7 öïñýò. r{3,5} Ç r åðáíáëáìâüíåôáé áðü 3 Ýùò 5 öïñýò. r{4,} Ç r åðáíáëáìâüíåôáé 4 Þ ðåñéóóüôåñåò öïñýò. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 39 / 216
Õëïðïßçóç ËÁ ìå ôï ex (viii) ÊáíïíéêÝò åêöñüóåéò (óõíý åéá) ^r Ç r áëëü ìüíï óôçí áñ Þ ìéáò ãñáììþò. r$ Ç r áëëü ìüíï óôï ôýëïò ìéáò ãñáììþò. <<EOF>> Ôï ôýëïò ôïõ áñ åßïõ åéóüäïõ. r/s Ç êáíïíéêþ Ýêöñáóç r áëëü ìüíï áí áêïëïõèåß ç êáíïíéêþ Ýêöñáóç s. <S>r Ç r áëëü ìüíï üôáí ç ôñý ïõóá áñ éêþ êáôüóôáóç åßíáé ç S. <S 1,S 2,S 3 >r Ç r, áëëü ìüíï üôáí ç ôñý ïõóá áñ éêþ êáôüóôáóç åßíáé ìéá áðü ôéò S 1, S 2 Þ S 3. <*>r Ç r óå ïðïéáäþðïôå áñ éêþ êáôüóôáóç. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 40 / 216
Õëïðïßçóç ËÁ ìå ôï ex (ix) ÌÝñïò Â, ðáñüäåéãìá "and" { return T_and; }... "while" { return T_while; } ":=" { return T_assign; } ":" { return T_colon; } {L}({L} {D} _)* { return T_id; } {D}+(\.{D}*(e\-?{D}+)?)? { return T_const; } {W}+ { /* nothing */ } "(*"([^*]+ \*+[^*)])*\*+")" { /* nothing */ }. { ERROR("illegal token"); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 41 / 216
Õëïðïßçóç ËÁ ìå ôï ex (x) ÌÝñïò Ã, ðåñéý åé êþäéêá C ÐáñÜäåéãìá void ERROR (const char msg []) { fprintf(stderr, "ERROR: %s\n", msg); exit(1); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 42 / 216
Õëïðïßçóç ËÁ ìå ôï ex (xi) ÐáñÜäåéãìá int main () { int token; (óõíý åéá) do { token = yylex(); printf("token=%d, lexeme=\"%s\"\n", token, yytext); } while (token!= T_eof); } return 0; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 43 / 216
Õëïðïßçóç ËÁ ìå ôï ex (xii) ÐáñÜäåéãìá: Áñßèìçóç ãñáììþí int lineno = 1; [ \t]+ { /* nothing */ } \n { lineno++; } void ERROR (const char msg []) { fprintf(stderr, "ERROR, line %d: %s\n", lineno, msg); exit(1); } Ðñüâëçìá: ËÜèïò áñßèìçóç óå ó üëéá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 44 / 216
Õëïðïßçóç ËÁ ìå ôï ex (xiii) Áñ éêýò êáôáóôüóåéò ÊïéíÝò: %s ÁðïêëåéóôéêÝò: %x Åíåñãïß êáíüíåò óå êüðïéá êáôüóôáóç ÌåôÜâáóç ìåôáîý êáôáóôüóåùí: BEGIN(s) Áñ éêþ êáôüóôáóç êáôü ôçí Ýíáñîç ëåéôïõñãßáò ôïõ ËÁ: INITIAL Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 45 / 216
Õëïðïßçóç ËÁ ìå ôï ex (xiv) ÐáñÜäåéãìá: Áñßèìçóç ãñáììþí (äéüñèùóç) %x COMMENT "(*" { BEGIN(COMMENT); } <COMMENT>"*)" { BEGIN(INITIAL); } <COMMENT>\n { lineno++; } <COMMENT>"*" { /* nothing */ } <COMMENT>[^*\n]+ { /* nothing */ } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 46 / 216
ÊåöÜëáéï 2: ÔõðéêÝò ãëþóóåò (ìýñïò 2ï) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 47 / 216
Ãëþóóåò ùñßò óõìöñáæüìåíá (i) ÃñáììáôéêÝò ùñßò óõìöñáæüìåíá: A α Óå êüèå ðáñáãùãþ Ýíá ìç ôåñìáôéêü óýìâïëï áíôéêáèßóôáôáé, âüóåé åíüò êáíüíá ÐïëëÝò äéáöïñåôéêýò ðáñáãùãýò äéáöýñïõí ìüíï óôç óåéñü ôùí áíôéêáôáóôüóåùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 48 / 216
Ãëþóóåò ùñßò óõìöñáæüìåíá (i) ÃñáììáôéêÝò ùñßò óõìöñáæüìåíá: A α Óå êüèå ðáñáãùãþ Ýíá ìç ôåñìáôéêü óýìâïëï áíôéêáèßóôáôáé, âüóåé åíüò êáíüíá ÐïëëÝò äéáöïñåôéêýò ðáñáãùãýò äéáöýñïõí ìüíï óôç óåéñü ôùí áíôéêáôáóôüóåùí Áñéóôåñüôåñç / äåîéüôåñç ðáñáãùãþ (leftmost / rightmost derivation) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 48 / 216
Ãëþóóåò ùñßò óõìöñáæüìåíá (i) ÃñáììáôéêÝò ùñßò óõìöñáæüìåíá: A α Óå êüèå ðáñáãùãþ Ýíá ìç ôåñìáôéêü óýìâïëï áíôéêáèßóôáôáé, âüóåé åíüò êáíüíá ÐïëëÝò äéáöïñåôéêýò ðáñáãùãýò äéáöýñïõí ìüíï óôç óåéñü ôùí áíôéêáôáóôüóåùí Áñéóôåñüôåñç / äåîéüôåñç ðáñáãùãþ (leftmost / rightmost derivation) ÓõíôáêôéêÜ äýíôñá (parse trees) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 48 / 216
Ãëþóóåò ùñßò óõìöñáæüìåíá (ii) S aabc ɛ A csb Ab B bb a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 49 / 216
Ãëþóóåò ùñßò óõìöñáæüìåíá (ii) Ìßá ðáñáãùãþ S aa B c a A bbc acs B bbc ac S abbc acab B c acabac S aabc ɛ A csb Ab B bb a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 49 / 216
Ãëþóóåò ùñßò óõìöñáæüìåíá (ii) Ìßá ðáñáãùãþ S aa B c a A bbc acs B bbc ac S abbc acab B c acabac Áñéóôåñüôåñç ðáñáãùãþ S L a A BC L a A bbc L ac S BbBc L ac B bbc L acab B c L acabac S aabc ɛ A csb Ab B bb a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 49 / 216
Ãëþóóåò ùñßò óõìöñáæüìåíá (ii) Ìßá ðáñáãùãþ S aa B c a A bbc acs B bbc ac S abbc acab B c acabac Áñéóôåñüôåñç ðáñáãùãþ S L a A BC L a A bbc L ac S BbBc L ac B bbc L acab B c L acabac Äåîéüôåñç ðáñáãùãþ S R aa B c R a A ac R a A bac R acs B bac R ac S abac R acabac S aabc ɛ A csb Ab B bb a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 49 / 216
Ãëþóóåò ùñßò óõìöñáæüìåíá (ii) Ìßá ðáñáãùãþ S aa B c a A bbc acs B bbc ac S abbc acab B c acabac Áñéóôåñüôåñç ðáñáãùãþ S L a A BC L a A bbc L ac S BbBc L ac B bbc L acab B c L acabac Äåîéüôåñç ðáñáãùãþ S R aa B c R a A ac R a A bac R acs B bac R ac S abac R acabac S a A B c c S A S aabc ɛ A csb Ab B bb a B b a ε a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 49 / 216
Äéöïñïýìåíåò ãñáììáôéêýò (i) Äýï ãñáììáôéêýò åßíáé éóïäýíáìåò üôáí ðáñüãïõí ôçí ßäéá ãëþóóá. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 50 / 216
Äéöïñïýìåíåò ãñáììáôéêýò (i) Äýï ãñáììáôéêýò åßíáé éóïäýíáìåò üôáí ðáñüãïõí ôçí ßäéá ãëþóóá. Ìéá ãñáììáôéêþ åßíáé äéöïñïýìåíç (ambiguous) áí õðüñ ïõí äýï Þ ðåñéóóüôåñá óõíôáêôéêü äýíôñá ãéá ôçí ßäéá ðáñáãüìåíç óõìâïëïóåéñü Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 50 / 216
Äéöïñïýìåíåò ãñáììáôéêýò (i) Äýï ãñáììáôéêýò åßíáé éóïäýíáìåò üôáí ðáñüãïõí ôçí ßäéá ãëþóóá. Ìéá ãñáììáôéêþ åßíáé äéöïñïýìåíç (ambiguous) áí õðüñ ïõí äýï Þ ðåñéóóüôåñá óõíôáêôéêü äýíôñá ãéá ôçí ßäéá ðáñáãüìåíç óõìâïëïóåéñü ÃñáììáôéêÝò êáé ãëþóóåò åããåíþò äéöïñïýìåíåò (inherently ambiguous) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 50 / 216
Äéöïñïýìåíåò ãñáììáôéêýò (i) Äýï ãñáììáôéêýò åßíáé éóïäýíáìåò üôáí ðáñüãïõí ôçí ßäéá ãëþóóá. Ìéá ãñáììáôéêþ åßíáé äéöïñïýìåíç (ambiguous) áí õðüñ ïõí äýï Þ ðåñéóóüôåñá óõíôáêôéêü äýíôñá ãéá ôçí ßäéá ðáñáãüìåíç óõìâïëïóåéñü ÃñáììáôéêÝò êáé ãëþóóåò åããåíþò äéöïñïýìåíåò (inherently ambiguous) ñþóç äéöïñïýìåíùí ãñáììáôéêþí óôçí ðåñéãñáöþ ôçò óýíôáîçò ãëùóóþí ðñïãñáììáôéóìïý Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 50 / 216
Äéöïñïýìåíåò ãñáììáôéêýò ÐáñÜäåéãìá: îåêñýìáóôï if (dangling if) (ii) stmt if cond stmt else stmt if cond stmt s1 s2 cond c1 c2 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 51 / 216
Äéöïñïýìåíåò ãñáììáôéêýò ÐáñÜäåéãìá: îåêñýìáóôï if (dangling if) (ii) stmt if cond stmt else stmt if cond stmt s1 s2 cond c1 c2 Äéöïñïýìåíï: óå ðïéï if áíôéóôïé åß ôï else; if c1 if c2 s1 else s2 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 51 / 216
Äéöïñïýìåíåò ãñáììáôéêýò ÐáñÜäåéãìá: îåêñýìáóôï if (dangling if) (ii) stmt if cond stmt else stmt if cond stmt s1 s2 cond c1 c2 Äéöïñïýìåíï: óå ðïéï if áíôéóôïé åß ôï else; if c1 if c2 s1 else s2 stmt if cond stmt c1 if cond stmt else stmt c2 s1 s2 if c1 ( if c2 s1 else s2 ) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 51 / 216
Äéöïñïýìåíåò ãñáììáôéêýò ÐáñÜäåéãìá: îåêñýìáóôï if (dangling if) (ii) stmt if cond stmt else stmt if cond stmt s1 s2 cond c1 c2 Äéöïñïýìåíï: óå ðïéï if áíôéóôïé åß ôï else; if c1 if c2 s1 else s2 stmt stmt if cond stmt if cond stmt else stmt c1 if cond stmt else stmt c1 if cond stmt s2 c2 s1 s2 c2 s1 if c1 ( if c2 s1 else s2 ) if c1 ( if c2 s1 ) else s2 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 51 / 216
Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (i) Backus-Naur Form (BNF) Óýìâïëï ::= óôïõò êáíüíåò Ìç ôåñìáôéêü óýìâïëá óå ãùíéáêýò ðáñåíèýóåéò, ð.. expr Óýìâïëï ãéá äéüæåõîç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 52 / 216
Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (i) Backus-Naur Form (BNF) Óýìâïëï ::= óôïõò êáíüíåò Ìç ôåñìáôéêü óýìâïëá óå ãùíéáêýò ðáñåíèýóåéò, ð.. expr Óýìâïëï ãéá äéüæåõîç unsigned-number ::= integer-part dec-fraction exp-part integer-part dec-fraction exp-part sign ::= digit integer-part digit ::=. integer-part ɛ ::= E sign integer-part e sign integer-part ɛ ::= + ɛ digit ::= 0 1 2 3 4 5 6 7 8 9 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 52 / 216
Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (ii) Extended Backus-Naur Form (EBNF) ÔåñìáôéêÜ óýìâïëá óå åéóáãùãéêü ÐáñåíèÝóåéò ãéá ïìáäïðïßçóç Áãêýëåò ãéá ðñïáéñåôéêü ôìþìáôá Óýìâïëá êáé + ãéá åðáíüëçøç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 53 / 216
Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (ii) Extended Backus-Naur Form (EBNF) ÔåñìáôéêÜ óýìâïëá óå åéóáãùãéêü ÐáñåíèÝóåéò ãéá ïìáäïðïßçóç Áãêýëåò ãéá ðñïáéñåôéêü ôìþìáôá Óýìâïëá êáé + ãéá åðáíüëçøç unsigned-number ::= digit + [ \." digit + ] [ (\E" \e") [ \+" \ " ] digit + ] digit ::= \0" \1" \2" \3" \4" \5" \6" \7" \8" \9" Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 53 / 216
Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (iii) ÓõíôáêôéêÜ äéáãñüììáôá ÔåñìáôéêÜ óýìâïëá óå ïâüë Ìç ôåñìáôéêü óýìâïëá óå ïñèïãþíéá Äéáäï Þ óõìâüëùí (ðáñüèåóç) ìå âýëç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 54 / 216
Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (iii) ÓõíôáêôéêÜ äéáãñüììáôá ÔåñìáôéêÜ óýìâïëá óå ïâüë Ìç ôåñìáôéêü óýìâïëá óå ïñèïãþíéá Äéáäï Þ óõìâüëùí (ðáñüèåóç) ìå âýëç unsigned-number E + digit. digit digit e Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 54 / 216
ÊåöÜëáéï 4: ÓõíôáêôéêÞ áíüëõóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 55 / 216
ÓõíôáêôéêÞ áíüëõóç Óõíôáêôéêü äýíôñï (parse tree) ÊáôáóêåõÜæåôáé ìå äýï ôñüðïõò: ÊáèïäéêÜ Áðü ðüíù ðñïò ôá êüôù (top-down) äçëáäþ îåêéíþíôáò áðü ôç ñßæá êáé ðñï ùñþíôáò ðñïò ôá öýëëá ÁíïäéêÜ Áðü êüôù ðñïò ôá ðüíù (bottom-up) äçëáäþ îåêéíþíôáò áðü ôá öýëëá êáé ðñï ùñþíôáò ðñïò ôç ñßæá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 56 / 216
Top-down êáé bottom-up από πάνω προς τα κάτω (top-down) 1 S 2 3 11 a A B c 13 4 A b 10 12 a 5 6 c S 8 B 7 ε 9 a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 57 / 216
Top-down êáé bottom-up από πάνω προς τα κάτω (top-down) 1 S από κάτω προς τα πάνω (bottom-up) 12 S 2 3 11 a A B c 13 10 a A B c 1 8 11 4 A b 10 12 a 6 A b 7 9 a 5 6 c S 8 B 2 c 5 S B 4 7 ε 9 a ε a 3 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 57 / 216
ÂïçèçôéêÝò Ýííïéåò (i) Óýíïëá FIRST óôù óõìâïëïóåéñü α (T N) Ôï óýíïëï FIRST(α) T { ɛ } ðåñéý åé ôá ôåñìáôéêü óýìâïëá áðü ôá ïðïßá áñ ßæïõí ïé óõìâïëïóåéñýò ðïõ ðáñüãïíôáé áðü ôçí α Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 58 / 216
ÂïçèçôéêÝò Ýííïéåò (i) Óýíïëá FIRST óôù óõìâïëïóåéñü α (T N) Ôï óýíïëï FIRST(α) T { ɛ } ðåñéý åé ôá ôåñìáôéêü óýìâïëá áðü ôá ïðïßá áñ ßæïõí ïé óõìâïëïóåéñýò ðïõ ðáñüãïíôáé áðü ôçí α Áí α aβ ôüôå a FIRST(α) Áí α ɛ ôüôå ɛ FIRST(α) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 58 / 216
ÂïçèçôéêÝò Ýííïéåò (ii) Óýíïëá FOLLOW óôù ìç ôåñìáôéêü óýìâïëï A Ôï óýíïëï FOLLOW(A) T { EOF } ðåñéý åé ôá ôåñìáôéêü óýìâïëá ðïõ ìðïñïýí íá áêïëïõèïýí ôï A óôç äéüñêåéá ìéáò ðáñáãùãþò Áí ôï A ìðïñåß íá åßíáé ôï ôåëåõôáßï óýìâïëï óå ìéá ðáñáãùãþ, ôüôå EOF FOLLOW(A) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 59 / 216
ÂïçèçôéêÝò Ýííïéåò (ii) Óýíïëá FOLLOW óôù ìç ôåñìáôéêü óýìâïëï A Ôï óýíïëï FOLLOW(A) T { EOF } ðåñéý åé ôá ôåñìáôéêü óýìâïëá ðïõ ìðïñïýí íá áêïëïõèïýí ôï A óôç äéüñêåéá ìéáò ðáñáãùãþò Áí ôï A ìðïñåß íá åßíáé ôï ôåëåõôáßï óýìâïëï óå ìéá ðáñáãùãþ, ôüôå EOF FOLLOW(A) Áí S αaaβ ôüôå a FOLLOW(A) Áí S αa ôüôå EOF FOLLOW(A) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 59 / 216
Õðïëïãéóìüò FIRST (i) FIRST(ɛ) = { ɛ } FIRST(aβ) = { a } áí ɛ FIRST(A) ôüôå FIRST(Aβ) = FIRST(A) áí ɛ FIRST(A) ôüôå FIRST(Aβ) = (FIRST(A) { ɛ }) FIRST(β) ãéá êüèå êáíüíá A α, ðñýðåé FIRST(α) FIRST(A) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 60 / 216
Õðïëïãéóìüò FIRST (ii) ÐáñÜäåéãìá FIRST(E) = { id, ( } FIRST(T) = { id, ( } FIRST(F) = { id, ( } FIRST(E ) = { +, ɛ } FIRST(T ) = { *, ɛ } E T E E ɛ E + T E T F T T ɛ T * F T F ( E ) F id Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 61 / 216
Õðïëïãéóìüò FOLLOW (i) EOF FOLLOW(S) ãéá êüèå êáíüíá A αbβ (FIRST(β) { ɛ }) FOLLOW(B) áí ɛ FIRST(β) ôüôå FOLLOW(A) FOLLOW(B) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 62 / 216
Õðïëïãéóìüò FOLLOW (ii) ÐáñÜäåéãìá FOLLOW(E) = { ), EOF } FOLLOW(T) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } FOLLOW(E ) = { ), EOF } FOLLOW(T ) = { +, ), EOF } FIRST(E ) = { +, ɛ } FIRST(T ) = { *, ɛ } E T E E ɛ E + T E T F T T ɛ T * F T F ( E ) F id Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 63 / 216
ÓÁ bottom-up (i) Ç óõíôáêôéêþ áíüëõóç îåêéíü áðü ôá öýëëá ÊÜèå öïñü, áíáæçôü: ôïí áñéóôåñüôåñï êüìâï ôïõ äýíôñïõ ðïõ äåí Ý åé áêüìá êáôáóêåõáóôåß åíþ üëá ôá ðáéäéü ôïõ Ý ïõí êáôáóêåõáóôåß ÅðáíáëáìâÜíåé ìý ñé íá êáôáóêåõáóôåß ç ñßæá ÅëÜôôùóç (reducing): ç åðéëïãþ ôùí êüìâùí ðïõ èá áðïôåëýóïõí ôá ðáéäéü åíüò íýïõ êüìâïõ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 64 / 216
ÓÁ bottom-up (ii) B B D D D D r a. b r a. b r a. b S r B B D B, D D a b B B S B B D D D D r a. b r a. b Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 65 / 216
ÓÁ bottom-up (iii) ÓÁ ïëßóèçóçò-åëüôôùóçò (shift-reduce) ñçóéìïðïéïýí ìéá (áñ éêü êåíþ) óôïßâá üðïõ ôïðïèåôïýí óýìâïëá ôçò ãñáììáôéêþò Ïëßóèçóç (shift): ìåôáöïñü åíüò óõìâüëïõ áðü ôçí åßóïäï óôçí êïñõöþ ôçò óôïßâáò ÅëÜôôùóç (reduce): áöáßñåóç áðü ôçí êïñõöþ ôçò óôïßâáò ôïõ äåîéïý ìýëïõò åíüò êáíüíá êáé ðñüóèåóç ôïõ áñéóôåñïý ìýëïõò Åðéôõ ßá: ç óôïßâá ðåñéý åé ìüíï ôï S êáé ôá óýìâïëá ôçò åéóüäïõ Ý ïõí åîáíôëçèåß Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 66 / 216
ÓÁ bottom-up (iv) âþìá óôïßâá åßóïäïò êßíçóç 0 ɛ r a, b ïëßóèçóç 1 r a, b ïëßóèçóç 2 r a, b åëüôôùóç ìå D a 3 r D, b åëüôôùóç ìå B D 4 r B, b ïëßóèçóç (ü é åëüôôùóç ìå S r B) 5 r B, b ïëßóèçóç 6 r B, b ɛ åëüôôùóç ìå D b 7 r B, D ɛ åëüôôùóç ìå B B, D (ü é åëüôôùóç ìå B D) 8 r B ɛ åëüôôùóç ìå S r B 9 S ɛ áíáãíþñéóç S r B B D B, D D a b Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 67 / 216
ÓÁ bottom-up (v) συµβολοσειρά εισόδου a 1 a 2... a n EOF LR(k) επόµενο σύµβολο LR(0) SLR(1) LALR(1) LR(1) s m x m... κορυφή Πίνακες ελέγχου συντακτικής ανάλυσης LR(1) s 1 ACTION NEXT x 1 Συντακτικός Αναλυτής LR(1) s 0 στοίβα Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 68 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (i) Ìåôáåñãáëåßï bison: ãåííþôïñáò ÓÁ LALR(1) Åßóïäïò: ìåôáðñüãñáììá ðïõ ðåñéãñüöåé ôç óýíôáîç êáé ôéò óçìáóéïëïãéêýò ñïõôßíåò îïäïò: ðñüãñáììá óå C Ç óõíüñôçóç yyparse õëïðïéåß ôï ÓÁ ÅðéóôñÝöåé 0 áí áíáãíùñéóôåß ç óõìâïëïóåéñü åéóüäïõ Þ 1 óå ðåñßðôùóç óõíôáêôéêïý óöüëìáôïò ÓõíåñãÜæåôáé ìå ôï ëåêôéêü áíáëõôþ (óõíüñôçóç yylex) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 69 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (ii) ÄïìÞ ôïõ ìåôáðñïãñüììáôïò ÌÝñïò Á %% ÌÝñïò Â %% ÌÝñïò Ã Êáé ôá ôñßá ìýñç ìðïñïýí íá åßíáé êåíü Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 70 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (iii) ÌÝñïò Á, ðåñéý åé Ó üëéá, üðùò óôç C Êþäéêá C, ìýóá óå %{ êáé %} Äçëþóåéò ëåêôéêþí ìïíüäùí Äçëþóåéò ôåëåóôþí ôçò áñ éêþò ãëþóóáò (ðñïôåñáéüôçôá, ðñïóåôáéñéóôéêüôçôá) ÄÞëùóç ôïõ óõíüëïõ óçìáóéïëïãéêþí ôéìþí (ôýðïò YYSTYPE Þ ìå ñþóç ôïõ %union) ÄÞëùóç ôïõ ôýðïõ ôçò óçìáóéïëïãéêþò ôéìþò êüèå óõìâüëïõ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 71 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (iv) ÌÝñïò Á, ðáñüäåéãìá %{ void ERROR (const char msg []); %} %token T_program "program" %token T_div T_mod %token T_if T_then T_else %nonassoc '=' '<' '>' %left '+' '-' %left '*' '/' T_div T_mod Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 72 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (v) ÌÝñïò Á, ðáñüäåéãìá (óõíý åéá) %union{ int i; double f; char str[80]; } %token<str> T_id %token<i> T_int_const %token<f> T_float_const %type<f> expression Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 73 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (vi) ÌÝñïò Â, ðåñéý åé: ôïõò êáíüíåò ðáñáãùãþò óå ìïñöþ BNF óçìáóéïëïãéêýò ñïõôßíåò ðïõ åêôåëïýíôáé êáôü ôç óõíôáêôéêþ áíüëõóç Ïé êáíüíåò Ý ïõí ôç ìïñöþ: A : x 1 1 x 1 2... x 1 m 1 x 2 1 x 2 2...... x 2 m 2 x n 1 x n 2... x n m n ; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 74 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (vii) ÌÝñïò Â, ðáñüäåéãìá program : { count=0; } block_list { printf("counted %d block(s)\n", count); } ; block_list : /* nothing */ block_list block { count++; } ; block : "begin" block_list "end" ; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 75 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (viii) ÌÝñïò Ã, ðåñéý åé êþäéêá C Ôï ìåôáðñüãñáììá ôïõ bison áíáëáìâüíåé ôïí êåíôñéêü Ýëåã ï ôïõ ìåôáãëùôôéóôþ ðïõ åðéôõã Üíåôáé ìå ôç óõíåñãáóßá ôùí ðáñáêüôù: ôïõ ëåêôéêïý áíáëõôþ ôïõ óõíôáêôéêïý áíáëõôþ ôïõ ðßíáêá óõìâüëùí ôïõ óçìáóéïëïãéêïý áíáëõôþ ôïõ ãåííþôïñá åíäéüìåóïõ êþäéêá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 76 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (ix) ÌÝñïò Ã, ðáñüäåéãìá void yyerror (const char * msg) { fprintf(stderr, "syntax error in line %d: %s\n", linecount, msg); exit(1); } int main () { return yyparse(); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 77 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (x) ÐáñÜäåéãìá ìå óçìáóéïëïãéêýò ôéìýò E T E E + T T F T T * F F ( E ) F num Æçôïýìåíï: íá êáôáóêåõáóôåß ÓÁ ðïõ íá õðïëïãßæåé ôçí ôéìþ ìéáò áñéèìçôéêþò Ýêöñáóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 78 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (xi) ÐáñÜäåéãìá (óõíý åéá) %{ typedef int YYSTYPE; %} %token T_num %% program : expression { printf("value: %d\n", $1); } ; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 79 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (xii) ÐáñÜäåéãìá (óõíý åéá) expression : term { $$ = $1; } expression '+' term { $$ = $1 + $3; } ; term : factor { $$ = $1; } term '*' factor { $$ = $1 * $3; } ; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 80 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (xiii) ÐáñÜäåéãìá (óõíý åéá) factor : '(' expression ')' { $$ = $2; } T_num { $$ = $1; } ; %% Ðáñáëåßðïíôáé óôï ÌÝñïò Ã: ç óõíüñôçóç yylex (ðéèáíþò óå îå ùñéóôü áñ åßï, áí ñçóéìïðïéçèåß ôï ex) ïé óõíáñôþóåéò yyerror êáé main Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 81 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (xiv) ÐáñÜäåéãìá Õëïðïßçóç ËÁ åéñùíáêôéêü int yylex () { int c; while (isspace(c = fgetc(stdin))); if (isdigit(c)) { yylval = c - '0'; while (isdigit(c = fgetc(stdin))) yylval = yylval * 10 + c - '0'; ungetc(c, stdin); return T_num; } Óôï ìýñïò à Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 82 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (xv) ÐáñÜäåéãìá } (óõíý åéá) if (strchr("+*()", c)) return c; if (c!= EOF) fprintf(stderr, "Illegal character: %c\n", c); return 0; Áõôïìáôïðïßçóç ôçò ìåôáãëþôôéóçò ôïõ ÓÁ mytest1: mytest1.y bison mytest1.y gcc -o mytest1 mytest1.tab.c Makele Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 83 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (xvi) ÐáñÜäåéãìá Õëïðïßçóç ËÁ ìå ôï ex %{ #include "mytest2.tab.h" %} %% [0-9]+ { yylval = atoi(yytext); return T_num; } \( \) \+ \* { return yytext[0]; } [ \t\n]+ { /* nothing */ }. { yyerror("illegal character"); } %% mytest2.l Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 84 / 216
Õëïðïßçóç ÓÁ ìå ôï bison (xvii) Áõôïìáôïðïßçóç ôçò ìåôáãëþôôéóçò ËÁ êáé ÓÁ mytest2: mytest2.l mytest2.y bison -d mytest2.y flex -s mytest2.l gcc -o mytest2 mytest2.tab.c lex.yy.c \ -lfl Åðßëõóç óõãêñïýóåùí óôï bison shift-reduce: ðüíôá shift reduce-reduce: ï ðñþôïò êáíüíáò Makele Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 85 / 216
ÓÁ top-down (i) Ç óõíôáêôéêþ áíüëõóç îåêéíü áðü ôç ñßæá ÊÜèå öïñü, áíáæçôü: ôï ìç ôåñìáôéêü óýìâïëï ðïõ èá áíôéêáôáóôáèåß óõíþèùò åðéëýãåôáé ôï áñéóôåñüôåñï ôïí êáíüíá ðáñáãùãþò ðïõ èá åöáñìïóôåß âüóåé ôùí åðüìåíùí k ëåêôéêþí ìïíüäùí óôç óõìâïëïóåéñü åéóüäïõ: LL(k) ÅðáíáëáìâÜíåôáé ìý ñé íá åîáíôëçèïýí ôá ìç ôåñìáôéêü Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 86 / 216
ÃñáììáôéêÝò LL(1) Áðáñáßôçôåò ðñïûðïèýóåéò: Áðïõóßá áñéóôåñþò áíáäñïìþò (Üìåóçò Þ Ýììåóçò) Áðïõóßá êïéíïý ðñïèýìáôïò óå åíáëëáêôéêïýò êáíüíåò ÌåñéêÝò öïñýò åßíáé äõíáôüò ï ìåôáó çìáôéóìüò ìéáò ãñáììáôéêþò óå éóïäýíáìç LL(1) áðáëïéöþ áñéóôåñþò áíáäñïìþò áñéóôåñþ ðáñáãïíôïðïßçóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 87 / 216
Ìåôáó çìáôéóìüò óå LL(1) ÁíôéêáôÜóôáóç A α 1... α n B β 1 Aβ 2 A α 1... α n B β 1 α 1 β 2... β 1 α n β 2 ÁñéóôåñÞ ðáñáãïíôïðïßçóç A αβ 1... αβ n A αb B β 1... β n ÁðáëïéöÞ Üìåóçò áñéóôåñþò áíáäñïìþò A Aα 1... Aα n β 1... β m A β 1 B... β m B B α 1 B... α n B ɛ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 88 / 216
ÓÁ áíáäñïìéêþò êáôüâáóçò A α 1... α n ìåôáôñýðåôáé óå êþäéêá ôçò ìïñöþò: if token FIRST(α 1 ) then êþäéêáò ãéá ôçí áíáãíþñéóç ôçò α 1... else if token FIRST(α n ) then êþäéêáò ãéá ôçí áíáãíþñéóç ôçò α n else if ɛ FIRST(α 1 )... FIRST(α n ) then óõíôáêôéêü óöüëìá else if token FOLLOW(A) then óõíôáêôéêü óöüëìá end if Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 89 / 216
ÓÁ LL(1) (i) ñçóéìïðïéïýí ìéá óôïßâá üðïõ ôïðïèåôïýí óýìâïëá ôçò ãñáììáôéêþò áñ éêü ìüíï ôï S ÊÜèå öïñü åîåôüæåôáé ç êïñõöþ ôçò óôïßâáò: Áí åßíáé ôåñìáôéêü óýìâïëï êáé åßíáé ôï ßäéï ìå ôï åðüìåíï ôçò óõìâïëïóåéñüò åéóüäïõ, ôüôå áöáéñïýíôáé êáé ôá äýï Áí åßíáé ìç ôåñìáôéêü óýìâïëï, ôüôå áíüëïãá ìå ôï åðüìåíï ôçò óõìâïëïóåéñüò åéóüäïõ åöáñìüæåôáé êüðïéïò êáíüíáò Åðéôõ ßá: ç óôïßâá êáé ç óõìâïëïóåéñü åéóüäïõ åßíáé Üäåéåò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 90 / 216
ÓÁ LL(1) (ii) συµβολοσειρά εισόδου a 1 a 2... a n EOF Ï áëãüñéèìïò êáôáóêåõþò ôïõ ðßíáêá M ïñßæåé ôçí ïéêïãýíåéá ôùí ãëùóóþí LL(1) x m... κορυφή επόµενο σύµβολο Πίνακας M συντακτικής ανάλυσης LL(1) x 2 x 1 στοίβα Συντακτικός Αναλυτής LL(1) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 91 / 216
ÊáôáóêåõÞ ÓÁ LL(1) E T E E + T E ɛ T F T T * F T ɛ F ( E ) id FIRST(E) = FIRST(T) = FIRST(F) = { id, ( } FIRST(E ) = { +, ɛ } FIRST(T ) = { *, ɛ } FOLLOW(E) = FOLLOW(E ) = { ), EOF } FOLLOW(T) = FOLLOW(T ) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } id + * ( ) EOF E E TE E TE E E +TE E ɛ E ɛ T T FT T FT T T ɛ T *FT T ɛ T ɛ F F id F (E) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 92 / 216
Ëåéôïõñãßá ÓÁ LL(1) 0 E id + id * id EOF E T E 1 E T id + id * id EOF T F T 2 E T F id + id * id EOF F id 3 E T id id + id * id EOF 4 E T + id * id EOF T ɛ 5 E + id * id EOF E + T E 6 E T + + id * id EOF 7 E T id * id EOF T F T 8 E T F id * id EOF F id 9 E T id id * id EOF 10 E T * id EOF T * F T 11 E T F * * id EOF 12 E T F id EOF F id 13 E T id id EOF 14 E T EOF T ɛ 15 E EOF E ɛ 16 ɛ EOF áíáãíþñéóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 93 / 216
ÊåöÜëáéï 2: ÔõðéêÝò ãëþóóåò (ìýñïò 3ï) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 94 / 216
ÊáôçãïñéêÝò ãñáììáôéêýò (i) ÊáôçãïñéêÞ ãñáììáôéêþ (attribute grammar): ãñáììáôéêþ ùñßò óõìöñáæüìåíá üðïõ êüèå óýìâïëï öýñåé Ýíá óýíïëï êáôçãïñçìüôùí Ïé ôéìýò ôùí êáôçãïñçìüôùí õðïëïãßæïíôáé âüóåé ôïõ óõíôáêôéêïý äýíôñïõ: ÓõíèåôéêÜ êáôçãïñþìáôá: ïé ôéìýò ôïõò åîáñôþíôáé ìüíï áðü êáôçãïñþìáôá ôùí ðáéäéþí êüèå êüìâïõ Êëçñïíïìïýìåíá êáôçãïñþìáôá: ïé ôéìýò ôïõò åîáñôþíôáé ìüíï áðü êáôçãïñþìáôá ôïõ \ðáôýñá" êáé ôùí \áäåëöþí" êüèå êüìâïõ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 95 / 216
ÊáôçãïñéêÝò ãñáììáôéêýò (ii) E E + T { E 1.val := E 2.val + T.val } E T { E.val := T.val } T T * F { T 1.val := T 2.val F.val } T F { T.val := F.val } F ( E ) { F.val := E.val } F num { F.val := num.val } Óçìáóéïëïãéêïß êáíüíåò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 96 / 216
ÊåöÜëáéï 5: Ðßíáêáò óõìâüëùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 97 / 216
Ðßíáêáò óõìâüëùí Óõãêåíôñþíåé ðëçñïöïñßåò ãéá ôá ïíüìáôá ðïõ åìöáíßæïíôáé óôï áñ éêü ðñüãñáììá Ïíüìáôá åßíáé: ôï ðñüãñáììá ïé ìåôáâëçôýò ôá õðïðñïãñüììáôá (äéáäéêáóßåò, óõíáñôþóåéò) ïé ðáñüìåôñïé ôùí õðïðñïãñáììüôùí ïé åôéêýôôåò åíôïëþí ïé óôáèåñýò ïé ôýðïé äåäïìýíùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 98 / 216
áñáêôçñéóôéêü ïíïìüôùí Êáôçãïñßá áðïèþêåõóçò (storage class) ÊáèïëéêÝò ìåôáâëçôýò (global variables) ÌåôáâëçôÝò óôïßâáò (stack variables) ÓôáôéêÝò ìåôáâëçôýò (static variables) ÅìâÝëåéá (scope) Ïñáôüôçôá (visibility) ÄéÜñêåéá æùþò (lifetime) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 99 / 216
Ðåñéå üìåíá ðßíáêá óõìâüëùí ÅìâÝëåéá (Ýììåóá) Ïñáôüôçôá (Ýììåóá) ÄéÜñêåéá æùþò Ôýðïò ÈÝóç (äéåýèõíóç ìíþìçò, êáôá ùñçôþò,...) Áñéèìüò ðáñáìýôñùí õðïðñïãñüììáôïò Ôýðïò ðáñáìýôñùí õðïðñïãñüììáôïò Ôñüðïò ðåñüóìáôïò ðáñáìýôñùí õðïðñïãñüììáôïò Ôýðïò áðïôåëýóìáôïò óõíüñôçóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 100 / 216
ÏñãÜíùóç ðßíáêá óõìâüëùí ÂáóéêÝò ëåéôïõñãßåò ÐñïóèÞêç ïíüìáôïò ÁíáæÞôçóç ïíüìáôïò ÄéáãñáöÞ ïíüìáôïò Þ ïìüäáò ïíïìüôùí Êüóôïò ðñïóèþêçò Þ áíáæþôçóçò áíüëïãá ìå ôçí õëïðïßçóç: ãñáììéêþ ëßóôá O(n) äõáäéêü äýíôñï áíáæþôçóçò O(log n) ðßíáêáò êáôáêåñìáôéóìïý O(n/k) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 101 / 216
Õëïðïßçóç ìå ÐÊ 0 1 2... k 2 k 1 b c x a aa y c b a εµβέλεια 3 εµβέλεια 2 εµβέλεια 1 3 2 1 πίνακας κατακερµατισµού στοίβα αποθήκευσης στοίβα εµβελειών Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 102 / 216
ÊåöÜëáéï 6: ÓçìáóéïëïãéêÞ áíüëõóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 103 / 216
Óýíôáîç êáé óçìáóéïëïãßá Óýíôáîç: ìïñöþ êáé äïìþ ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 104 / 216
Óýíôáîç êáé óçìáóéïëïãßá Óýíôáîç: ìïñöþ êáé äïìþ ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí Óçìáóéïëïãßá: åñìçíåßá ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 104 / 216
Óýíôáîç êáé óçìáóéïëïãßá Óýíôáîç: ìïñöþ êáé äïìþ ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí Óçìáóéïëïãßá: åñìçíåßá ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí ÓôáôéêÞ óçìáóéïëïãßá: åíôïðéóìüò óçìáóéïëïãéêþí óöáëìüôùí êáôü ôç äéüñêåéá ôçò ìåôáãëþôôéóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 104 / 216
Óýíôáîç êáé óçìáóéïëïãßá Óýíôáîç: ìïñöþ êáé äïìþ ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí Óçìáóéïëïãßá: åñìçíåßá ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí ÓôáôéêÞ óçìáóéïëïãßá: åíôïðéóìüò óçìáóéïëïãéêþí óöáëìüôùí êáôü ôç äéüñêåéá ôçò ìåôáãëþôôéóçò ÄõíáìéêÞ óçìáóéïëïãßá: áðüäïóç åñìçíåßáò óôá ðñïãñüììáôá êáôü ôçí åêôýëåóþ ôïõò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 104 / 216
ÓôáôéêÞ óçìáóéïëïãßá (i) ÐåñéâÜëëïíôá ôýðùí Γ 1 = { i integer, x real } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 105 / 216
ÓôáôéêÞ óçìáóéïëïãßá (i) ÐåñéâÜëëïíôá ôýðùí Γ 1 = { i integer, x real } Ó Ýóç áíôéóôïß éóçò ôýðùí Γ E : τ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 105 / 216
ÓôáôéêÞ óçìáóéïëïãßá (i) ÐåñéâÜëëïíôá ôýðùí Γ 1 = { i integer, x real } Ó Ýóç áíôéóôïß éóçò ôýðùí Γ E : τ Êáíüíåò ôýðùí Γ E 1 : integer Γ E 2 : integer Γ E 1 +E 2 : integer Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 105 / 216
ÓôáôéêÞ óçìáóéïëïãßá (ii) ÐáñáãùãÝò ôýðùí Γ 1 i : integer Γ 1 1 : integer Γ 1 i+1 : integer Γ 1 (i+1)*x : real Γ 1 x : real Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 106 / 216
ÓôáôéêÞ óçìáóéïëïãßá (ii) ÐáñáãùãÝò ôýðùí Γ 1 i : integer Γ 1 1 : integer Γ 1 i+1 : integer Γ 1 (i+1)*x : real Γ 1 x : real Ç áíôéóôïß éóç ôýðùí ìå êáíüíåò ôýðùí åðåêôåßíåôáé óå üëá ôá ôìþìáôá ðñïãñüììáôïò Γ E : boolean Γ S : stmt Γ while E do S : stmt Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 106 / 216
ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216
ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) áêïëïõèßá õðïëïãéóôéêþí âçìüôùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216
ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) áêïëïõèßá õðïëïãéóôéêþí âçìüôùí ÄçëùôéêÞ óçìáóéïëïãßá (denotational semantics) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216
ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) áêïëïõèßá õðïëïãéóôéêþí âçìüôùí ÄçëùôéêÞ óçìáóéïëïãßá (denotational semantics) ìáèçìáôéêþ óõíüñôçóç áðü ôï ðåäßï ôùí äåäïìýíùí åéóüäïõ óôï ðåäßï ôùí áðïôåëåóìüôùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216
ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) áêïëïõèßá õðïëïãéóôéêþí âçìüôùí ÄçëùôéêÞ óçìáóéïëïãßá (denotational semantics) ìáèçìáôéêþ óõíüñôçóç áðü ôï ðåäßï ôùí äåäïìýíùí åéóüäïõ óôï ðåäßï ôùí áðïôåëåóìüôùí ÁîéùìáôéêÞ óçìáóéïëïãßá (axiomatic semantics) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216
ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) áêïëïõèßá õðïëïãéóôéêþí âçìüôùí ÄçëùôéêÞ óçìáóéïëïãßá (denotational semantics) ìáèçìáôéêþ óõíüñôçóç áðü ôï ðåäßï ôùí äåäïìýíùí åéóüäïõ óôï ðåäßï ôùí áðïôåëåóìüôùí ÁîéùìáôéêÞ óçìáóéïëïãßá (axiomatic semantics) ç åñìçíåßá êáèïñßæåôáé Ýììåóá ìýóù ëïãéêþí ðñïôüóåùí ðïõ ðåñéãñüöïõí éäéüôçôåò ôïõ ðñïãñüììáôïò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216
ÄõíáìéêÞ óçìáóéïëïãßá (ii) Ç åíôïëþ áíüèåóçò I=E Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 108 / 216
ÄõíáìéêÞ óçìáóéïëïãßá (ii) Ç åíôïëþ áíüèåóçò I=E ËåéôïõñãéêÞ óçìáóéïëïãßá E, σ v I=E, σ σ[i v] Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 108 / 216
ÄõíáìéêÞ óçìáóéïëïãßá (ii) Ç åíôïëþ áíüèåóçò I=E ËåéôïõñãéêÞ óçìáóéïëïãßá E, σ v I=E, σ σ[i v] ÄçëùôéêÞ óçìáóéïëïãßá C[[I=E ]](s) = s[i E[[E ]](s)] Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 108 / 216
ÄõíáìéêÞ óçìáóéïëïãßá (ii) Ç åíôïëþ áíüèåóçò I=E ËåéôïõñãéêÞ óçìáóéïëïãßá E, σ v I=E, σ σ[i v] ÄçëùôéêÞ óçìáóéïëïãßá C[[I=E ]](s) = s[i E[[E ]](s)] ÁîéùìáôéêÞ óçìáóéïëïãßá { P [I E] } I=E { P } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 108 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï (C) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç (C) (Java) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí (C) (Java) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí ð.. ïé ìåôáâëçôýò ïñßæïíôáé ðñéí ôç ñþóç ôïõò (C) (Java) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí ð.. ïé ìåôáâëçôýò ïñßæïíôáé ðñéí ôç ñþóç ôïõò ëåã ïò ìïíáäéêüôçôáò (C) (Java) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí ð.. ïé ìåôáâëçôýò ïñßæïíôáé ðñéí ôç ñþóç ôïõò ëåã ïò ìïíáäéêüôçôáò ð.. ïé óôáèåñýò óå ìßá äïìþ case åßíáé ìïíáäéêýò (C) (Java) (Pascal) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí ð.. ïé ìåôáâëçôýò ïñßæïíôáé ðñéí ôç ñþóç ôïõò ëåã ïò ìïíáäéêüôçôáò ð.. ïé óôáèåñýò óå ìßá äïìþ case åßíáé ìïíáäéêýò ëåã ïò óõíýðåéáò (C) (Java) (Pascal) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí ð.. ïé ìåôáâëçôýò ïñßæïíôáé ðñéí ôç ñþóç ôïõò ëåã ïò ìïíáäéêüôçôáò ð.. ïé óôáèåñýò óå ìßá äïìþ case åßíáé ìïíáäéêýò ëåã ïò óõíýðåéáò ð.. óùóôü üíïìá õðïðñïãñüììáôïò óôï end (C) (Java) (Pascal) (Ada) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (ii) Áðïõóßá óçìáóéïëïãéêþí óöáëìüôùí áðïõóßá óöáëìüôùí åêôýëåóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 110 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (ii) Áðïõóßá óçìáóéïëïãéêþí óöáëìüôùí áðïõóßá óöáëìüôùí åêôýëåóçò ÌåñéêÝò öïñýò üìùò åßíáé äõíáôü íá ðñïâëåöèïýí óöüëìáôá åêôýëåóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 110 / 216
Óçìáóéïëïãéêüò Ýëåã ïò (ii) Áðïõóßá óçìáóéïëïãéêþí óöáëìüôùí áðïõóßá óöáëìüôùí åêôýëåóçò ÌåñéêÝò öïñýò üìùò åßíáé äõíáôü íá ðñïâëåöèïýí óöüëìáôá åêôýëåóçò program p; var x, y : integer; begin read(x); y := 5/(x-x) end. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 110 / 216
Óýóôçìá ôýðùí Âáóéêïß ôýðïé (integer, boolean, real, char,...) Óýíèåôïé ôýðïé Ðßíáêåò (arrays) Æåýãç (products) êáé ðëåéüäåò (tuples) ÅããñáöÝò (records) Äåßêôåò (pointers) ÓõíáñôÞóåéò (functions) Ôýðïé êáé ôéìýò ðñþôçò ôüîçò (rst class) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 111 / 216
ÁðëÝò åêöñüóåéò, âáóéêïß ôýðïé ÓçìáóéïëïãéêÞ áíüëõóç óôï bison Óêïðüò: õðïëïãéóìüò ôïõ ðåäßïõ type (i) %{ typedef enum { TY_int, TY_real, TY_bool } Type; %} %union{ char * n; Type t; struct { Type type; /* other fields */ } v;... } %type<n> T_id %type<t> typename %type<v> expression Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 112 / 216