÷ƒ’À;è TeX output 2003.07.07:2039‹ÿÿÿÿ Û_2 ý ~? ÕÁ ý[¡óþÖëI½q½qecss2074»Lex–fÑen“Y‘þfKA›ÿwmCC“inleiding/HO˜WTOŽ¤ ®„ØcÕÁGŽŽ¡ó 1ê± ecrm1000¹P•¸èo“w“erDNS–U BV“(bšGert“h¸èub˜ert“ó  b> cmmi10µ<¹b˜ert“at“p˜o•¸èw“erdns.comµ>¹),Ž¡vš¸èertaald–U doGor“P˜aul“BošGekholt“(p.b˜o˜ekholt“at“hetnet.nl)Ž¡v0.8–U $Date:‘q€2003/07/07“18:37:39“$Ž¡Ÿ&°óŒ6 ecss1000¼Dit–U došGcument“dient“om“je“op“w¸èeg“te“help˜en“met“het“gebš¸èruik“van“Lex“en“Y‘ÿ*¸A˜CCŽŸ(Àœó&Lt$ffffecbx1440¾Inhoudsopga•cv“eŽ©Øó]fŒ ecbx1000¿1Ž‘ÿInleiding’”ãŽ2ŽŽ¤ؼ‘ÿ¹1.1Ž‘%ý¡W‘ÿ*¸at–U dit“doGcumen¸èt“NIET“is‘Ó³‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï2ŽŽ¡‘ÿ1.2Ž‘%ý¡Spul‘U do¸èwnloaden‘ƒï‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï2ŽŽ¡‘ÿ1.3Ž‘%ý¡Licen¸ètie‘{[‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï2ŽŽ¦¿2Ž‘ÿW›ÿ ºat–ÕLex“&“Y˜Aš®>CC“v˜ošQÂor“je“kunnen“do˜en’ù4f2ŽŽ¡‘ÿ¹2.1Ž‘%ý¡W‘ÿ*¸at–U ieder“programma“op“zic¸èhzelf“doGet‘qû‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï3ŽŽ¦¿3Ž‘ÿLex’®Áð3ŽŽ¡‘ÿ¹3.1Ž‘%ý¡Reguliere–U expressies“in“matc¸èhes‘Ôs‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï4ŽŽ¡‘ÿ3.2Ž‘%ý¡Een–U ingewikkš¸èelder“v˜o•Gorb“eeld‘U v˜o“or–U een“C-ac˜h˜tige“syn˜tax_o‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï5ŽŽ¡‘ÿ3.3Ž‘%ý¡W‘ÿ*¸at–U w¸èe“geleerd“hebbGenSC‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï6ŽŽ¦¿4Ž‘ÿY‘ÿ ºA®>CC’ K»6ŽŽ¡‘ÿ¹4.1Ž‘%ý¡Een›U een•¸èv“oudige˜thermostaat˜bGeheerser‘êç‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï6ŽŽ¡‘%ý¡4.1.1Ž‘EûŸEen–U vš¸èolledig“Y‘ÿ*¸A˜CC“bGestand‘Æí‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï8ŽŽ¡‘%ý¡4.1.2Ž‘EûŸDe–U thermostaat“bGeheerser“compileren“&“draaien4É‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï8ŽŽ¡‘ÿ4.2Ž‘%ý¡De–U thermostaat“uitbreiden“om“parameters“te“v•¸èerw“erk“en‘ŸS‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï9ŽŽ¡‘ÿ4.3Ž‘%ý¡Een–U conguratiebGestand“parsen‘©Ë‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?10ŽŽ¦¿5Ž‘ÿEen–ÕPš®>arser“in“C++“mak˜en’3ùB12ŽŽ¦6Ž‘ÿHoQÂe›Õw•®>erk“en˜Lex˜en˜Y‘ÿ ºA“CC˜in“tern’Ÿ113ŽŽ¡‘ÿ¹6.1Ž‘%ý¡T‘ÿ*¸ok•¸èen“w“aarden‘˜ó‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?14ŽŽ¡‘ÿ6.2Ž‘%ý¡Recursie:‘q€`rec•¸èh“ts–U is“fout'‘šs‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?15ŽŽ¡‘ÿ6.3Ž‘%ý¡yylv‘ÿqÐal–U vš¸èoGor“gev˜orderden:‘q€%union‘* ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?15ŽŽ¦¿7Ž‘ÿDebuggen’‰>ó17ŽŽ¡‘ÿ¹7.1Ž‘%ý¡De‘U toGestandsmac¸èhine‘}“‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?17ŽŽ¡‘ÿ7.2Ž‘%ý¡Conicten:‘q€`shift/reduce',‘U `reduce/reduce'‘dS‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?18ŽŽŽŽŒ‹* Û_2 ý ~?Ÿ„€ÕÁGŽ¿1.‘ñ8Inleiding’’À"¹2ŽŽ ÕÁ ýV¯¿8Ž‘ÿV‘ÿ ºerder‘Õlezen’|19ŽŽŸØ9Ž‘ÿDank‘Õaan’‹ž19ŽŽŸ(Àœ¾1Ž‘ÁInleidingŽŸ¿:¹W‘ÿ*¸elk¸èom–U bGeste“lezer.Ž©ؼAls–•õje“enige“tijd“in“een“Unix“omgeving“hebt“geprogrammeerd,‘¦+bGen“je“v‘ÿqÐast“de“m•¸èystiek“e–•õprogramma's“Lex“&Ž¤ ®Y‘ÿ*¸Aš¸èCC,–ˆof“Flex“&“Bison,‘”Úzoals“ze“w˜ereldwijd“genoGemd“w˜orden“doGor“GNU/Lin˜ux“gebruik˜ers,‘”Útegengek˜omen,Ž¡Flex–9ezijnde“een“implemenš¸ètatie“v‘ÿqÐan“Lex“doGor“V‘ÿ*¸ern“P˜axon“en“Bison“zijnde“de“GNU‘9*v˜ersie“v‘ÿqÐan“Y‘ÿ*¸A˜CC.“W‘ÿ*¸eŽ¡zullen–Ždeze“programma's“vš¸èerder“Lex“en“Y‘ÿ*¸A˜CC‘ŽŽnoGemen“-“de“nieu˜w˜ere“v˜ersies“zijn“op˜w˜aarts“compatible,‘œýdusŽ¡je–U kunš¸èt“Flex“en“Bison“gebruik˜en“bij“het“probGeren“v‘ÿqÐan“onze“programma's.Ž¦Deze–Ðprogramma's“zijn“wš¸èaanzinnig“n˜uttig,‘I¼maar“net“als“bij“je“C‘žcompiler“legt“de“manpage“de“taal“die“zeŽ¡vš¸èerstaan–Odniet“uit,‘PŠnoGc˜h“hoGe“ze“te“gebruik˜en.‘o—Y‘ÿ*¸A˜CC‘Ocis“ec˜h˜t“fan˜tastisc˜h“w˜anneer“gebruikt“met“Lex,–PŠec˜h˜ter,“deŽ¡Bison–U manpage“bšGesc¸èhrijft“niet“ho˜e“je“do˜or“Lex“gegenereerde“co˜de“in¸ètegreert“met“je“Bison“programma.ŽŸ#Ãó¥!¢N ecbx1200Á1.1Ž‘¾W‘þàat–¸dit“do_úcumen t“NIET“isŽŸMª¹Er–Øòzijn“gewš¸èeldige“b•Go“ek˜en–Øòo˜v˜er“Lex“&“Y‘ÿ*¸A˜CC.“Lees“in“ieder“gev‘ÿqÐal“deze“b•Go“ek˜en–Øòals“je“meer“wilt“w˜eten.‘HZe“gev˜enŽ¡v¸èeel–Ebmeer“informatie“dan“wij“oGoit“kunnen.›lAZie“de“sectie“"Lees“V‘ÿ*¸erder€äan“het“eind.˜Dit“došGcumen¸èt“is“b˜edo˜eldŽ¡om–Jâje“op“wš¸èeg“te“helpGen“bij“het“gebruik“v‘ÿqÐan“Lex“&“Y‘ÿ*¸A˜CC,“om“je“in“staat“te“stellen“je“eerste“programma's“teŽ¡mak¸èen.Ž¦De–Ý…došGcumen¸ètatie“die“bij“Flex“en“Bison“ho˜ort“is“o˜ok“uitstek¸èend,‘ÿžmaar“geen“leerb˜o˜ek.‘ ®Maar“ze“v¸èormen“eenŽ¡aardige–U aanš¸èvulling“op“mijn“HO˜WTO.“Zie“de“v˜erwijzingen“aan“het“einde.Ž¦Ik–²ObGen“zekš¸èer“geen“Y‘ÿ*¸A˜CC/Lex“exp•Gert.‘‰ T‘ÿ*¸o“en–²Oik“bšGegon“dit“do˜cumenš¸èt“te“sc˜hrijv˜en,‘Éšhad“ik“precies“t˜w˜ee“dagenŽ¡erv‘ÿqÐaring.‘q€Mijn–U enige“došGel“is“die“t•¸èw“ee–U dagen“makk•¸èelijk“er‘U v“o˜or–U je“te“mak¸èen.Ž¦V›ÿ*¸erw•¸èac“h“t–niet“de“juiste“Y˜Aš¸èCC‘ŒÝen“Lex“stijl“in“deze“HO˜WTO‘ŒÝaan“te“treen.‘.ÐV‘ÿ*¸o•Gorb“eelden–zijn“uiterst“een˜v˜oudigŽ¡gehouden–U en“er“zijn“misscš¸èhien“bGetere“manieren“om“ze“te“sc˜hrijv˜en.‘q€Als“je“w˜eet“hoGe,“laat“het“me“dan“w˜eten.Ž©#ÃÁ1.2Ž‘¾Spul‘¸do wnloadenŽŸMª¹Merk–C¶op“dat“je“al“de“gegevš¸èen“v˜o•Gorb“eelden–C¶kun˜t“do˜wnloaden“in“mac˜hine-leesbare“v˜orm.‘=CZie“de“ó½HЃ ecti1000Âhomep‘ÿ}/ageŽ¡óqLË ectt1000ùv¸èoGor‘U details.Ž¦Á1.3Ž‘¾Licen tieŽŸMª¹Cop•¸èyrigh“t–϶(c)“2001“bš¸èy“Bert“HubGert.‘áCDit“materiaal“mag“alleen“v˜erspreid“w˜orden“onder“de“v˜oGor-Ž¡wš¸èaarden–Y=v‘ÿqÐan“de“OpGen“Publication“License,‘ šDvX.Y‘Wòof“later“(de“laatste“v˜ersie“is“te“vinden“opŽ¡h•¸èttp://www.opšGencon“ten“t.org/op˜enpub/).ŽŸ(Àœ¾2Ž‘ÁW›þ®(at–G\Lex“&“Y˜AšcCC“v˜ošpœor“je“kunnen“do˜enŽŸ¿:¹Bij–ÍQjuist“gebruik“mak¸èen“deze“programma's“het“mogelijk“met“gemak“complexe“talen“te“scannen.‘ÚDit“is“eenŽ¡gro•Got›»3v¸èo“ordeel˜als˜je˜een˜conguratieb“estand˜wilt˜lezen,‘Ô·of˜een˜compiler˜wilt˜sc•¸èhrijv“en˜v“oGor˜w“elk“e˜taal˜danŽ¡oGok–U die“je“(of“iemand“anders)“misscš¸èhien“hebt“uitgev˜onden.ŽŽŽŒ‹ Û_2 ý ~?Ÿ„€ÕÁGŽ¿3.‘ñ8Lex’¬ž„¹3ŽŽ ÕÁ ýV¯Met–°been“bšGeetje“h¸èulp,‘Ç3die“dit“do˜cumen¸èt“hop˜elijk“biedt,‘Ç3zul“je“no˜oit“meer“met“de“hand“een“parser“ho˜ev¸èen“teŽ¤ ®sc•¸èhrijv“en–U -“Lex“&“Y‘ÿ*¸Aš¸èCC“zijn“de“gereedsc˜happšGen“om“dit“te“do˜en.ŽŸ#ÃÁ2.1Ž‘¾W‘þàat–¸ieder“programma“op“zic hzelf“do_úetŽŸMª¹HoGewš¸èel–[deze“programma's“uitblink˜en“w˜anneer“ze“samen“gebruikt“w˜orden,‘EjhebbšGen“ze“ieder“een“eigen“do˜el.Ž¡Het–U vš¸èolgende“hoGofdstuk“legt“uit“w˜at“ieder“onderdeel“doGet.ŽŸ(Àœ¾3Ž‘ÁLexŽŸ¿:¹Het– ðprogramma“Lex“genereert“een“zogenaamde“`Lexer'.‘YpDit“is“een“functie“die“een“stroGom“k‘ÿqÐarakters“als“inputŽ¡neemš¸èt,‘ä8en–Çýsteeds“als“het“een“groGep“k‘ÿqÐarakters“ziet“die“met“een“sleutelw˜aarde“o˜v˜ereenk˜omen,‘ä8een“bGepaalde“actieŽ¡onderneemš¸èt.‘q€Een–U heel“een˜v˜oudig“v˜o•Gorb“eeld:ŽŸ´å‘óqLË ectt0900Å%{Ž¤ Š=‘#include‘¹NŽ¡‘%}Ž¡¡‘%%Ž¡‘stop‘å8printf("Stop–¹Ncommando“ontvangen\n");Ž¡‘start‘+êprintf("Start–¹Ncommando“ontvangen\n");Ž¡‘%%ŽŸؼ¹De–ϳeerste“sectie,‘êctussen“de“%ó !",š cmsy10¸f“¹en“%¸g“¹wš¸èordt“direct“o˜v˜ergenomen“in“het“gegenereerde“programma.‘EDit“is“noGdigŽ¤ ®omdat–U wš¸èe“later“prin˜tf“gebruik˜en,“w˜at“gedenieerd“is“in“stdio.h.Ž©ؼSecties–ïdwš¸èorden“gesc˜heiden“doGor“`%%',‘õdus“de“eerste“regel“v‘ÿqÐan“de“t˜w˜eede“sectie“start“met“de“`stop'“sleutel.Ž¡Iedere–àÅkš¸èeer“dat“de“`stop'“sleutel“tegengek˜omen“w˜ordt“in“de“input,‘ø w˜ordt“de“rest“v‘ÿqÐan“de“regel“(een“prin˜t()“call)Ž¡uitgev¸èoGerd.Ž¦Behalvš¸èe–U `stop'“hebbGen“w˜e“oGok“een“`start'“gedenieerd,“die“v˜erder“grotendeels“hetzelfde“doGet.Ž¦W‘ÿ*¸e–U bšGe€ëindigen“de“co˜de“w¸èeer“met“`%%'.Ž¦DošGe–U dit“om“V‘ÿ*¸o˜orb˜eeld“1“te“compileren:ŽŸ´å‘Ålex‘¹Nexample1.lŽŸ Š=‘cc–¹Nlex.yy.c“-o“example1“-llŽ©ؼ‘OPMERKING:Als–¹Nje“flex“gebruikt“ipv“lex,“moet“je“misschien“`-ll'“vervangen“door“`-lfl'“inŽ¡‘de–¹Ncompilatiescripts.‘ rœRedhat“6.x“en“SuSE“vereisen“dit,“zelfs“als“je“`flex'“aanroept“alsŽ¡‘`lex'!Ž¦¹Dit–f¦genereert“het“programma“`example1'.›¦Als“je“het“draait,‘kw•¸èac“h“t–f¦het“tot“je“iets“in¸ètikt.˜Als“je“iets“t¸èypt“datŽ¡niet›Àæo•¸èv“ereenk“om“t˜met˜een˜gedenieerde˜sleutel˜(`stop'˜en˜`start')˜w“ordt˜het˜w“eer˜geoutput.‘@Als˜je˜`stop'˜in“tiktŽ¡geeft–U het“`stop“commando“on¸ètv‘ÿqÐangen';Ž¤ؼSluit–U af“met“een“EOF“(D).Ž¡Je–v\vraagt“je“misscš¸èhien“af“hoGe“het“programma“draait,‘~ªdaar“w˜e“geen“main()“gedenieerd“hebbGen.‘Õ3Die“functieŽŸ ®is–U vš¸èoGor“je“gedenieerd“in“libl“(liblex)“die“w˜e“ingecompileerd“hebbGen“met“het“-ll“commando.ŽŽŽŒ‹,ˆ Û_2 ý ~?Ÿ„€ÕÁGŽ¿3.‘ñ8Lex’¬ž„¹4ŽŽ ÕÁ ýV¯Á3.1Ž‘¾Reguliere–¸expressies“in“matc hesŽŸMª¹Dit›²v¸èo•Gorb“eeld˜w•¸èas˜op˜zic“hzelf˜niet˜erg˜n“uttig,‘žWen˜dat˜is˜het˜v“olgende˜oGok˜niet.‘!7Het˜laat˜ec“h“ter˜w“el˜zien˜hoGeŽ© ®je–U reguliere“expressies“gebruikt“in“Lex,“w¸èat“later“supGerhandig“zal“zijn.ŽŸؼV‘ÿ*¸o•Gorb“eeld‘U 2:ŽŸ´å‘Å%{Ž¤ Š=‘#include‘¹NŽ¡‘%}Ž¡¡‘%%Ž¡‘[0123456789]+‘3öZprintf("NUMMER\n");Ž¡‘[a-zA-Z][a-zA-Z0-9]*‘å8printf("WOORD\n");Ž¡‘%%ŽŸؼ¹Dit–@TLex“bšGestand“b˜escš¸èhrijft“t˜w˜ee“soGorten“matc˜hes“(tok˜ens):‘gW˜OORDen“en“NUMMERs.‘j‘Reguliere“expressiesŽ¦kunnen›‚«b•Geho“orlijk˜in¸ètimiderend˜zijn˜maar˜met˜een˜b“eetje˜w•¸èerk˜zijn˜ze˜makk“elijk˜te˜b•Gegrijp“en.‘ú!Laten˜w¸èe˜deŽ¦NUMMER–U matcš¸èh“bGekijk˜en:Ž¤ؼ[0123456789]+Ž¡Dit›‹bGetek•¸èen“t:‘òVeen˜reeks˜v–ÿqÐan˜een˜of˜meer˜k“arakters˜uit˜de˜gro•Gep˜0123456789.‘²ÁW‘ÿ*¸e˜hadden˜het˜o“ok˜kunnenŽ¦afk¸èorten‘U tot:Ž¡[0-9]+Ž¡De–U Wš¸èOORD“matc˜h“is“iets“ingewikk˜elder:Ž¡[a-zA-Z][a-zA-Z0-9]*Ž¡Het–Ù?eerste“deel“matc•¸èh“t–Ù?1“en“slec•¸èh“ts–Ù?1“k‘ÿqÐarakter“tussen“`a'“en“`z',‘úGof“tussen“`A'‘Ùen“`Z'.“Met“andere“w¸èoGorden,Ž¦een–Ïletter.‘VDeze“bšGeginletter“mo˜et“gevš¸èolgd“w˜orden“doGor“n˜ul“of“meer“k‘ÿqÐarakters“die“ofw˜el“een“letter“of“een“cijferŽ¦zijn.›oµW‘ÿ*¸aarom–OÀhier“een“asterisk“gebruik¸èen?˜De“`+'“bGetek•¸èen“t–OÀ1“of“meer“matcš¸èhes,‘PÔmaar“een“W˜OORD‘O¿k‘ÿqÐan“heelŽ¦gošGed–îàuit“slec•¸èh“ts–îà1“k‘ÿqÐarakter“b˜estaan,‘Pdat“wš¸èe“al“gematc˜h˜t“hebbGen.‘>ÀDus“het“t˜w˜eede“deel“heeft“missc˜hien“n˜ulŽ¦matcš¸èhes,–U dus“sc˜hrijv˜en“w˜e“een“`*'.Ž¡Op–Œdeze“manier“hebbGen“wš¸èe“het“gedrag“v‘ÿqÐan“v˜eel“programmeertalen“ge€ïmiteerd“die“v˜ereisen“dat“een“v‘ÿqÐariabGele-Ž¦naam–>ƒmet“een“letter“*mošGet*“b˜eginnen“maar“daarna“cijfers“mag“b˜ev‘ÿqÐatten.‘¢Met“andere“w¸èo˜orden,‘v<`temp˜erature1'Ž¦is–U een“geldige“naam,“maar“`1tempGerature'“niet.Ž¡Prob•Geer›U v¸èo“orb“eeld˜2˜te˜compileren,˜net˜zoals˜v¸èo“orb“eeld˜1,˜en˜v¸èo“er˜w•¸èat˜tekst˜in.‘q€Een˜v“o•Gorb“eeldsessie:ŽŸ´å‘ÅŽ¤ Š=‘$‘¹N./example2Ž¡‘fooŽ¡‘WOORDŽ¡¡‘barŽ¡‘WOORDŽ¡¡‘123Ž¡‘NUMMERŽ¡¡‘bar123Ž¡‘WOORDŽ¡¡‘123barŽŽŽŒ‹72 Û_2 ý ~?Ÿ„€ÕÁGŽ¿3.‘ñ8Lex’¬ž„¹5ŽŽ ÕÁ ýV¯‘ÅNUMMERŽŸ Š=‘WOORDŽŸŽ¹Je–Jvraagt“je“misscš¸èhien“oGok“af“w˜aar“al“die“witregels“in“de“uitv˜oGer“v‘ÿqÐandaan“k˜omen.‘YãDe“reden“is“een˜v˜oudig:‘NhetŽ¤ ®wš¸èas–U in“de“in˜v˜oGer,“en“het“w˜ordt“nergens“gematc˜h˜t,“dus“w˜ordt“het“w˜eer“uitgev˜oGerd.Ž©ؼDe–óÔFlex“manpage“bšGesc¸èhrijft“de“reguliere“expressies“in“detail.‘ MœV‘ÿ*¸elen“vinden“de“p˜erl“reguliere“expressiesŽ¡manpage–U (pšGerlre)“o˜ok“n¸èuttig,“al“k‘ÿqÐan“Flex“niet“alles“dat“p˜erl“k‘ÿqÐan.Ž¦Zorg–dat“je“geen“matcš¸èhes“met“een“lengte“v‘ÿqÐan“n˜ul“zoals“`[0-9]*'“maakt“-“je“lexer“k‘ÿqÐan“in“de“w˜ar“rak˜en“en“legeŽ¡strings–U herhaaldelijk“matc¸èhen.ŽŸ"ÂVÁ3.2Ž‘¾Een–¸ingewikkš elder“v˜o•_úorb“eeld‘¸v˜o“or–¸een“C-ac˜h˜tige“syn˜taxŽŸMª¹Laten–U wš¸èe“zeggen“dat“w˜e“een“bGestand“willen“parsen“dat“er“zo“uitziet:Ž© ‘Ålogging‘¹N{Ž¤ Š=‘>Êrcategory–¹Nlame-servers“{“null;“};Ž¡‘>Êrcategory–¹Ncname“{“null;“};Ž¡‘};Ž¡¡‘zone–¹N"."“{Ž¡‘>Êrtype‘¹Nhint;Ž¡‘>Êrfile‘¹N"/etc/bind/db.root";Ž¡‘};Ž¤/ð¹W‘ÿ*¸e–U herkš¸èennen“duidelijk“een“aan˜tal“categorie€ën“(tok˜ens)“in“dit“bGestand:Ž¡‘¸ŽŽŽ‘¹Wš¸èOORDen,–U zoals“`zone'“en“`t˜ypGe'Ž¤Ù®‘¸ŽŽŽ‘¹BEST‘ÿ*¸ANDSNAAMen,–U zoals“`etc/bind/db.roGot'Ž¡‘¸ŽŽŽ‘¹QUOTEs,–U zoals“om“de“bGestandsnaamŽ¡‘¸ŽŽŽ‘¹OBRA¸èCEs,‘U ¸fŽ¡‘ŽŽŽ‘¹EBRA¸èCEs,‘U ¸gŽ¡‘ŽŽŽ‘¹PUNTKOMMAs,‘U ;ŽŸ/ðHet›U o•¸èv“ereenk“omstige˜Lex˜b•Gestand˜is˜V‘ÿ*¸o“orb“eeld˜3:Ž¦‘Å%{Ž¤ Š=‘#include‘¹NŽ¡‘%}Ž¡¡‘%%Ž¡‘[a-zA-Z][a-zA-Z0-9]*‘å8printf("WOORD‘¹N");Ž¡‘[a-zA-Z0-9\/.-]+‘%Êpprintf("BESTANDSNAAM‘¹N");Ž¡‘\"‘gì´printf("QUOTE‘¹N");Ž¡‘\{‘gì´printf("OBRACE‘¹N");Ž¡‘\}‘gì´printf("EBRACE‘¹N");Ž¡‘;‘l¦printf("PUNTKOMMA‘¹N");Ž¡‘\n‘gì´printf("\n");Ž¡‘[–¹N\t]+‘U|/*“negeer“whitespace“*/;Ž¡‘%%Ž¡ŽŽŒ‹@[ Û_2 ý ~?Ÿ„€ÕÁGŽ¿4.‘ñ8Y‘ÿ ºA®>CC’ž(O¹6ŽŽ ÕÁ ýV¯Als–þ°w¸èe“ons“bšGestand“aan“het“programma“to˜ev¸èo˜eren“dat“do˜or“dit“Lex“b˜estand“gegenereerd“is“(met“gebruik“v‘ÿqÐanŽ© ®example3.compile)–U krijgen“w¸èe:ŽŸ´å‘ÅWOORD‘¹NOBRACEŽ¤ Š=‘WOORD–¹NBESTANDSNAAM“OBRACE“WOORD“PUNTKOMMA“EBRACE“PUNTKOMMAŽ¡‘WOORD–¹NWOORD“OBRACE“WOORD“PUNTKOMMA“EBRACE“PUNTKOMMAŽ¡‘EBRACE‘¹NPUNTKOMMAŽ¡¡‘WOORD–¹NQUOTE“BESTANDSNAAM“QUOTE“OBRACEŽ¡‘WOORD–¹NWOORD“PUNTKOMMAŽ¡‘WOORD–¹NQUOTE“BESTANDSNAAM“QUOTE“PUNTKOMMAŽ¡‘EBRACE‘¹NPUNTKOMMAŽŸؼ¹Als–CÅwš¸èe“dit“v˜ergelijk˜en“met“het“b•Go˜v˜engeno“emde‘CÅconguratieb“estand,‘G=w˜ordt–CÅduidelijk“dat“w˜e“het“netjes“`geto-Ž¦k¸èeniseerd'–U hebbšGen.‘q€Ieder“deel“v‘ÿqÐan“het“conguratieb˜estand“is“gematc•¸èh“t,–U en“omgezet“naar“een“tok¸èen.Ž¤#ÃÁ3.3Ž‘¾W‘þàat–¸w e“geleerd“hebb_úenŽŸMª¹W‘ÿ*¸e–þ¥hebbGen“geleerd“dat“Lex“in“staat“is“om“willekš¸èeurige“in˜v˜ošGer“te“lezen,‘ñen“te“b˜epalen“w¸èat“ieder“onderdeel“v‘ÿqÐanŽ¦de›U in•¸èv“oGer˜is.‘q€Dit˜w“ordt˜`tok“enizering'˜genoGemd.ŽŸ(Àœ¾4Ž‘ÁY‘þ®(AcCCŽŸ¿:¹Y‘ÿ*¸A•¸èCC‘•™k‘ÿqÐan›•©in“v“o•Gerstromen˜parsen˜die˜b“estaan˜uit˜tok¸èens˜met˜b“epaalde˜w•¸èaarden.‘3Dit˜geeft˜precies˜w“eer˜hoGeŽ¦Y‘ÿ*¸A•¸èCC‘`vzic“h›`»v“erhoudt˜tot˜LEX,˜Y‘ÿ*¸A“CC‘`vw“eet˜niet˜w“at˜`in“v“oGerstromen'˜zijn,‘£¡het˜heeft˜v“o•Gorb“ew•¸èerkte˜tok“ensŽ¦noGdig.‘q€Je–U kunš¸èt“je“eigen“tok˜enizeerder“sc˜hrijv˜en,“maar“w˜e“laten“dit“aan“Lex“o˜v˜er.ŽŸؼEen–‘opmerking“o•¸èv“er–‘grammatica's“en“parsers.‘%,T›ÿ*¸oGen“Y˜Aš¸èCC‘õhet“lev˜enslic˜h˜t“zag,‘Ÿýw˜erd“het“gebruikt“om“in˜v˜o-Ž¦erb•Gestanden›õÉv¸èo“or˜compilers˜te˜parsen:‘AÔprogramma's.‘Q¹Programma's˜in˜een˜computertaal˜zijn˜in˜het˜algemeenŽ¦*niet*–€dubbšGelzinnig“-“ze“hebb˜en“maar“een“b˜etek•¸èenis.‘*vY‘ÿ*¸A“CC‘Êk‘ÿqÐan–€dus“niet“met“dubb˜elzinnigheid“omgaan“en“zalŽ¦klagen›»o•¸èv“er˜shift/reduce˜en˜reduce/reduce˜conicten.‘£0Meer˜o“v“er˜dubbGelzinnigheid˜en˜Y‘ÿ*¸A“CC‘ºë"problemen€ïnŽ¦het–U hoGofdstuk“`Conicten'.Ž¡Á4.1Ž‘¾Een›¸een• v“oudige˜thermostaat˜b_úeheerserŽŸMª¹Laten–¦'wš¸èe“zeggen“dat“w˜e“een“thermostaat“willen“bGeheersen“met“een“een˜v˜oudige“taal.‘d•Een“sessie“met“deŽ¦thermostaat–U k‘ÿqÐan“er“als“v¸èolgt“uit“zien:Ž©´å‘Åwarmte‘¹NaanŽ¤ Š=‘>ÊrVerwarming‘¹Naan!Ž¡‘warmte‘¹NuitŽ¡‘>ÊrVerwarming‘¹Nuit!ŽŸؼ¹De–U tokš¸èens“die“w˜e“moGeten“herk˜ennen“zijn:‘q€w˜arm˜te,“aan/uit“(TOEST‘ÿ*¸AND),“došGel,“temp˜eratuur,“NUMMERŽŸؼDe–U Lex“tok¸èenizeerder“(V‘ÿ*¸o•Gorb“eeld–U 4)“is:Ž¦‘Å%{Ž¡‘#include‘¹NŽ¡‘#include‘¹N"y.tab.h"Ž¡‘%}ŽŽŽŒ‹H Û_2 ý ~?Ÿ„€ÕÁGŽ¿4.‘ñ8Y‘ÿ ºA®>CC’ž(O¹7ŽŽ ÕÁ ýV¯‘Å%%Ž¤ Š=‘[0-9]+‘U|return‘¹NNUMMER;Ž¡‘warmte‘U|return‘¹NTOKWARMTE;Ž¡‘aan|uit‘PN.return‘¹NTOESTAND;Ž¡‘doel‘^zreturn‘¹NTOKDOEL;Ž¡‘temperatuur‘=höreturn‘¹NTOKTEMPERATUUR;Ž¡‘\n‘gì´/*–¹Nnegeer“einde“regel“*/;Ž¡‘[–¹N\t]+‘U|/*“negeer“whitespace“*/;Ž¡‘%%ŽŸÓ˜¹W‘ÿ*¸e–žÛmerkš¸èen“t˜w˜ee“bGelangrijk˜e“v˜eranderingen“op.‘N²T‘ÿ*¸en“eerste“includen“w˜e“het“bGestand“`y‘ÿ*¸.tab.h'“en“ten“t˜w˜eedeŽ¤ ®prin•¸èten›åFw“e˜niet˜meer,‘ Ow“e˜returnen˜namen˜v‘ÿqÐan˜tok“ens.‘!òDeze˜v“erandering˜is˜omdat˜w“e˜het˜n“u˜allemaal˜aanŽ¡Y‘ÿ*¸A•¸èCC‘8–tošGev“o˜eren,‘>Qdie–8žis“niet“ge€ïnš¸èteresseerd“in“w˜at“w˜e“op“het“sc˜herm“uitv˜oGeren.‘gÿY.tab.h“heeft“denities“v˜oGorŽ¡deze‘U tok¸èens.Ž©ؼMaar–Dwš¸èaar“k˜om˜t“y‘ÿ*¸.tab.h“v‘ÿqÐandaan?‘kõHet“w˜ordt“gegenereerd“doGor“Y‘ÿ*¸A˜CC‘D{v‘ÿqÐan˜uit“het“Grammatica“Bestand“datŽ¡wš¸èe–U gaan“cre€ëren.‘q€Onze“taal“is“een˜v˜oudig“dus“de“grammatica“oGok:ŽŸnx‘Åcommands:–¹N/*“leeg“*/Ž¤ Š=‘>Êr|–¹Ncommands“commandŽ¡‘>Êr;Ž¡¡‘command:Ž¡‘>Êrheat_switchŽ¡‘>Êr|Ž¡‘>Êrtarget_setŽ¡‘>Êr;Ž¡¡‘heat_switch:Ž¡‘>ÊrTOKWARMTE‘¹NTOESTANDŽ¡‘>Êr{Ž¡‘d”âprintf("\tWarmte–¹Naan-“of“uitgezet\n");Ž¡‘>Êr}Ž¡‘>Êr;Ž¡¡‘target_set:Ž¡‘>ÊrTOKDOEL–¹NTOKTEMPERATUUR“NUMMERŽ¡‘>Êr{Ž¡‘d”âprintf("\tTemperatuur‘¹Ningesteld\n");Ž¡‘>Êr}Ž¡‘>Êr;ŽŸ’O¹Het–eerste“gedeelte“is“wš¸èat“ik“de“`w˜ortel'“zal“noGemen.‘UPHet“v˜ertelt“ons“dat“w˜e“`commands'“hebbGen,‘yen“dat“dezeŽ¤ ®commands–Á‹bšGestaan“uit“individuele“`command'“delen.‘¶ÀJe“ziet“dat“deze“regel“erg“recursief“is,‘Ü¥w•¸èan“t–Á‹hij“b˜ev‘ÿqÐatŽ¡wš¸èeer–ñhet“w˜ošGord“`commands'.‘¿òDit“b˜etek•¸èen“t–ñdat“het“programma“nš¸èu“een“reeks“commands“een“v˜oGor“een“k‘ÿqÐanŽ¡reduceren.‘q€Zie–U het“hošGofdstuk“`Ho˜e“w•¸èerk“en–U Lex“en“Y‘ÿ*¸Aš¸èCC“in˜tern'“v˜ošGor“b˜elangrijkš¸èe“details“o˜v˜er“recursie.Ž¦De›\“t•¸èw“eede˜regel˜denieert˜w“at˜een˜command˜is.‘ ‡ØW‘ÿ*¸e˜ondersteunen˜maar˜t“w“ee˜soGorten˜commands,‘ÞodeŽ¡`heat_switcš¸èh'–¶Ëen“de“`target_set'.‘–‚Dat“is“de“bGetek˜enis“v‘ÿqÐan“het“¸j¹-sym˜b•Go“ol–¶Ë-“`een“command“bGestaat“uit“ofw˜elŽ¡een–U heat_switc¸èh“of“een“target_set'.Ž¦Een–ÞÂheat_switcš¸èh“bGestaat“uit“het“HEA‘ÿ*¸T‘Þ]tok˜en,‘A+w˜at“simpGelw˜eg“het“w˜oGord“`w˜arm˜te'“is“gev˜olgd“doGor“eenŽ¡tošGestand–U (die“w¸èe“in“het“Lex“b˜estand“gedenieerd“hebb˜en“als“`aan'“of“`uit').Ž¦Iets–/ingewikkš¸èelder“is“de“target_set,‘6«die“bGestaat“uit“het“T‘ÿ*¸AR˜GET‘/tok˜en“(het“w˜ošGord“`do˜el'),‘6«het“TEMPERA-Ž¡TURE–U tokš¸èen“(het“w˜ošGord“`temp˜eratuur')“en“een“getal.ŽŽŽŒ‹R© Û_2 ý ~?Ÿ„€ÕÁGŽ¿4.‘ñ8Y‘ÿ ºA®>CC’ž(O¹8ŽŽ ÕÁ ýV¯¿4.1.1Ž‘#!\Een–Õvš®>olledig“Y‘ÿ ºA˜CC“bQÂestandŽŸMª¹De–Y¬vš¸èorige“paragraaf“toGonde“alleen“het“grammatica“gedeelte“v‘ÿqÐan“het“Y‘ÿ*¸A˜CC‘Y«bGestand,‘ZÏmaar“er“is“meer.‘$Dit“isŽ© ®de–U header“die“wš¸èe“hebbGen“w˜eggelaten:ŽŸþŠ‘Å%{Ž¤ Š=‘#include‘¹NŽ¡‘#include‘¹NŽ¡¡‘void–¹Nyyerror(const“char“*str)Ž¡‘{Ž¡‘>Êrfprintf(stderr,"fout:‘¹N%s\n",str);Ž¡‘}Ž¡¡‘int‘¹Nyywrap()Ž¡‘{Ž¡‘>Êrreturn‘¹N1;Ž¡‘}Ž¡¡‘main()Ž¡‘{Ž¡‘>Êryyparse();Ž¡‘}Ž¡¡‘%}Ž¡¡‘%token–¹NNUMMER“TOKWARMTE“TOESTAND“TOKDOEL“TOKTEMPERATUURŽŸ"a¹(NošGot–v‘ÿqÐan“de“v¸èertaler:‘æztussen“header“en“grammatica“mo˜et“nog“een“%%“staan.)‘ öDe“functie“yyš¸èerror()“w˜ordtŽ¦do•Gor›ÜYY‘ÿ*¸A¸èCC‘Ü6aangero“ep“en˜als˜hij˜een˜fout˜tegenk•¸èom“t.‘,W‘ÿ*¸e˜v“oGeren˜gew“o•Gon˜de˜do“orgestuurde˜b“o“o“dsc¸èhap˜uit,Ž¦maar–U er“zijn“slimmere“dingen“te“doGen.‘q€Zie“de“paragraaf“`V‘ÿ*¸erder“lezen'“aan“het“einde.Ž¤ؼDe–îfunctie“yywrap()“k‘ÿqÐan“gebruikt“wš¸èorden“om“v˜erder“te“lezen“uit“een“ander“bGestand.‘ÅêHet“w˜ordt“bij“EOFŽ¦aangero•Gep“en–Ø4en“dan“kun“je“een“ander“bšGestand“op˜enen,›ñ0en“0“returnen.‘GÜOf“je“kun¸èt“1“returnen,˜om“aan“te“gev¸èenŽ¦dat–U dit“ec•¸èh“t–U het“einde“is.‘q€Zie“v¸èerder“het“hošGofdstuk“`Ho˜e“Lex“en“Y‘ÿ*¸Aš¸èCC“in˜tern“w˜erk˜en'.Ž¡Dan–U is“er“nog“de“functie“main(),“die“niets“došGet“b˜ehalv¸èe“alles“in“gang“zetten.Ž¡De–ÀPlaatste“regel“denieert“een•¸èv“oudig–ÀPde“tokš¸èens“die“w˜e“gaan“gebruik˜en.‘³Die“w˜orden“uitgev˜oGerd“met“y‘ÿ*¸.tab.hŽ¦als–U Y‘ÿ*¸A¸èCC“is“aangero•Gep“en–U met“de“`-d'“optie.ŽŸ ¶¯¿4.1.2Ž‘#!\De–Õthermostaat“bQÂeheerser“compileren“&“draaienŽŸÚ²‘Ålex‘¹Nexample4.lŽ¤ Š=‘yacc–¹N-d“example4.yŽ¡‘cc–¹Nlex.yy.c“y.tab.c“-o“example4ŽŸ"a¹Sommige–DNdingen“zijn“vš¸èeranderd.‘? W‘ÿ*¸e“ro•Gep“en–DNn˜u“oGok“Y‘ÿ*¸A˜CC‘Daan“om“onze“grammatica“te“compileren,‘€w˜atŽ¦y›ÿ*¸.tab.c–\ûen“y˜.tab.h“genereert.‘‰Dan“ro•Gep“en–\ûwš¸èe“als“gew˜oGonlijk“Lex“aan.‘‰Bij“het“compileren“laten“w˜e“de“-ll“vlagŽ¦w•¸èeg;›U w“e˜hebbGen˜n“u˜onze˜eigen˜main()˜en˜hebb•Gen˜die˜v‘ÿqÐan˜libl˜niet˜no“dig.ŽŸþŠ‘ÅOPMERKING:–¹Nals“je“een“foutmelding“krijgt“dat“je“compiler“`yylval'“niet“kan“vinden,“voegŽ¡‘dan–¹Nonder“#include“ó5ùž" cmmi9È<Åy.tab.hÈ>“Ådit“toe:ŽŸÓâ‘extern–¹NYYSSTYOE“yylval;ŽŽŽŒ‹ ]E Û_2 ý ~?Ÿ„€ÕÁGŽ¿4.‘ñ8Y‘ÿ ºA®>CC’ž(O¹9ŽŽ ÕÁ ýV¯‘ÅDit–¹Nwordt“uitgelegd“in“de“paragraaf“`Hoe“Lex“en“YACC“intern“werken'.ŽŸؼ¹Een‘U v¸èo•Gorb“eeldsessie:ŽŸ´å‘Å$‘¹N./example4Ž¤ Š=‘warmte‘¹NaanŽ¡‘>ÊrWarmte–¹Naan-“of“uitgezetŽ¡‘warmte‘¹NuitŽ¡‘>ÊrWarmte–¹Naan-“of“uitgezetŽ¡‘doel–¹Ntemperatuur“10Ž¡‘>ÊrTemperatuur‘¹NingesteldŽ¡‘doel–¹Nvochtigheid“20Ž¡‘fout:–¹Nparse“errorŽ¡‘$ŽŸؼ¹Dit–µis“niet“helemaal“wš¸èat“w˜e“wilden“bGereik˜en,‘4[maar“om“de“leercurv˜e“bGehapbaar“te“houden“kunnen“w˜e“nietŽ¤ ®alles–U tegelijk“presen¸èteren.ŽŸ#ÃÁ4.2Ž‘¾De–¸thermostaat“uitbreiden“om“parameters“te“v• erw“erk“enŽŸMª¹Zoals–q.wš¸èe“hebbGen“gezien“kunnen“w˜e“de“thermostaat“commands“n˜u“correct“parsen,‘¸1en“zelfs“fouten“correctŽ¡opmerkš¸èen.‘b|Maar–¥tals“je“missc˜hien“hebt“geraden“došGor“de“dubb˜elzinnige“b˜ew¸èo˜ordingen,‘¹‰heeft“het“programmaŽ¡geen–U idee“w¸èat“het“zou“mošGeten“do˜en,“de“wš¸èaarden“die“je“in˜v˜oGert“w˜orden“er“niet“naar“doGorgestuurd.Ž©ؼLaten–•-wš¸èe“bGeginnen“met“het“v˜ermogen“om“de“nieu˜w˜e“do•Geltemp“eratuur–•-te“lezen.‘1§Hierv˜ošGor“mo˜eten“w¸èe“deŽ¡NUMMER‘ËSmatcš¸èh–Ëvin“de“Lexer“leren“zic˜hzelf“in“een“in˜teger“w˜aarde“om“te“zetten,‘æÿdie“dan“ingelezen“k‘ÿqÐan“w˜ordenŽ¡in‘U Y‘ÿ*¸A¸èCC.Ž¦Als–Ç®Lex“een“doGel“matc•¸èh“t,‘ãøstopt–Ç®het“de“tekst“v‘ÿqÐan“de“matcš¸èh“in“de“string“`yytext'.‘BZY‘ÿ*¸A˜CC‘ÇŠop“zijn“bGeurt“v˜erw˜ac˜h˜tŽ¡een–U wš¸èaarde“in“`yylv‘ÿqÐal'.‘q€In“v˜o•Gorb“eeld–U 5“zien“w˜e“de“v˜oGor“de“hand“liggende“oplossing:ŽŸ´å‘Å%{Ž¤ Š=‘#include‘¹NŽ¡‘#include‘¹N"y.tab.h"Ž¡‘%}Ž¡‘%%Ž¡‘[0-9]+‘U|yylval=atoi(yytext);–¹Nreturn“NUMMER;Ž¡‘warmte‘U|return‘¹NTOKWARMTE;Ž¡‘aan|uit‘PN.yylval=!strcmp(yytext,"aan");–¹Nreturn“TOESTAND;Ž¡‘doel‘^zreturn‘¹NTOKDOEL;Ž¡‘temperatuur‘=höreturn‘¹NTOKTEMPERATUUR;Ž¡‘\n‘gì´/*–¹Nnegeer“einde“regel“*/;Ž¡‘[–¹N\t]+‘U|/*“negeer“whitespace“*/;Ž¡‘%%ŽŸؼ¹Zoals–Tje“ziet“draaien“wš¸èe“atoi()“op“yytext,‘TMen“stoppGen“w˜e“de“uitk˜omst“in“yylv‘ÿqÐal,‘TMw˜aar“Y‘ÿ*¸A˜CC‘Thet“k‘ÿqÐan“vinden.Ž¤ ®Net–7zoiets“vš¸èoGor“de“TOEST‘ÿ*¸AND‘ matc˜h,‘1=w˜aarbij“w˜e“yylv‘ÿqÐal“op“1“zetten“als“deze“`aan'“is.‘ÅMerk“op“dat“eenŽ¡aparte–Ti`aan'“en“`uit'“matcš¸èh“in“Lex“een“sneller“programma“zou“genereren,‘Tmaar“ik“wilde“v˜oGor“de“v˜eranderingŽ¡een–U ingewikk¸èelder“regel“en“actie“laten“zien.Ž¦Nu–Ò“moGeten“wš¸èe“Y‘ÿ*¸A˜CC‘Òsleren“hošGe“hiermee“om“te“gaan.‘éÚW‘ÿ*¸at“in“Lex“`yylv‘ÿqÐal'“geno˜emd“wš¸èordt,‘ñðheeft“in“Y‘ÿ*¸A˜CCŽ¡een–U andere“naam.‘q€Laten“wš¸èe“de“regel“die“het“nieu˜w˜e“temp•Geratuurdo“el–U instelt“bGekijk˜en:ŽŸ´å‘Åtarget_set:ŽŽŽŒ‹ fÿ Û_2 ý ~?Ÿ„€ÕÁGŽ¿4.‘ñ8Y‘ÿ ºA®>CC’™(Ÿ¹10ŽŽ ÕÁ ýV¯‘>ÊrÅTOKDOEL–¹NTOKTEMPERATUUR“NUMMERŽ¤ Š=‘>Êr{Ž¡‘d”âprintf("\tTemperatuur–¹Ningesteld“op“%d\n",$3);Ž¡‘>Êr}Ž¡‘>Êr;ŽŸT¹Om–tošGegang“te“krijgen“tot“het“derde“gedeelte“v‘ÿqÐan“de“regel“(NUMMER),“mo˜eten“wš¸èe“$3“gebruik˜en.‘\ÌSteeds“alsŽ¤ ®yylex()›¡†return•¸èt,‘´Ÿw“ordt˜de˜w“aarde˜v–ÿqÐan˜yylv“al˜aan˜de˜terminal˜(v•¸èertaler:‘ Ltok“en)˜toGegek“end,‘´Ÿen˜k‘ÿqÐan˜bGenaderdŽ¡w¸èorden–U met“de“$-constructie.ŽŸؼOm–U hier“vš¸èerder“op“in“te“gaan,“bGesc˜hou˜w“de“nieu˜w˜e“`heat_switc˜h'“regel:Ž©ä`‘Åheat_switch:Ž¤ Š=‘>ÊrTOKWARMTE‘¹NTOESTANDŽ¡‘>Êr{Ž¡‘d”âif($2)Ž¡’Š_Rprintf("\tWarmte‘¹Naan\n");Ž¡‘d”âelseŽ¡’Š_Rprintf("\tWarmte‘¹Nuit\n");Ž¡‘>Êr}Ž¡‘>Êr;ŽŸ7¹Als–U je“nš¸èu“example5“draait,“v˜oGert“het“netjes“uit“w˜at“je“hebt“ingev˜oGerd.ŽŸ"‚±Á4.3Ž‘¾Een–¸conguratieb_úestand“parsenŽŸMª¹Laten–U w¸èe“een“deel“v‘ÿqÐan“het“eerder“genošGemde“conguratieb˜estand“herhalen:Ž¦‘Åzone–¹N"."“{Ž¡‘>Êrtype‘¹Nhint;Ž¡‘>Êrfile‘¹N"/etc/bind/db.root";Ž¡‘};ŽŸ7¹W‘ÿ*¸e–”æhebbšGen“al“een“Lexer“v¸èo˜or“dit“b˜estand.‘1mNu“ho˜evš¸èen“w˜e“alleen“nog“maar“een“Y‘ÿ*¸A˜CC‘”¶grammatica“te“sc˜hrijv˜en,ŽŸ ®en–U de“Lexer“aanpassen“zoGdat“het“wš¸èaarden“teruggeeft“in“een“v˜orm“die“Y‘ÿ*¸A˜CC“k‘ÿqÐan“snappGen.ŽŸؼIn–U de“lexer“v‘ÿqÐan“V‘ÿ*¸o•Gorb“eeld–U 6“zien“w¸èe:Ž¦‘Å%{Ž¡‘#include‘¹NŽ¡‘#include‘¹N"y.tab.h"Ž¡‘%}Ž¡¡‘%%Ž¡¡‘zone‘^zreturn‘¹NZONETOK;Ž¡‘file‘^zreturn‘¹NFILETOK;Ž¡‘[a-zA-Z][a-zA-Z0-9]*‘å8yylval=strdup(yytext);–¹Nreturn“WOORD;Ž¡‘[a-zA-Z0-9\/.-]+‘%Êpyylval=strdup(yytext);–¹Nreturn“BESTANDSNAAM;Ž¡‘\"‘gì´return‘¹NQUOTE;Ž¡‘\{‘gì´return‘¹NOBRACE;Ž¡‘\}‘gì´return‘¹NEBRACE;Ž¡‘;‘l¦return‘¹NPUNTKOMMA;Ž¡‘\n‘gì´/*–¹Nnegeer“einde“regel*/;Ž¡‘[–¹N\t]+‘U|/*“negeer“whitespace“*/;Ž¡‘%%ŽŽŽŒ‹ qß Û_2 ý ~?Ÿ„€ÕÁGŽ¿4.‘ñ8Y‘ÿ ºA®>CC’™(Ÿ¹11ŽŽ ÕÁ ýV¯Als–å¸je“goGed“kijkt,‘üzie“je“dat“yylv‘ÿqÐal“vš¸èeranderd“is!‘L^W‘ÿ*¸e“v˜erw˜ac˜h˜ten“niet“meer“dat“het“een“in˜teger“is,‘ümaar“nemenŽ¤ ®aan–¤dat“het“een“cš¸èhar“*“is.‘\WV‘ÿ*¸oGor“de“een˜v˜oud“ro•Gep“en–¤w˜e“strdup“aan“en“v˜erspillen“een“hoGop“geheugen.‘\WMerk“opŽ¡dat–U dit“geen“probleem“is“in“vš¸èeel“gev‘ÿqÐallen“als“je“een“bGestand“maar“een“k˜eer“hoGeft“te“parsen,“en“dan“exit.Ž©ؼW‘ÿ*¸e–º*willen“strings“opslaan“omdat“wš¸èe“n˜u“v˜oGornamelijk“met“namen“te“mak˜en“hebb•Gen:‘;“b“estandsnamen‘º*enŽ¡zonenamen.‘q€In–U een“later“hošGofdstuk“zullen“w¸èe“uitleggen“ho˜e“je“met“v•¸èersc“hillende–U so˜orten“data“omgaat.Ž¦Om›¹³Y‘ÿ*¸A•¸èCC‘¹™o“v“er˜het˜nieu“w“e˜t“ypGe˜v–ÿqÐan˜yylv“al˜te˜v•¸èertellen,‘ÒØv“oGegen˜w“e˜dit˜toGe˜aan˜de˜header˜v‘ÿqÐan˜onze˜Y‘ÿ*¸A“CCŽ¡grammatica:Ž¤ÙöÃ#define–?¬YYSTYPE“char“*Ž¡¹De–U grammatica“zelf“is“wš¸èeer“ingewikk˜elder.‘q€W‘ÿ*¸e“hakk˜en“het“in“stukjes“om“het“v˜erteerbaarder“te“mak˜en.Ž©vn‘Åcommands:Ž¤ Š=‘>Êr|Ž¡‘>Êrcommands–¹Ncommand“PUNTKOMMAŽ¡‘>Êr;Ž¡¡¡‘command:Ž¡‘>Êrzone_setŽ¡‘>Êr;Ž¡¡‘zone_set:Ž¡‘>ÊrZONETOK–¹Nquotedname“zonecontentŽ¡‘>Êr{Ž¡‘d”âprintf("Complete–¹Nzone“for“'%s'“gevonden\n",$2);Ž¡‘>Êr}Ž¡‘>Êr;ŽŸšE¹Dit–_†is“de“inš¸ètro,‘b inclusief“v˜o•Gorno“emde–_†recursiev˜e“`w˜ortel'“Merk“op“dat“w˜e“spGeciceren“dat“commands“w˜ordenŽ¤ ®getermineerd–ÄE(en“gesc¸èheiden)“došGor“;'s.‘¾îW‘ÿ*¸e“deni€ëren“€é€én“so˜ort“command,‘àde“`zone_set'.‘¾îDeze“b˜estaat“uitŽ¡het–TWZONE‘Ttokš¸èen“(het“w˜oGord“`zone'),‘”$gev˜olgd“doGor“een“quotedname“en“de“`zonecon˜ten˜t'.‘o$De“zonecon˜ten˜tŽ¡bGegin•¸èt‘U een“v“oudig:ŽŸ¶ ‘Åzonecontent:ŽŸ Š=‘>ÊrOBRACE–¹Nzonestatements“EBRACEŽŸÙö¹Hij–¸&mošGet“b˜eginnen“met“een“OBRAš¸èCE,“een“¸f¹.‘š‘Dan“k˜omen“de“zonestatemen˜ts,‘Ðçgev˜olgd“doGor“een“EBRA˜CE,Ž¡een‘U ¸g¹.Ž¦‘Åquotedname:Ž¤ Š=‘>ÊrQUOTE–¹NBESTANDSNAAM“QUOTEŽ¡‘>Êr{Ž¡‘d”â$$=$2;Ž¡‘>Êr}ŽŸšE¹Deze–Ž«sectie“denieert“een“`quotedname':›ä—een“BEST‘ÿ*¸ANDSNAAM‘Žœtussen“QUOTES.“Dan“iets“bijzonders:˜deŽ¤ ®wš¸èaarde–ÌLv‘ÿqÐan“een“quotedname“tok˜en“is“de“w˜aarde“v‘ÿqÐan“de“BEST‘ÿ*¸ANDSNAAM.“Dit“bGetek˜en˜t“dat“de“quotednameŽ¡als–U w¸èaarde“de“bGestandsnaam“zonder“quotes“heeft.ŽŸؼDat–Ñ¡is“wš¸èat“het“magisc˜he“`$$=$2'“doGet.‘çHet“zegt:‘jƒmijn“w˜aarde“is“de“w˜aarde“v‘ÿqÐan“mijn“t˜w˜eede“deel.‘çAls“n˜uŽ¡naar–ŸÍde“quotedname“v•¸èerw“ezen›ŸÍw“ordt˜in˜andere˜regels,‘²xen˜je˜bGenadert˜zijn˜w“aarde˜met˜de˜$-constructie,‘²xzieŽ¡je–U de“wš¸èaarde“die“w˜e“hier“ingesteld“hebbGen“met“$$=$2.ŽŽŽŒ‹ yƒ Û_2 ý ~?Ÿ„€ÕÁGŽ¿5.‘ñ8Een–ÕPš®>arser“in“C++“mak˜en’2•Ê¹12ŽŽ ÕÁ ýV¯‘ÅOPMERKING:–¹Ndeze“grammatica“verslikt“zich“in“bestandsnamen“zonder“een“`.'‘ rœof“een“`/'Ž© ®‘erin.ŽŸ´å‘zonestatements:Ž¤ Š=‘>Êr|Ž¡‘>Êrzonestatements–¹Nzonestatement“PUNTKOMMAŽ¡‘>Êr;Ž¡¡‘zonestatement:Ž¡‘>ÊrstatementsŽ¡‘>Êr|Ž¡‘>ÊrFILETOK‘¹NquotednameŽ¡‘>Êr{Ž¡‘d”âprintf("Een–¹Nzonefile“naam“'%s'“tegengekomen\n",“$2);Ž¡‘>Êr}Ž¡‘>Êr;ŽŸؼ¹Dit–d§is“een“algemeen“statemenš¸èt“die“alle“soGorten“statemen˜ts“binnen“het“`zone'“blok“afv‘ÿqÐangt.‘ W‘ÿ*¸e“zien“opnieu˜wŽ¦de‘U recursiviteit.Ž©´å‘Åblock:Ž¡‘>ÊrOBRACE–¹Nzonestatements“EBRACE“PUNTKOMMAŽ¡‘>Êr;Ž¡¡‘statements:Ž¡‘>Êr|–¹Nstatements“statementŽ¡‘>Êr;Ž¡¡‘statement:–¹NWOORD“|“block“|“quotednameŽŸؼ¹Dit–U denieert“een“blok,“en“`statemenš¸èts'“die“er“in“gev˜onden“kunnen“w˜orden.ŽŸؼBij–U uitvš¸èoGering“ziet“de“uitv˜oGer“er“zo“uit:Ž¦‘Å$‘¹N./example6Ž¡‘zone–¹N"."“{Ž¡‘>Êrtype‘¹Nhint;Ž¡‘>Êrfile‘¹N"/etc/bind/db.root";Ž¡‘>Êrtype‘¹Nhint;Ž¡‘};Ž¡‘Een–¹Nzonefile“naam“'/etc/bind/db.root'“tegengekomenŽ¡‘Complete–¹Nzone“for“'.'“gevondenŽŸ(Àœ¾5Ž‘ÁEen–G\Pšcarser“in“C++“mak˜enŽŸ¿:¹HoGewš¸èel–[@Lex“en“Y‘ÿ*¸A˜CC‘[?ouder“zijn“dan“C++,‘\Èis“het“mogelijk“een“C++“parser“te“mak˜en.‘ƒáFlex“heeft“een“optieŽ¤ ®om–Tqeen“C++“lexer“te“genereren,‘T”maar“die“zullen“wš¸èe“niet“gebruik˜en,‘T”w˜an˜t“Y‘ÿ*¸A˜CC“k‘ÿqÐan“er“direct“mee“omgaan.Ž©ؼIk–U4geef“er“de“v•¸èošGork“eur–U4aan“Lex“een“gew¸èo˜on“C‘Tòb˜estand“te“laten“genereren,‘•9en“Y‘ÿ*¸A¸èCC‘TòC++“co˜de“te“latenŽ¡genereren.‘a¼Als–%Òje“dan“je“toGepassing“linkt,‘/Hkš¸èom“je“missc˜hien“problemen“tegen“omdat“de“C++“coGde“standaardŽ¡geen–U C“functies“k‘ÿqÐan“vinden,“tenzij“je“het“v¸èerteld“hebt“dat“de“functies“extern“"C"zijn.Ž¦Maak–U hiervš¸èoGor“een“C“header“in“Y‘ÿ*¸A˜CC:ŽŽŽŒ‹ „ Û_2 ý ~?Ÿ„€ÕÁGŽ¿6.‘ñ8HoQÂe›Õw•®>erk“en˜Lex˜en˜Y‘ÿ ºA“CC˜in“tern’;¹¹13ŽŽ ÕÁ ýV¯‘Åextern‘¹N"C"Ž¤ Š=‘{Ž¡‘>Êrint‘¹Nyyparse(void);Ž¡‘>Êrint‘¹Nyylex(void);Ž¡‘>Êrint‘¹Nyywrap()Ž¡‘>Êr{Ž¡‘d”âreturn‘¹N1;Ž¡‘>Êr}Ž¡¡‘}Ž©…¹Als–U je“yydebug“wilt“declareren“of“vš¸èeranderen,“moGet“dat“n˜u“zo:ŽŸa¶‘Åextern–¹Nint“yydebug;Ž¡¡‘main()Ž¡‘{Ž¡‘>Êryydebug=1;Ž¡‘>Êryyparse();Ž¡‘}Ž¦¹Dit–U is“v›ÿqÐan•¸èw“ege–U de“Een“Denitie“Regel“v˜an“C++,“die“geen“meerv¸èoudige“denities“v˜an“yydebug“toGestaat.Ž¤ؼJe–MÇzult“missc¸èhien“ošGok“de“#dene“v‘ÿqÐan“YYSTYPE‘M†in“je“Lex“b˜estand“mo˜eten“herhalen,‘‹ðv‘ÿqÐan•¸èw“ege–MÇC++“z'nŽ© ®strengere–U tš¸èypGe“c˜hec˜king.Ž¡Compileren–U gaat“ongev¸èeer“zo:ŽŸ¥Œ‘Ålex‘¹Nbindconfig2.lŽ¤ Š=‘yacc–¹N--verbose“--debug“-d“bindconfig2.y“-o“bindconfig2.ccŽ¡‘cc–¹N-c“lex.yy.c“-o“lex.yy.oŽ¡‘c++–¹Nlex.yy.o“bindconfig2.cc“-o“bindconfig2ŽŸÉc¹V›ÿ*¸an•¸èw“ege–U het“-o“statemen¸èt“heet“y˜.tab.h“nš¸èu“bindcong2.cc.h,“dus“hou“daar“rek˜ening“mee.Ž¤ؼSamengev‘ÿqÐat:‘$došGe–®hgeen“mo˜eite“om“een“Lexer“in“C++“te“compileren,‘Ä»hou“het“in“C.“Maak“je“parser“in“C++Ž¦en–U leg“je“compiler“uit“dat“sommige“functies“C“functies“zijn“met“extern“"C"statemen¸èts.ŽŸ(†6¾6Ž‘ÁHopœe›G\w•cerk“en˜Lex˜en˜Y‘þ®(A“CC˜in“ternŽŸ¿:¹In–H|het“Y‘ÿ*¸Aš¸èCC‘HxbGestand“sc˜hrijf“je“je“eigen“main()“functie,‘Kdie“op“een“gegev˜en“momen˜t“yyparse()“aanroGept.‘mIDeŽ¦functie–U yyparse()“is“v¸èošGor“je“aangemaakt“do˜or“Y‘ÿ*¸Aš¸èCC,“en“k˜om˜t“in“y‘ÿ*¸.tab.c“terec˜h˜t.Ž¡yyparse()–ÅMleest“een“strošGom“tok•¸èen/w“aarde–ÅMparen“v‘ÿqÐan“yylex(),‘âw•¸èelk“e‘ÅMb˜esc“hikbaar–ÅMgesteld“mo˜et“wš¸èorden.‘AJe“kun˜tŽ¦deze–U functie“zelf“sc•¸èhrijv“en,–U of“Lex“dit“laten“došGen.‘q€In“onze“v¸èo˜orb˜eelden“hebb˜en“wš¸èe“dit“aan“Lex“o˜v˜ergelaten.Ž¡De–&Äyylex()“zoals“gesc•¸èhrev“en–&ÄdoGor“Lex“leest“k›ÿqÐarakters“v˜an“een“FILE‘&¸*“b•Gestandsp“oin¸èter,‘0 yyin–&Ägenaamd.‘b Als“jeŽ¦yyin–+šniet“instelt,‘3èis“het“de“standard“input.‘c©Hij“vš¸èoGert“uit“naar“yy˜out,‘3èals“niet“ingesteld“is“dat“stdout.‘c©Je“kun˜tŽ¦yyin–ìošGok“v¸èeranderen“in“de“yywrap()“functie“die“bij“einde“v‘ÿqÐan“een“b˜estand“w¸èordt“aangero˜ep˜en.‘]ÄDaarmee“kunŽ¦je–U een“ander“bšGestand“op˜enen,“en“v¸èerder“parsen.Ž¡Als–ÛBdat“het“gev‘ÿqÐal“is,‘ó¢mošGet“hij“0“returnen.‘HáAls“je“na“dit“b˜estand“wilt“stopp˜en“met“parsen,‘ó¢mo˜et“hij“1“returnen.Ž¡Iedere–aanroGep“v‘ÿqÐan“yylex()“returnš¸èt“een“in˜teger“w˜aarde“die“een“tok˜en“t˜ypGe“v˜oGorstelt.‘#œDit“v˜ertelt“Y‘ÿ*¸A˜CC‘ow˜atŽ¦v•¸èoGor›©gtok“en˜hij˜gelezen˜heeft.‘8COptioneel˜mag˜het˜tok“en˜een˜w“aarde˜hebb•Gen,‘Ë¿die˜in˜de˜v‘ÿqÐariab“ele˜yylv‘ÿqÐal˜geplaatstŽ¦moGet‘U w¸èorden.ŽŽŽŒ‹‹Ž Û_2 ý ~?Ÿ„€ÕÁGŽ¿6.‘ñ8HoQÂe›Õw•®>erk“en˜Lex˜en˜Y‘ÿ ºA“CC˜in“tern’;¹¹14ŽŽ ÕÁ ýV¯Standaard–¶is“yylv›ÿqÐal“v˜an“het“tš¸èypGe“in˜t,‘¯Ûmaar“je“kun˜t“dit“in“het“Y‘ÿ*¸A˜CC‘£bGestand“o˜v˜erriden“doGor“YYSTYPE‘£teŽ¤ ®her#denen.Ž©ؼDe–ÑLexer“mošGet“to˜egang“hebb˜en“tot“yylv‘ÿqÐal.‘UfHierv¸èo˜or“mo˜et“deze“gedeclareerd“w¸èorden“in“de“scop˜e“v‘ÿqÐan“de“lexerŽ¡als–Ø een“externe“v‘ÿqÐariabšGele.‘úDDe“originele“Y‘ÿ*¸A¸èCC‘×êdo˜et“dit“niet“v¸èo˜or“je,‘øÇdus“mo˜et“je“het“v¸èolgende“aan“je“lexerŽ¡to•Gev¸èo“egen,–U net“onder“de“#include“µ<¹y‘ÿ*¸.tab.hµ>¹:Ž¤ÿZÃextern–?¬YYSTYPE“yylval;Ž¡¹Bison,›U w•¸èelk“e˜de˜meeste˜mensen˜tegen“w“oGordig˜gebruik“en,˜doGet˜dit˜automatisc“h˜v“oGor˜je.ŽŸ" .Á6.1Ž‘¾T‘þàok• en“w“aardenŽŸMª¹Zoals–üÓopgemerkt“moGet“yylex()“returnen“wš¸èat“v˜ošGor“so˜ort“tokš¸èen“het“is“tegengek˜omen,‘&¿en“zijn“w˜aarde“in“yyl-Ž¤ ®v‘ÿqÐal–QstoppGen.‘ÇAls“deze“tokš¸èens“gedenieerd“zijn“met“het“%tok˜en“commando,‘Nw˜orden“er“n˜umeriek˜e“id's“aanŽ¡to•Gegek¸èend,›U b“eginnend˜bij˜256.Ž¦HierdoGor–Ýÿis“het“mogelijk“alle“ascii“k‘ÿqÐarakters“als“tokš¸èen“te“gebruik˜en.‘IËLaten“w˜e“zeggen“dat“je“een“rek˜enmac˜hineŽ¡aan–U het“sc•¸èhrijv“en›U bGen“t,˜tot˜n“u˜toGe˜zouden˜w“e˜de˜lexer˜als˜v“olgt˜hebbGen˜gesc“hrev“en:Ž©Ûƒ‘Å[0-9]+‘/= yylval=atoi(yytext);–¹Nreturn“NUMMER;Ž¤ Š=‘[–¹N\n]+‘/= /*“eet“whitespace“*/;Ž¡‘-‘FÛ’return‘¹NMINUS;Ž¡‘\*‘B"Dreturn‘¹NMULT;Ž¡‘\+‘B"Dreturn‘¹NPLUS;Ž¡‘...ŽŸÿZ¹Onze–U Y‘ÿ*¸Aš¸èCC“grammatica“zou“dan“het“v˜olgende“bGev‘ÿqÐatten:Ž¦‘>ÊrÅexp:‘å8NUMMERŽ¡‘d”â|Ž¡‘d”âexp–¹NPLUS“expŽ¡‘d”â|Ž¡‘d”âexp–¹NMINUS“expŽ¡‘d”â|Ž¡‘d”âexp–¹NMULT“expŽ¤ÿZ¹Dit–¥>is“onnošGdig“ingewikk¸èeld.‘aÛDo˜or“k‘ÿqÐarakters“te“gebruikš¸èen“als“afk˜ortingen“v˜oGor“n˜umeriek˜e“tok˜en“id's“kunnenŽ© ®wš¸èe–U onze“lexer“hersc˜hrijv˜en:Ž¡Ã[0-9]+‘4|¸yylval=atoi(yytext);–?¬return“NUMMER;Ž¦[–?¬\n]+‘4|¸/*“eet“whitespace“*/;Ž¦.‘N»return–?¬(int)“yytext[0];Ž¡¹De–U laatste“punš¸èt“matc˜h˜t“alle“v˜erder“niet“gematc˜h˜te“k‘ÿqÐarakters.ŽŸؼDe–U Y‘ÿ*¸Aš¸èCC“grammatica“w˜ordt“dan:ŽŸmd‘>ÊrÅexp:‘å8NUMMERŽ¤ Š=‘d”â|Ž¡‘d”âexp–¹N'+'“expŽ¡‘d”â|Ž¡‘d”âexp–¹N'-'“expŽ¡‘d”â|Ž¡‘d”âexp–¹N'*'“expŽŽŽŒ‹–˜ Û_2 ý ~?Ÿ„€ÕÁGŽ¿6.‘ñ8HoQÂe›Õw•®>erk“en˜Lex˜en˜Y‘ÿ ºA“CC˜in“tern’;¹¹15ŽŽ ÕÁ ýV¯Dit–"Üis“vš¸èeel“k˜orter“en“oGok“duidelijk˜er.‘`¿Je“hoGeft“de“ascii“tok˜ens“n˜u“niet“met“%tok˜en“in“de“header“te“declareren,Ž¤ ®ze›U w•¸èerk“en˜zo˜uit˜de˜doGos.Ž©ؼEen–i›ander“goGed“ding“v‘ÿqÐan“deze“constructie“is“dat“Lex“nš¸èu“alles“zal“matc˜hen“dat“w˜e“het“gev˜en“-“w˜at“het“standaardŽ¡gedrag–>vom“niet“gematc•¸èh“te›>vin“v“oGer˜naar˜stdout˜te˜ec“ho'en˜v“ermijdt.‘iòAls˜een˜gebruik“er˜v‘ÿqÐan˜deze˜rek“enmac“hineŽ¡een–U “gebruikt,“geeft“het“nš¸èu“een“parse“error,“in“plaats“v‘ÿqÐan“op“stdout“ge-ec˜hoGot“te“w˜orden.ŽŸ"YJÁ6.2Ž‘¾Recursie:‘ÿ `rec• h“ts–¸is“fout'ŽŸMª¹Recursie–7is“een“vitaal“aspšGect“v‘ÿqÐan“Y‘ÿ*¸A¸èCC.“Zonder“recursie“kun“je“niet“sp˜eciceren“dat“een“b˜estand“b˜estaat“uitŽ¡een–2¢reeks“onafhank•¸èelijk“e–2¢commando's“of“statemenš¸èts.‘fV‘ÿ*¸an“zic˜hzelf“is“Y‘ÿ*¸A˜CC‘2šalleen“ge€ïn˜teresseerd“in“de“eersteŽ¡regel,–U of“de“regel“die“je“aanš¸èwijst“als“de“startregel,“met“het“`%start'“sym˜b•Go“ol.Ž¦Recursie–ó(in“Y‘ÿ*¸A•¸èCC‘ók“om“t–ó(in“t•¸èw“ee›ó(smak“en:‘@„rec“h“ts˜en˜links.‘PØLink“er˜recursie,‘Àdie˜je˜meestal˜moGet˜gebruik“en,‘ÀzietŽ¡er–U zo“uit:Ž©GØÃcommands:–?¬/*“leeg“*/Ž¡‘)ý`|Ž¡‘)ý`commands‘?¬commandŽ¦¹Dit›bGetek•¸èen“t:‘û@een˜commando˜is˜ofw“el˜leeg,–K8of˜het˜bGestaat˜uit˜een˜of˜meer˜commando's,“gev¸èolgd˜doGor˜eenŽ¡commando.‘g/De–6.manier“wš¸èaarop“Y‘ÿ*¸A˜CC‘6&w˜erkt“bGetek˜en˜t“dat“je“n˜u“gemakk˜elijk“individuele“commando“gro•Gep“enŽ¡kun•¸èt›U afhakk“en˜(aan˜de˜v“oGork‘ÿqÐan“t)˜en˜reduceren.ŽŸؼV‘ÿ*¸ergelijk–U dit“met“rec•¸èh“ter–U recursie,“die“er“v•¸èerw“arrend–U genošGeg“v¸èo˜or“v¸èelen“b˜eter“uitziet:Ž¦Ãcommands:–?¬/*“leeg“*/Ž¡‘)ý`|Ž¡‘)ý`command‘?¬commandsŽ¦¹Maar–A‹dit“is“kš¸èostbaar.‘jùGebruikt“als“de“%start“regel,‘Evv˜ereist“het“dat“Y‘ÿ*¸A˜CC‘A†alle“commando's“in“je“bGestand“opŽ¡de–·Ùstacš¸èk“houdt,‘Їw˜at“een“hoGop“geheugen“k‘ÿqÐan“gebruik˜en.‘™«Dus“gebruik“in“ieder“gev‘ÿqÐal“link˜er“recursie“v˜oGor“hetŽ¡parsen–av‘ÿqÐan“lange“statemenš¸èts.‘•jSoms“is“het“moGeilijk“rec˜h˜ter“recursie“te“v˜ermijden“maar“als“je“statemen˜ts“nietŽ¡te–U lang“zijn,“hošGef“je“je“niet“in“b˜o˜c•¸èh“ten–U te“wringen“om“linkš¸èer“recursie“te“gebruik˜en.ŽŸؼAls–Çíiets“je“commando's“bGe€ëindigt“(en“dus“scš¸èheidt),‘ä+lijkt“rec˜h˜ter“recursie“erg“natuurlijk,‘ä+maar“is“het“nog“steedsŽ¡k¸èostbaar:Ž¦Ãcommands:–?¬/*“leeg“*/Ž¡‘)ý`|Ž¡‘)ý`command–?¬PUNTKOMMA“commandsŽ¦¹De–U juiste“manier“om“dit“te“cošGderen“is“met“link¸èer“recursie“(ik“heb“het“o˜ok“niet“uitgev¸èonden):Ž¦Ãcommands:–?¬/*“leeg“*/Ž¡‘)ý`|Ž¡‘)ý`commands–?¬command“PUNTKOMMAŽ¦¹Eerdere–U vš¸èersies“v‘ÿqÐan“deze“HO˜WTO“gebruikten“abusiev˜elijk“rec˜h˜ter“recursie.‘q€Met“dank“aan“Markus“T‘ÿ*¸risk‘ÿqÐa.ŽŸ"YJÁ6.3Ž‘¾yylv‘ÿ@ al–¸vš o_úor“gev˜orderden:‘ÿ %unionŽŸMª¹Momenš¸èteel–p@moGeten“w˜e“*het*“t˜ypGe“v›ÿqÐan“yylv˜al“deni€ëren.›ÂàDit“is“ec•¸èh“ter–p@niet“altijd“toGepasselijk.˜Er“zijn“tijdenŽ¡dat–˜wš¸èe“meerdere“datat˜ypšGen“mo˜eten“kunnen“v•¸èerw“erk“en.‘;ÎT‘ÿ*¸erugk“erend–˜naar“onze“h•¸èyp˜othetisc“he‘˜thermostaat,Ž¡willen–U wš¸èe“missc˜hien“een“v˜erw˜arming“die“w˜e“willen“bGeheersen“uitkiezen,“als“v˜olgt:ŽŽŽŒ‹Ÿ” Û_2 ý ~?Ÿ„€ÕÁGŽ¿6.‘ñ8HoQÂe›Õw•®>erk“en˜Lex˜en˜Y‘ÿ ºA“CC˜in“tern’;¹¹16ŽŽ ÕÁ ýV¯‘ÅVerwarming‘¹NhoofdgebouwŽ¤ Š=‘>Êr`hoofdgebouw'–¹Nverwarming“geselecteerdŽ¡‘doel–¹Ntemperatuur“23Ž¡‘>Êr`hoofdgebouw'–¹Nverwarming“doel“temperatuur“nu“23ŽŸ®Ž¹Hierv¸èo•Gor›U mo“et˜yylv‘ÿqÐal˜een˜union˜w•¸èezen,˜die˜zo“w“el˜strings˜als˜in“tegers˜k–ÿqÐan˜bGev“atten˜-˜maar˜niet˜tegelijk.Ž©ؼBedenk–ð«dat“wš¸èe“Y‘ÿ*¸A˜CC‘ð’eerder“v˜erteld“hebbGen“w˜elk“t˜ypGe“yylv‘ÿqÐal“w˜as“doGor“YYSTYPE‘ð’te“deni€ëren.‘PW‘ÿ*¸e“zoudenŽ¤ ®YYSTYPE›r1op–r8deze“manier“als“union“kunnen“deni€ëren,‘y~maar“Y‘ÿ*¸A¸èCC˜heeft“hier“een“gemakk•¸èelijk“er‘r8methoGdeŽ¡vš¸èoGor:‘q€het–U %union“statemen˜t.Ž¦Gebaseerd–U op“V‘ÿ*¸o•Gorb“eeld–U 4,“sc•¸èhrijv“en›U w“e˜n“u˜de˜Y‘ÿ*¸A“CC˜grammatica˜v‘ÿqÐan˜V‘ÿ*¸o•Gorb“eeld˜7.‘q€Eerst˜de˜in¸ètro:ŽŸÆY‘Å%token–¹NTOKVERWARMING“TOKWARMTE“TOKDOEL“TOKTEMPERATUURŽ¤ Š=¡‘%unionŽ¡‘{Ž¡‘>Êrint‘¹Nnumber;Ž¡‘>Êrchar‘¹N*string;Ž¡‘}Ž¡¡‘%token–¹N“TOESTANDŽ¡‘%token–¹N“NUMMERŽ¡‘%token–¹N“WOORDŽŸê0¹W‘ÿ*¸e–Ódeni€ëren“onze“union,‘3die“alleen“een“nš¸èummer“en“een“string“bGev‘ÿqÐat.‘ì£Dan“leggen“w˜e“Y‘ÿ*¸A˜CC‘Ómet“eenŽ¤ ®uitgebreide–U %tokš¸èen“syn˜tax“uit“w˜elk“deel“v‘ÿqÐan“de“union“ieder“tok˜en“mošGet“b˜enaderen.Ž¦In–›jdit“gev‘ÿqÐal“laten“wš¸èe“het“TOEST‘ÿ*¸AND‘›Xtok˜en“een“in˜teger“gebruik˜en,‘¬ünet“als“zonet.‘D]Hetzelfde“geldt“v˜oGor“hetŽ¡NUMMER–U tokš¸èen,“dat“w˜e“gebruik˜en“om“tempGeraturen“te“lezen.Ž¦Nieuš¸èw–U is“het“W˜OORD“tok˜en,“dat“gedeclareerd“is“om“een“string“te“gebruik˜en.Ž¦Het–U lexerbšGestand“v¸èerandert“o˜ok“een“b˜eetje:ŽŸÆY‘Å%{Ž¤ Š=‘#include‘¹NŽ¡‘#include‘¹NŽ¡‘#include‘¹N"y.tab.h"Ž¡‘%}Ž¡‘%%Ž¡‘[0-9]+‘U|yylval.number=atoi(yytext);–¹Nreturn“NUMMER;Ž¡‘verwarming‘B"Dreturn‘¹NTOKVERWARMING;Ž¡‘warmte‘U|return‘¹NTOKWARMTE;Ž¡‘aan|uit‘PN.yylval.number=!strcmp(yytext,"aan");–¹Nreturn“TOESTAND;Ž¡‘doel‘^zreturn‘¹NTOKDOEL;Ž¡‘temperatuur‘=höreturn‘¹NTOKTEMPERATUUR;Ž¡‘[a-z0-9]+‘FÛ’yylval.string=strdup(yytext);return‘¹NWOORD;Ž¡‘\n‘gì´/*–¹Nnegeer“einde“regel“*/;Ž¡‘[–¹N\t]+‘U|/*“negeer“whitespace‘ rœ*/;Ž¡‘%%ŽŸê0¹Zoals–0je“ziet“bGenaderen“wš¸èe“de“yylv‘ÿqÐal“niet“meer“direct,‘úw˜e“v˜ošGegen“een“sux“to˜e“om“aan“te“gevš¸èen“w˜elk“deel“w˜eŽŸ ®willen–U bšGenaderen.‘q€In“de“Y‘ÿ*¸A¸èCC“grammatica“ho˜eft“dat“ec•¸èh“ter–U niet,“w•¸èan“t›U Y‘ÿ*¸A“CC˜doGet˜het˜v“oGor˜ons:ŽŸŠ¶‘Åheater_select:Ž¡‘>ÊrTOKVERWARMING‘¹NWOORDŽŽŽŒ‹¬¡ Û_2 ý ~?Ÿ„€ÕÁGŽ¿7.‘ñ8Debuggen’‡Û{¹17ŽŽ ÕÁ ýV¯‘>ÊrÅ{Ž¤ Š=‘d”âprintf("\tVerwarming–¹N'%s'“geselecteerd\n",$2);Ž¡‘d”âheater=$2;Ž¡‘>Êr}Ž¡‘>Êr;Ž©Ë¹V‘ÿ*¸an•¸èw“ege–|Äde“%tokš¸èen“declaratie“hierbGo˜v˜en“kiest“Y‘ÿ*¸A˜CC‘|wautomatisc˜h“het“`string'“lid“uit“onze“union.‘èkMerkŽ¤ ®oGok–ÑUop“dat“wš¸èe“een“k˜opie“v‘ÿqÐan“$2“opslaan,‘ðbdie“later“gebruikt“w˜ordt“om“de“gebruik˜er“te“v˜ertellen“naar“w˜elk˜eŽ¡v•¸èerw“arming–U hij“commando's“stuurt:ŽŸ§F‘Åtarget_set:Ž¤ Š=‘>ÊrTOKDOEL–¹NTOKTEMPERATUUR“NUMMERŽ¡‘>Êr{Ž¡‘d”âprintf("\tTemperatuur–¹Nvan“verwarming“'%s'“ingesteld“op“%d\n",heater,$3);Ž¡‘>Êr}Ž¡‘>Êr;Ž¦¹Lees–U v¸èoGor“meer“details“example7.y‘ÿ*¸.ŽŸ(f¾7Ž‘ÁDebuggenŽŸ¿:¹Het–,¢is“bšGelangrijk“om“debuggingsfaciliteiten“te“hebb˜en,‘4»v¸èo˜oral“als“je“aan“het“leren“b˜enš¸èt.‘dGelukkig“k‘ÿqÐan“Y‘ÿ*¸A˜CCŽ¤ ®een–$ÊhoGop“feedbacš¸èk“gev˜en.‘acDeze“feedbac˜k“k˜om˜t“tegen“de“prijs“v‘ÿqÐan“enige“o˜v˜erhead,‘.udus“je“moGet“enige“switc˜hesŽ¡gev¸èen–U om“het“aan“te“zetten.Ž©ؼV‘ÿ*¸ošGeg–åWals“je“je“grammatica“compileert,‘û²debug“en“v¸èerb˜ose“to˜e“aan“de“Y‘ÿ*¸A•¸èCC‘å;op˜drac“h“tregel.‘L=V‘ÿ*¸o˜eg–åWdit“to˜e“aanŽ¡de–U C“heading“v‘ÿqÐan“je“grammatica:Ž¦in¸èt–U yydebug“=“1;Ž¦Dit–U zal“het“bšGestand“`y‘ÿ*¸.output'“genereren“die“de“gemaakte“to˜estandsmac¸èhine“uitlegt.Ž¦Als–£Aje“nš¸èu“de“gegenereerde“binary“draait,‘¶Êzal“het“een“*hoGop*“uitv˜oGer“gev˜en“o˜v˜er“w˜at“er“gebGeurt,‘¶Êinclusief“inŽ¡w•¸èelk“e–U tošGestand“de“to˜estandsmacš¸èhine“op“dit“momen˜t“is,“en“w˜elk˜e“tok˜ens“er“w˜orden“gelezen.Ž¦Pš¸èeter–2¯Jinks“sc˜hreef“een“pagina“op“Âdebugging“Ó¹dieŽ¡v‘ÿqÐaak›U v•¸èoGork“omende˜fouten˜en˜h“un˜oplossingen˜bGev‘ÿqÐat.ŽŸ"ÃCÁ7.1Ž‘¾De‘¸to_úestandsmac hineŽŸMª¹Inš¸ètern–^draait“je“Y‘ÿ*¸A˜CC‘Oparser“een“zogenaamde“`toGestandsmac˜hine'.‘ :Zoals“de“naam“zegt,‘îis“dit“een“mac˜hineŽ¡die–8øin“v•¸èersc“hillende–8øtoGestanden“k›ÿqÐan“v•¸èerk“eren.‘hDan–8øzijn“er“regels“die“o•¸èv“ergangen–8øv˜an“de“ene“toGestand“naar“deŽ¡andere–U bšGepalen.‘q€Alles“b˜egin¸èt“met“de“zogenaamde“`ro˜ot'“regel“die“ik“eerder“v¸èermeld“heb.Ž¦Citaat–U uit“de“uitv¸èoGer“v›ÿqÐan“y‘ÿ*¸.output“v˜an“V‘ÿ*¸o•Gorb“eeld‘U 7:ŽŸe‘Åstate‘¹N0Ž¤ Š=¡‘+å:ZONETOK‘ž†,–¹Nand“go“to“state“1Ž¡¡‘+å:$default‘å8reduce–¹Nusing“rule“1“(commands)Ž¡¡‘+å:commands‘å8go–¹Nto“state“29Ž¡‘+å:command‘ž†go–¹Nto“state“2Ž¡‘+å:zone_set‘å8go–¹Nto“state“3ŽŽŽŒ‹· Û_2 ý ~?Ÿ„€ÕÁGŽ¿7.‘ñ8Debuggen’‡Û{¹18ŽŽ ÕÁ ýV¯Standaard–³•reduceert“deze“tošGestand“met“de“`commands'“regel.‘;§Dit“is“de“v¸èo˜orno˜emde“recursiev¸èe“regel“die“`com-Ž¤ ®mands'–.&denieert“als“zijnde“opgebGouš¸èwd“uit“individuele“command“statemen˜ts,‘5ògev˜olgd“doGor“een“pun˜tk˜omma,Ž¡gev¸èolgd–U doGor“mogelijk“meer“commands.Ž©ؼDeze– tošGestand“reduceert“tot“het“iets“tegenk•¸èom“t– dat“het“b˜egrijpt,‘?in“dit“gev‘ÿqÐal“een“ZONETOK,“d.i.‘X"het“w¸èo˜ordŽ¡`zone'.‘q€Dan–U gaat“het“naar“toGestand“1,“die“het“zone“command“v¸èerder“afhandelt:ŽŸ´å‘Åstate‘¹N1Ž¤ Š=¡‘+å:zone_set– rœ->“ZONETOK–¹N.“quotedname“zonecontent‘+ê(rule“4)Ž¡¡‘+å:QUOTE‘!",–¹Nand“go“to“state“4Ž¡¡‘+å:quotedname‘ rœgo–¹Nto“state“5ŽŸؼ¹De–B^eerste“regel“heeft“een“`.'‘k?om“aan“te“gevš¸èen“w˜aar“w˜e“zijn:‘hw˜e“hebbšGen“net“een“ZONETOK‘BZgezien“en“zo˜ek¸èenŽ¤ ®nš¸èu–W³naar“een“`quotedname'.‘y:Blijkbaar“bGegin˜t“een“quotedname“met“een“QUOTE,“die“ons“naar“toGestand“4Ž¡stuurt.Ž¦Compileer–U om“dit“vš¸èerder“te“v˜olgen“V‘ÿ*¸o•Gorb“eeld–U 7“met“de“vlaggen“uit“de“paragraaf“Debuggen.ŽŸ#ÃÁ7.2Ž‘¾Conicten:‘ÿ `shift/reduce',‘¸`reduce/reduce'ŽŸMª¹Steeds–Oals“Y‘ÿ*¸Aš¸èCC‘NÒje“w˜aarsc˜h˜u˜wt“o˜v˜er“conicten,‘ƒ}kun“je“problemen“v˜erw˜ac˜h˜ten.Het“oplossen“v‘ÿqÐan“deze“conictenŽ¡sc•¸èhijn“t–ÐYiets“v‘ÿqÐan“een“kunstvš¸èorm“te“zijn“die“je“een“hoGop“o˜v˜er“je“taal“k‘ÿqÐan“leren.‘ã*Missc˜hien“meer“dan“je“wildeŽ¡w¸èeten.Ž¦De–°Šproblemen“draaien“om“de“vraag“hoGe“een“reeks“tokš¸èens“te“in˜terpreteren.‘ƒ¿Laten“w˜e“aannemen“dat“w˜e“eenŽ¡taal–U hebbšGen“die“deze“commando's“mo˜et“accepteren:Ž¤´å‘>ÊrÅverwijder–¹Nverwarming“allŽ© Š=‘>Êrverwijder–¹Nverwarming“number1ŽŸؼ¹HiertoGe–U deni€ëren“w¸èe“deze“grammatica:Ž¡‘>ÊrÅdelete_heaters:Ž¦‘d”âTOKDELETE–¹NTOKVERWARMING“modeŽ¦‘d”â{Ž¦’Š_Rdeleteheaters($3);Ž¦‘d”â}Ž¦¦‘>Êrmode:‘+êWOORDŽ¦¦‘>Êrdelete_a_heater:Ž¦‘d”âTOKDELETE–¹NTOKVERWARMING“WOORDŽ¦‘d”â{Ž¦’Š_Rdelete($3);Ž¦‘d”â}ŽŸؼ¹Je–°Ëruikt“missc¸èhien“al“mošGeilijkheden.‘:¹De“to˜estandsmac¸èhine“b˜eginš¸èt“met“het“w˜oGord“`v˜erwijder'“te“lezen,‘Ñ©en“moGetŽ¤ ®dan–Dop“basis“v‘ÿqÐan“het“vš¸èolgende“tok˜en“bGeslissen“w˜aar“naartoGe“te“gaan.‘kÍDit“v˜olgende“tok˜en“k‘ÿqÐan“een“moGde“zijn,Ž¡die–U aangeeft“hoGe“de“v•¸èerw“armingen–U te“vš¸èerwijderen,“of“de“naam“v‘ÿqÐan“een“v˜erw˜arming“die“te“v˜erwijderen“is.ŽŽŽŒ‹Á  Û_2 ý ~?Ÿ„€ÕÁGŽ¿8.‘ñ8V‘ÿ ºerder‘Õlezen’z®¹19ŽŽ ÕÁ ýV¯Het–Ô„probleem“is“dat“het“vš¸èolgende“tok˜en“in“bGeide“gev‘ÿqÐallen“een“W˜OORD–Ôcis.‘F¢Y‘ÿ*¸A˜CC“w˜eet–Ô„dus“niet“w˜at“het“moGetŽ¤ ®došGen.‘Õ;Dit–v^leidt“tot“een“`reduce/reduce'“w•¸èaarsc“h“u“wing,‘~®en–v^een“w•¸èaarsc“h“u“wing–v^dat“de“`delete_a_heater'“no˜deŽ¡no•Goit›U b“ereikt˜zal˜w¸èorden.Ž©ؼIn–`–dit“gev‘ÿqÐal“is“het“conict“gemakk¸èelijk“opgelost“(došGor“het“eerste“commando“te“herno˜emen“tot“`v¸èerwijderŽ¡v•¸èerw“armingen–Þ¹all'“of“doGor“`all'“een“apart“tokš¸èen“te“mak˜en),‘ögmaar“soms“is“het“moGeilijk˜er.‘J Het“y‘ÿ*¸.output“bGestandŽ¡dat–U gegenereerd“wš¸èordt“als“je“Y‘ÿ*¸A˜CC“de“v˜erbšGose“vlag“geeft“k‘ÿqÐan“enorm“help˜en.ŽŸ($¾8Ž‘ÁV‘þ®(erder‘G\lezenŽŸ¿:¹GNU–ôY‘ÿ*¸Aš¸èCC“(Bison)–$k˜om˜t“met“een“heel“aardig“info-bGestand“(.info)“dat“de“Y‘ÿ*¸A˜CC‘ôsyn˜tax“heel“gošGed“do˜cu-Ž¡men•¸èteert.‘aNHet›$‹v“ermeldt˜Lex˜maar˜€é€én˜k“eer,‘.Bmaar˜v“erder˜is˜het˜heel˜goGed.‘aNJe˜kun“t˜.info-bGestanden˜lezen˜metŽ¡Emacs–] of“met“het“heel“aardige“h¸èulpmiddel“`pinfo'.‘‰Het“is“ošGok“b˜esc¸èhikbaar“op“de“GNU‘]site:‘ÂBISON‘› ManualŽ¡ÃŽ¦¹Flex›Ð>k•¸èom“t˜met˜een˜goGede˜manpage˜die˜erg˜n“uttig˜is˜als˜je˜al˜een˜ru“w˜bGegrip˜hebt˜v‘ÿqÐan˜w“at˜Flex˜doGet.‘âÛHetŽ¡ÂFlex‘“°Manual–U Ó¹is“oGok“online.Ž¦Na–¾Üdeze“inleiding“tot“Lex“en“Y‘ÿ*¸A•¸èCC‘¾Ák“om–¾Üje“er“misscš¸èhien“ac˜h˜ter“dat“je“meer“informatie“noGdig“hebt.‘®´Ik“hebŽ¡deze›U b•Go“ek•¸èen˜nog˜niet˜gelezen,˜maar˜ze˜klink“en˜goGed:ŽŸ¿Bison-The–ÕY‘ÿ ºacc-Compatible“P®>arser“GeneratorŽŽŽ©øI‘¹v‘ÿqÐan–‡bCharles“Donnelly“and“Ric¸èhard“Stallman.‘EEen“ÂA¾˜mazon“Ö•J¹gebruikš¸èer“v˜ond“hetŽ¡‘n¸èuttig.ŽŸKÄ¿Lex–Õ&“Y‘ÿ ºA®>CCŽŽŽ¦‘¹V›ÿ*¸an–+kJohn“R.“Levine,‘3ÃT˜onš¸èy“Mason“and“Doug“Bro˜wn.‘c™W‘ÿ*¸ordt“bGesc˜hou˜wd“als“het“standaardw˜erk“o˜v˜er“ditŽ¡‘onderw¸èerp,‘[ýmaar–Zžis“een“bGeetje“gedateerd.‘ùBesprekingen“op“ÂA¾˜mazon“ÃŽŸKÄ¿Compilers–Õ:‘ Principles,“T›ÿ ºec®>hniques,“and“T˜oQÂolsŽŽŽ¦‘¹V‘ÿ*¸an–ôFAlfred“V.“Aho,›\Ra¸èvi“Sethi,˜Jerey“D.“Ullman.› NòHet“'Dragon“BoGok'.˜Uit“1985“en“ze“blijv¸èenŽ¡‘het–Ð5maar“herdrukk•¸èen.‘â¿Besc“hou“wd–Ð5als“het“standaardwš¸èerk“o˜v˜er“compiler“constructie.‘â¿ÂA¾˜mazon“ÃŽŸKĹThomas–•BNiemann“scš¸èhreef“een“doGcumen˜t“o˜v˜er“het“sc˜hrijv˜en“v‘ÿqÐan“compilers“en“calculators“met“Lex“&“Y‘ÿ*¸A˜CC.Ž¡Je–U vindt“het“Âhier“ÃŽ©ؼ¹De–ÒgemošGdereerde“usenet“nieu¸èwsgro˜ep“comp.compilers“k‘ÿqÐan“o˜ok“help˜en“maar“hou“in“gedac•¸èh“ten–Òdat“de“mensenŽ¡daar–tgeen“tošGegewijde“parser“help˜desk“zijn!‘ð}Lees“v¸èo˜or“je“p˜ost“hš¸èun“in˜teressan˜te“Âp‘ÿ}/agina“ÖSn¹en“v¸èoGoral“de“ÂF‘þú_A¾˜Q›S-Ó¹Lex“-“A˜Lexical“Analyzer“GeneratorŽ¡v›ÿqÐan–ÁÔM.“E.“Lesk“and“E.“Sc¸èhmidt“is“een“v˜an“de“originele“naslagw•¸èerk“en.‘·›Je–ÁÔvindt“het“Âhier“ÃŽ¦¹Y–ÿ*¸A¸èCC:›‡yY“et˜Another˜Compiler-Compiler˜doGor˜Stephen˜C.˜Johnson˜is˜een˜v‘ÿqÐan˜de˜originele˜naslagw•¸èerk“en.‘‹JeŽ¡vindt–Êòhet“Âhier“Ó¹Het“bGev‘ÿqÐat“nš¸èuttige“w˜enk˜en“o˜v˜erŽ¡stijl.ŽŸ($¾9Ž‘ÁDank‘G\aanŽŸÞÇ‘¸ŽŽŽ‘¹P¸èete–U Jinks“µ<¹p‘Ž0jj%cs.man.ac.ukµ>ŽŽŽŒ‹ʼ Û_2 ý ~?Ÿ„€ÕÁGŽ¿9.‘ñ8Dank‘Õaan’‰&¹20ŽŽ ÕÁ ýV¯‘¸ŽŽŽ‘¹Chris–U Lattner“µ<¹sabre%nondot.orgµ>Ž¤®‘¸ŽŽŽ‘¹John–U W.“Milla•¸èw“a“y‘U µ<¹johnmilla“w“a“y%y“ahoGo.comµ>Ž¡‘¸ŽŽŽ‘¹Martin–U Neitzel“µ<¹neitzel%gaertner.deµ>Ž¡‘¸ŽŽŽ‘¹Esmond–U Pitt“µ<¹esmond.pitt%bigpGond.comµ>Ž¡‘¸ŽŽŽ‘¹Eric–U S.“Ra¸èymondŽ¡‘¸ŽŽŽ‘¹Bob–U Scš¸èhmertz“µ<¹sc˜hmertz%w˜am.umd.eduµ>Ž¡‘¸ŽŽŽ‘¹A•¸èdam›U Sulmic“ki˜µ<¹adam%cfar.umd.eduµ>Ž¡‘¸ŽŽŽ‘¹Markus–U T‘ÿ*¸risk›ÿqÐa“µ<¹trisk˜a%gmx.atµ>Ž¡‘¸ŽŽŽ‘¹Erik–U V‘ÿ*¸erbruggen“µ<¹erik%road-w¸èarrior.cs.kun.nlµ>Ž¡‘¸ŽŽŽ‘¹Gary–V.“V‘ÿ*¸aughan“µ<¹gary%gnš¸èu.orgµ>“¹(lees“zijn“uitstek˜ende“ÂA¾˜utob–ÿ}/o“ok‘ù)Ž¡‘¸ŽŽŽ‘ÂIvo–“°van“der“Wijk–U Ó¹(“ÂA¾˜maze‘“°Internet“ù)ŽŽŽŒøÙ»ƒ’À;èÛ_2ÕÁGó5ùž" cmmi9óqLË ectt0900óqLË ectt1000ó½HЃ ecti1000ó¥!¢N ecbx1200ó]fŒ ecbx1000ó&Lt$ffffecbx1440óŒ6 ecss1000óþÖëI½q½qecss2074ó 1ê± ecrm1000ó !",š cmsy10ó  b> cmmi10ù݉ßßßßßßß