lex-yacc.dvi0000770000000000000560000027733411264757766012530 0ustar rootplugdev÷ƒ’À;è TeX output 2009.10.13:0319‹ÿÿÿÿò«! /DvipsToPDF { 72.27 mul Resolution div } def /PDFToDvips { 72.27 div Resolution mul } def /HyperBorder { 1 PDFToDvips } def /H.V {pdf@hoff pdf@voff null} def /H.B {/Rect[pdf@llx pdf@lly pdf@urx pdf@ury]} def /H.S { currentpoint HyperBorder add /pdf@lly exch def dup DvipsToPDF /pdf@hoff exch def HyperBorder sub /pdf@llx exch def } def /H.L { 2 sub dup /HyperBasePt exch def PDFToDvips /HyperBaseDvips exch def currentpoint HyperBaseDvips sub /pdf@ury exch def /pdf@urx exch def } def /H.A { H.L currentpoint exch pop vsize 72 sub exch DvipsToPDF HyperBasePt sub sub /pdf@voff exch def } def /H.R { currentpoint HyperBorder sub /pdf@ury exch def HyperBorder add /pdf@urx exch def currentpoint exch pop vsize 72 sub exch DvipsToPDF sub /pdf@voff exch def } def systemdict /pdfmark known { userdict /?pdfmark systemdict /exec get put }{ userdict /?pdfmark systemdict /pop get put userdict /pdfmark systemdict /cleartomark get put } ifelse ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endï˜ps:SDict begin [ /Producer (dvips + Distiller) /Title () /Subject () /Creator (LaTeX with hyperref package) /Author () /Keywords () /DOCINFO pdfmark end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïJps:SDict begin [ /View [/XYZ H.V] /Dest (page.1) cvn H.B /DEST pdfmark endï color popŽ’ÕÁGï color popŽŽ £n ý~.\ïWps:SDict begin [ /Count -3 /Dest (section.1) cvn /Title (Introduzione) /OUT pdfmark endïnps:SDict begin [ /Count -0 /Dest (subsection.1.1) cvn /Title (Cosa NON \350 questo documento) /OUT pdfmark endïcps:SDict begin [ /Count -0 /Dest (subsection.1.2) cvn /Title (Scaricare materiale) /OUT pdfmark endïWps:SDict begin [ /Count -0 /Dest (subsection.1.3) cvn /Title (Licenza) /OUT pdfmark endïops:SDict begin [ /Count -1 /Dest (section.2) cvn /Title (Cosa Lex e YACC possono fare per voi) /OUT pdfmark endï~ps:SDict begin [ /Count -0 /Dest (subsection.2.1) cvn /Title (Che cosa fa ognuno dei programmi, di per s\351) /OUT pdfmark endïNps:SDict begin [ /Count -3 /Dest (section.3) cvn /Title (Lex) /OUT pdfmark endïvps:SDict begin [ /Count -0 /Dest (subsection.3.1) cvn /Title (Espressioni regolari in corrispondenze) /OUT pdfmark endïps:SDict begin [ /Count -0 /Dest (subsection.3.2) cvn /Title (Un esempio pi\371 complicato con sintassi simile a quella del C) /OUT pdfmark endïfps:SDict begin [ /Count -0 /Dest (subsection.3.3) cvn /Title (Che cosa si \350 visto) /OUT pdfmark endïOps:SDict begin [ /Count -3 /Dest (section.4) cvn /Title (YACC) /OUT pdfmark endïrps:SDict begin [ /Count -2 /Dest (subsection.4.1) cvn /Title (Un semplice controllo termostatico) /OUT pdfmark endïjps:SDict begin [ /Count -0 /Dest (subsubsection.4.1.1) cvn /Title (Un file YACC completo) /OUT pdfmark endï„ps:SDict begin [ /Count -0 /Dest (subsubsection.4.1.2) cvn /Title (Compilare ed eseguire il controllo termostatico) /OUT pdfmark endï‚ps:SDict begin [ /Count -0 /Dest (subsection.4.2) cvn /Title (Miglioramento del termostato per gestire parametri) /OUT pdfmark endïtps:SDict begin [ /Count -0 /Dest (subsection.4.3) cvn /Title (Analizzare un file di configurazione) /OUT pdfmark endïfps:SDict begin [ /Count -0 /Dest (section.5) cvn /Title (Fare un analizzatore in C++) /OUT pdfmark endïpps:SDict begin [ /Count -3 /Dest (section.6) cvn /Title (Come lavorano internamente Lex e YACC) /OUT pdfmark endïtps:SDict begin [ /Count -0 /Dest (subsection.6.1) cvn /Title (Valori di categoria \(Token values\)) /OUT pdfmark endïˆps:SDict begin [ /Count -0 /Dest (subsection.6.2) cvn /Title (Ricorsione: 'a destra \350 sbagliata' \(right is wrong\)) /OUT pdfmark endïjps:SDict begin [ /Count -0 /Dest (subsection.6.3) cvn /Title (Advanced yylval: \045union) /OUT pdfmark endïTps:SDict begin [ /Count -2 /Dest (section.7) cvn /Title (Debugging) /OUT pdfmark endïgps:SDict begin [ /Count -0 /Dest (subsection.7.1) cvn /Title (La macchina degli stati) /OUT pdfmark endï{ps:SDict begin [ /Count -0 /Dest (subsection.7.2) cvn /Title (Conflitti: 'sposta/riduci', 'riduci/riduci') /OUT pdfmark endï\ps:SDict begin [ /Count -0 /Dest (section.8) cvn /Title (Ulteriori letture) /OUT pdfmark endïjps:SDict begin [ /Count -0 /Dest (section.9) cvn /Title (Riconoscimenti e ringraziamenti) /OUT pdfmark endïSps:SDict begin [ /Page 1 /View [ /Fit ] /PageMode /UseOutlines /DOCVIEW pdfmark endï1ps:SDict begin [ {Catalog} << >> /PUT pdfmark endïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [ /View [/XYZ H.V] /Dest (Doc-Start) cvn H.B /DEST pdfmark endïpapersize=8.5in,11inŸ†áóþÖëI½q½qecss2074»Intro‘ˆ’duzione/HO›ÿwmWTO–fÑa“Lex“e“Y‘þfKA˜CCŽ¤ ®„ØcÕÁGŽŽ¡ó 1ê± ecrm1000¹P•¸èo“w“erDNS–U BV“(bšGert“h¸èub˜ert“ó  b> cmmi10µ<¹b˜ert@p˜o•¸èw“erdns.comµ>¹)Ž¡v0.8–U $Date:‘q€2004/09/20“07:14:23“$Ž¡Ÿ&°óŒ6 ecss1000¼Questo–¼¦doGcumento“cerca“di“aiutaš¸ère“chi“inizia“a“usa˜re“Lex“e“Y‘ÿ*¸A˜CC.“T‘ÿ*¸raduzione“a“cura“di“Ivan“Bazzi,‘Ö‡revisione“aŽ¡cura–ÁÚdi“Antonio›ÁÙColombGo.‘·®P¸èer“versioni˜aggio¸èrnate“di“questo“došGcumento,‘Ýe“p˜er“trova¸ère‘ÁÙaltra“do˜cumentazione“inŽ¡italiano–U sul“soft•¸èw“a“re–U libGero,“visita¸ère“il“sito“dell'“óø8‹ ecsi1000½ILDP“ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1óqLË ectt1000¾http://it.ildp.orgï color popŽ‘^zŸù¨ïps:SDict begin H.R endŽ‘^zïps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://it.ildp.org) >> /Subtype /Link H.B /ANN pdfmark endï color popŽŸ(Àœó&Lt$ffffecbx1440ÀIndiceŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïNps:SDict begin [ /View [/XYZ H.V] /Dest (section*.1) cvn H.B /DEST pdfmark endŸñžïcolor push rgb 0 0 1ïps:SDict begin H.S endó]fŒ ecbx1000Á1Ž‘ÿIn®>troQÂduzioneïps:SDict begin 13.68 H.L endïops:SDict begin [ /Subtype /Link /Dest (section.1) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’У2ŽŽ¤ؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹1.1Ž‘þ‘Cosa–U NON“€è“questo“doGcumen¸ètoïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.1.1) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’²ÞØ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black2Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.2Ž‘þ‘Scaricare‘U materialeïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.1.2) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ‘|n€‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black2Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.3Ž‘þ‘Licenzaïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.1.3) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ‘MÅ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black3Ž‘wŸï color popŽ©Øïcolor push rgb 0 0 1ïps:SDict begin H.S endÁ2Ž‘ÿCosa–ÕLex“e“Y‘ÿ ºA®>CC“pšQÂossono“fare“p˜er“v®>oiïps:SDict begin 13.68 H.L endïops:SDict begin [ /Subtype /Link /Dest (section.2) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’У3ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹2.1Ž‘þ‘Che–U cosa“fa“ogn¸èuno“dei“programmi,“di“pGer“s€éïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.2.1) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’ñ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black3Ž‘wŸï color popŽ¦ïcolor push rgb 0 0 1ïps:SDict begin H.S endÁ3Ž‘ÿLexïps:SDict begin 13.68 H.L endïops:SDict begin [ /Subtype /Link /Dest (section.3) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’У3ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹3.1Ž‘þ‘Espressioni–U regolari“in“corrispGondenzeïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.3.1) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’Ñúx‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black4Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end3.2Ž‘þ‘Un–U esempio“pi€ù“complicato“con“sin¸ètassi“simile“a“quella“del“Cïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.3.2) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’/MX‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black5Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end3.3Ž‘þ‘Che–U cosa“si“€è“vistoïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.3.3) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ‘|n€‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black6Ž‘wŸï color popŽ¦ïcolor push rgb 0 0 1ïps:SDict begin H.S endÁ4Ž‘ÿY‘ÿ ºA®>CCïps:SDict begin 13.68 H.L endïops:SDict begin [ /Subtype /Link /Dest (section.4) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’У7ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹4.1Ž‘þ‘Un–U semplice“con¸ètrollo“termostaticoïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.4.1) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’Âl¨‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black7Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.1.1Ž‘ýþUn–U le“Y‘ÿ*¸A¸èCC“completoïps:SDict begin 13.68 H.L endïyps:SDict begin [ /Subtype /Link /Dest (subsubsection.4.1.1) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’²ÞØ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black8Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.1.2Ž‘ýþCompilare–U ed“eseguire“il“con¸ètrollo“termostaticoïps:SDict begin 13.68 H.L endïyps:SDict begin [ /Subtype /Link /Dest (subsubsection.4.1.2) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’ø ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.2Ž‘þ‘Miglioramen¸èto–U del“termostato“pGer“gestire“parametriïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.4.2) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’jБü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black10Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3Ž‘þ‘Analizzare–U un“le“di“congurazioneïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.4.3) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’Âl¨‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popŽ¦ïcolor push rgb 0 0 1ïps:SDict begin H.S endÁ5Ž‘ÿF‘ÿ ºare–Õun“analizzatore“in“C++ïps:SDict begin 13.68 H.L endïops:SDict begin [ /Subtype /Link /Dest (section.5) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’ÊAÿ14ŽŽ¦ïcolor push rgb 0 0 1ïps:SDict begin H.S end6Ž‘ÿCome›Õla•®>v“orano˜in“ternamen“te˜Lex˜e˜Y‘ÿ ºA“CCïps:SDict begin 13.68 H.L endïops:SDict begin [ /Subtype /Link /Dest (section.6) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’ÊAÿ15ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹6.1Ž‘þ‘V›ÿ*¸alori–U di“categoria“(T˜ok¸èen“v‘ÿqÐalues)ïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.6.1) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’º¥À‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end6.2Ž‘þ‘Ricorsione:‘q€'a–U destra“€è“sbagliata'“(righ¸èt“is“wrong)ïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.6.2) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’£è‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black17Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end6.3Ž‘þ‘A¸èdv–ÿqÐanced‘U yylv“al:‘q€%unionïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.6.3) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’›Š ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black18Ž‘wŸï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹*ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïJps:SDict begin [ /View [/XYZ H.V] /Dest (page.2) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ1.‘ñ8In®>troQÂduzione’~¯œ¹2Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push rgb 0 0 1ïps:SDict begin H.S endÁ7Ž‘ÿDebuggingïps:SDict begin 13.68 H.L endïops:SDict begin [ /Subtype /Link /Dest (section.7) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’ÊAÿ19ŽŽ¤ؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹7.1Ž‘þ‘La–U macc¸èhina“degli“statiïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.7.1) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’“Ã8‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black20Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.2Ž‘þ‘Conitti:‘q€'spGosta/riduci',‘U 'riduci/riduci'ïps:SDict begin 13.68 H.L endïtps:SDict begin [ /Subtype /Link /Dest (subsection.7.2) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’ÙÁ`‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¤Øïcolor push rgb 0 0 1ïps:SDict begin H.S endÁ8Ž‘ÿUlteriori‘Õlettureïps:SDict begin 13.68 H.L endïops:SDict begin [ /Subtype /Link /Dest (section.8) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’ÊAÿ21ŽŽ¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end9Ž‘ÿRiconoscimenš®>ti–Õe“ringraziamen˜tiïps:SDict begin 13.68 H.L endïops:SDict begin [ /Subtype /Link /Dest (section.9) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark endï color popŽ’ÊAÿ22ŽŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [ /View [/XYZ H.V] /Dest (section.1) cvn H.B /DEST pdfmark endŸ¾À1Ž‘ÁInctropœduzioneŽŸ¿:¹Ben•¸èv“en“uto,›U gen“tile˜lettore.Ž©ؼSe›{a•¸èv“ete–zgi€à˜programmato,‘0Qalmeno“un˜pGo',‘0Qin“am•¸èbien“te˜UNIX,‘za“vrete˜incon“trato–zi˜mistici“programmi˜LexŽ¤ ®&–‡Y‘ÿ*¸Aš¸èCC,“o“come‘‡sono“conosciuti“dagli“uten˜ti“di“GNU/Lin˜ux“di“tutto‘‡il“mondo,›“yFlex“&“Bison,˜do•¸èv“e–‡Flex“€èŽ¡un'implemenš¸ètazione–Ždi“Lex“di“V‘ÿ*¸ern‘P˜axson“e“Bison“la“v˜ersione“GNU‘|di“Y‘ÿ*¸A˜CC.“Questi“programmi“sarannoŽ¡cš¸èhiamati–¹³d'ora“in“pGoi“Lex“e“Y‘ÿ*¸A˜CC‘¹™-“le“n˜uo˜v˜e“v˜ersioni“sono“compatibili“con‘¹²le“v˜ecc˜hie,‘ÒØquindi“Flex“e“BisonŽ¡pšGossono–U essere“usati“p˜er“pro¸èv‘ÿqÐare“gli“esempi“qui“forniti.Ž¦Questi–¡cprogrammi›¡bsono“immensamen¸ète“utili,‘´sma“come˜pGer“il˜compilatore“C,“la˜loro“pagina“di˜man¸èuale“nonŽ¡spiega–ãil“linguaggio“da›ãusare“con“loro,‘ùìe“neppure“come“usarli.‘K€Y‘ÿ*¸A•¸èCC‘ã€è˜realmen“te›ãimpressionan“te˜se˜utilizzatoŽ¡in–rÅcom¸èbinazione“con“Lex,›z.ci€ò“non‘rÄdi“meno,˜la“pagina“di“manš¸èuale“di“Bison“non“dice‘rÄcome“in˜tegrare“il“coGdiceŽ¡generato–U da“Lex“con“Bison.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.1) cvn H.B /DEST pdfmark endŸ.Âó¥!¢N ecbx1200Ã1.1Ž‘¾Cosa–¸NON“€è“questo“do_úcumen toŽŸMª¹Ci–×%sono›×$parecc¸èhi“libri˜bGen“fatti˜c¸èhe“trattano“di˜Lex“&˜Y‘ÿ*¸Aš¸èCC.“Siete“in˜vitati›×$a“leggerli˜se“vi˜servissero“maggioriŽ¡informazioni.‘PÉConš¸ètengono–J8molte“pi$ugra˜v˜e;‘ÄÄinformazioni“di“quelle‘J9c˜he“si“pGossono“tro˜v‘ÿqÐare“qua.‘PÉV‘ÿ*¸edere“laŽ¡sezione–î¼'Letture›î»ulteriori'“in“fondo“a˜questo“došGcumen¸èto.‘>SQuesto“do˜cumen¸èto‘î»ha“lo“scop˜o“di‘î»p˜ermettervi“diŽ¡iniziare–U a“usare“Lex“&“Y‘ÿ*¸A¸èCC“in“mošGdo“da“p˜ermettervi“di“creare“i“v¸èostri“primi“programmi.Ž¦La–WždoGcumenš¸ètazione“fornita“insieme“a“Flex“e“BISON‘W€è“eccellen˜te“ma“non“€è“un“tutorial.‘xúCom˜unque“completaŽ¡molto–U bGene“il“mio“HOš¸èWTO.“P˜otete“tro˜v‘ÿqÐare“i“riferimen˜ti“ad“essa,“sempre“alla“ne“di“questo“doGcumen˜to.Ž¦Non–„‡sono“pšGer‘„†n¸èulla“un“esp˜erto“di›„†Y‘ÿ*¸A¸èCC/Lex.‘+øAll'inizio“della“stesura“di˜questo“doGcumen•¸èto,‘®?a“v“ev“o‘„‡esattamen“teŽ¡due–U giorni“di“espGerienza.‘q€Il“mio“solo“obiettivš¸èo“€è“quello“di“rendere“pi$ugra˜v˜e;“facili“a“v˜oi“quei“due“giorni.Ž¦Non–å×ci“si“aspGetti‘åØneppure“cš¸èhe“l'HO˜WTO‘åppGossieda“un“buono“stile“Y‘ÿ*¸A˜CC‘åpe“Lex.‘ #¦Gli“esempi“sono“statiŽ¡man•¸èten“uti–1¼il“pi$ugra•¸èv“e;‘=‰pšGossibile–1¼semplici“e“ci“p˜ossono‘1½essere“maniere“migliori“p˜er“scriv¸èerli.‘eµSe“ne“conoscete,Ž¡siete–U pregati“di“com¸èunicarmelo.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.2) cvn H.B /DEST pdfmark endŸ.ÂÃ1.2Ž‘¾Scaricare‘¸materialeŽŸMª¹Si–Kªnoti›K©c¸èhe“€è“pGossibile˜scaricare“tutti“gli“esempi˜qui“mostrati“[quelli˜originali“in“inglese],‘MŽc¸èhe“sono˜in“formatoŽ¡leggibile–™¦dalle‘™§maccš¸èhine.‘?Si“v˜eda›™§la“ó½HЃ ecti1000Ähomep‘ÿ}/age˜ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://ds9a.nl/lex-‘€yaccï color popŽ‘y8tŸù¨ïps:SDict begin H.R endŽ‘y8tï”ps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://ds9a.nl/lex-yacc) >> /Subtype /Link H.B /ANN pdfmark endï color pop“¹pGer˜i“dettagli.‘?Gli˜esempi“inŽ¡italiano–U tradotti“in“italiano“si“pGossono“scaricare“dal“sitoŽ¦ÄILDP–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾esempi-–€lex-“yaccï color popŽ‘O»Ÿùãðïps:SDict begin H.R endŽ‘O»ïŒps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (esempi-lex-yacc) >> /Subtype /Link H.B /ANN pdfmark endï color pop“¹.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹Cïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïJps:SDict begin [ /View [/XYZ H.V] /Dest (page.3) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ2.‘ñ8Cosa–ÕLex“e“Y‘ÿ ºA®>CC“pšQÂossono“fare“p˜er“v®>oi’ù¶Û¹3Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.1.3) cvn H.B /DEST pdfmark endŸ Ã1.3Ž‘¾LicenzaŽ©Mª¹Cop•¸èyrigh“t–Ž(c)›2001“b•Gert˜h¸èub“ert.‘»ÉQuesto–Žmateriale˜pu€ò“essere˜distribuito“solo“en¸ètro˜i“termini˜e“condizioniŽ¤ ®en¸èunciate–JŽ¡‘%}Ž¡¡‘%%Ž¡‘stop‘å8printf("Ricevuto–¹Ncomando“Stop\n");Ž¡‘start‘+êprintf("Ricevuto–¹Ncomando“Start\n");Ž¡‘%%ŽŸؼ¹La–prima“sezione›tra“la“coppia“%ó !",š cmsy10¸f˜¹e“%¸g“¹€è“inclusa“direttamen¸ète˜nell'output“del“programma.‘Ãm€È‘çnecessarioŽ¤ ®inserirla–U pGercš¸èh€é“in“seguito“si“usa“prin˜tf“il“quale“€è“denito“in“stdio.h.Ž©ؼLe–×ÿsezioni“si“separano›×þusando“'%%',‘ñquindi“la˜prima“linea“della“seconda“sezione“comincia˜con“la“c•¸èhia“v“e‘×ÿ'stop'.Ž¡Ogni–£vš¸èolta“c˜he‘£viene“incon˜trata“in“input“la“c˜hia˜v˜e›£'stop'“viene“eseguito“il“resto“della˜linea“(una“c¸èhiamata“aŽ¡prin¸ètf()).Ž¦Oltre–U a“'stop',“si“€è“denita“ancš¸èhe“'start',“il“cui“compGortamen˜to“€è“analogo“a“quello“di“'stop'.Ž¦La–U sezione“di“coGdice“termina“ancora“con“'%%'.Ž¦P¸èer–U compilare“Esempio“1,“fare“questo:ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹]ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïJps:SDict begin [ /View [/XYZ H.V] /Dest (page.4) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ3.‘ñ8Lex’¬ž„¹4Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Ælex‘¹Nesempio1.lŽŸ Š=‘cc–¹Nlex.yy.c“-o“esempio1“-llŽ©ؼïcolor push Black‘ï color popŽŽ‘NOTA:–¹Nse“si“sta“usando“flex,“invece“che“lex,“€è“probabile“sia“necessario“cambiare“'-ll'Ž¤ ®‘in–¹N'-lfl'“negli“script“di“compilazione.‘ rœIn“RedHat“6.x“e“SuSE“€è“necessario“questoŽ¡‘cambiamento–¹Nanche“se“si“invoca“'flex'“come“'lex'!Ž¦¹Ci€ò–Ô²genera“il“le“'esempio1'.›ð6Se“lo“si“esegue,‘ô—attender€à“la“scrittura“in“input“di“qualc¸èhe“carattere.˜QuandoŽ¡viene–^ˆinserito“in“input“qualcosa“cš¸èhe“non“corrispGonde“a‘^‡nessuna“delle“c˜hia˜vi“denite“(cioG€è“'stop'“e“'start')Ž¡esso–ÐXviene“scritto“in“output“n•¸èuo“v‘ÿqÐamen“te.‘ã(Se‘ÐWv“enisse–ÐXimmesso“'stop'“v¸èerrebbGe“stampato“in“uscita“'RicevutoŽ¡comando‘U stop';Ž¤ؼChiudere–U il“programma“con“un“EOF“(D)“[CONTR¸èOL-d].Ž¡Ci–åsi“p•Gotrebb“e‘æcš¸èhiedere–åcome“mai“il“programma“funzioni,‘$%visto“c˜he“non“€è“stata“denita‘æuna“funzione“main().Ž¤ ®Questa–®`funzione“viene‘®adenita“implicitamenš¸ète“pGer“v˜oi“in‘®alibl“(liblex)“c˜he“€è“stata‘®ainclusa“nella“compilazioneŽ¡con–U l'opzione“-ll.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.3.1) cvn H.B /DEST pdfmark endŸ.ÂÃ3.1Ž‘¾Espressioni–¸regolari“in“corrisp_úondenzeŽŸMª¹Questo–¸”esempio“non“€è“particolarmenš¸ète‘¸“utile“in“s€é“stesso,‘Ñqe“neppure“il“prossimo.‘›ÛCom˜unque“mostrer€à“comeŽ¡usare–U le“espressioni“regolari“in“Lex“c¸èhe“risulteranno“essere“molto“utili“in“seguito.Ž©ؼEsempio‘U 2:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ%{Ž¤ Š=‘#include‘¹NŽ¡‘%}Ž¡¡‘%%Ž¡‘[0123456789]+‘3öZprintf("NUMERO\n");Ž¡‘[a-zA-Z][a-zA-Z0-9]*‘å8printf("PAROLA\n");Ž¡‘%%ŽŸؼ¹Questo–ø]le›ø\Lex“descriv¸èe˜due“tipi˜di“corrispGondenze˜(categorie):‘·ùdi“tipGo˜P‘ÿ*¸AR¸èOLA‘ø3e˜di“tipGo˜NUMER¸èO.“LeŽ¤ ®espressioni–1Sregolari›1RpGossono“essere“scoraggian¸èti,‘h_ma“con˜un“piccolo˜sforzo“€è“facile˜capirle.‘Esaminiamo“laŽ¡comš¸èbinazione–U del“tipGo“NUMER˜O:Ž¦[0123456789]+Ž¦Questo–Á§dice:‘'Äuna“sequenza›Á¨di“uno˜o“pi€ù“caratteri˜fra“quelli“del˜gruppGo“0123456789.‘@XA‘þã vremmo˜pGotuto“scriv¸èerliŽ¡in–U maniera“pi€ù“brev¸èe:Ž¦[0-9]+Ž¦Ora,–U la“comš¸èbinazione“del“tipGo“P‘ÿ*¸AR˜OLA“€è“in“qualc˜he“moGdo“pi€ù“complicata:Ž¦[a-zA-Z][a-zA-Z0-9]*Ž¦La–nTprima›nUparte“corrispGonde“a˜1“e“1˜solo“carattere“compreso˜tra“'a'“e“'z',‘t¢o“tra˜'A'‘nMe˜'Z'.“In“altre˜parole,‘t¡unaŽ¡lettera.‘HªQuesta–Úžlettera›Úiniziale“dev¸èe˜pGoi˜essere“seguita˜da“zero˜o“pi€ù˜caratteri“c¸èhe˜pGossono“essere˜o“una˜letteraŽ¡o‘¬una›¬cifra.‘9"P•¸èerc“h€é˜usare–¬qui˜un“asterisco?‘9#Il“'+'“signica˜1“o˜pi€ù“corrispšGondenze,‘ÍÙma“una“P‘ÿ*¸AR¸èOLA‘«Üp˜otrebb˜eŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹lAïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïJps:SDict begin [ /View [/XYZ H.V] /Dest (page.5) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ3.‘ñ8Lex’¬ž„¹5Ž’ÕÁGï color popŽŽ £n ýˆ.\consistere–¿ábGenissimo“di“un›¿âsolo“carattere,‘ݺc¸èhe“€è“gi€à˜stato“considerato.‘?ÀQuindi“la˜seconda“parte“p•Gotrebb“e‘¿áa•¸èv“ereŽ¤ ®zero–U corrispšGondenze,“ed“€è“p˜er“questo“cš¸èhe“si“scriv˜e“un“'*'.Ž©ؼIn›¯Óquesto–¯ÒmoGdo,‘Æ€si“€è˜imitato˜il“compGortamen¸èto˜di“molti˜linguaggi˜di“programmazione˜c•¸èhe˜ric“hiedono‘¯Òc“he˜ilŽ¡nome–½di“una“v‘ÿqÐariabile“*debba*“cominciare“con“una“lettera,‘ma“p•Gossa‘¾p“oi–½conš¸ètenere“anc˜he“delle“cifre.‘V_In“altreŽ¡parole,–U 'tempšGeratura1'“€è“un“nome“v‘ÿqÐalido,“ma“'1temp˜eratura'“non“lo“€è.Ž¦Si–Œcerc¸èhi›‹di“compilare˜Esempio“2,‘*Callo˜stesso“moGdo“di˜Esempio“1,‘*Ce˜si“inserisca“del˜testo.‘_¤Ecco“un˜esempio“diŽ¡sessione:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ$‘¹N./esempio2Ž¤ Š=‘fooŽ¡‘PAROLAŽ¡¡‘barŽ¡‘PAROLAŽ¡¡‘123Ž¡‘NUMEROŽ¡¡‘bar123Ž¡‘PAROLAŽ¡¡‘123barŽ¡‘NUMEROŽ¡‘PAROLAŽŸؼ¹Ci–bFsi‘bGpu€ò“cš¸èhiedere“da“do˜v˜e‘bGv˜engano“tutti“questi“spazi‘bGbianc˜hi“nell'output.‘˜óLa“ragione“€è“semplice:‘‹ÍeranoŽ¤ ®nell'input,‘pe–ªúnon“si›ªù€è“stabilita“alcuna“corrisp•Gondenza˜p“er–ªúessi“in“nessun˜luogo,‘qquindi˜v¸èengono“restituitiŽ¡ancora–U (come“sono).Ž¦La–7manpage›8di“Flex˜descriv¸èe“le˜sue“espressioni˜regolari“in˜dettaglio.‘[ˆSono“in˜molti“a˜ritenere“c¸èhe˜la“manpageŽ¡delle–Õ×espressioni“regolari“di“p•Gerl›ÕÖ(p“erlre)–Õ×sia“molto“utile,‘öanc¸èhe“se“Flex“non˜implemenš¸èta“tutto“quello“c˜he“siŽ¡pu€ò–U fare“con“pGerl.Ž¦Si–|œdevš¸èe“stare‘|atten˜ti“a“non“creare“corrispGondenze›|di“lunghezza“zero“come“'[0-9]*'˜-“altrimen¸èti“l'AnalizzatoreŽ¡lessicale›U p•Gotrebb“e˜andare˜in˜confusione˜cominciando˜a˜riconoscere˜rip“etutamen¸ète˜stringhe˜vuote.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.3.2) cvn H.B /DEST pdfmark endŸ.ÂÃ3.2Ž‘¾Un–¸esempio“pi€ù“complicato“con“sin tassi“simile“a“quella“del“CŽŸMª¹Mettiamo–U si“v¸èoglia“analizzare“un“le“di“questo“tipGo:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Ælogging‘¹N{Ž¤ Š=‘>Êrcategory–¹Nlame-servers“{“null;“};Ž¡‘>Êrcategory–¹Ncname“{“null;“};Ž¡‘};Ž¡¡‘zone–¹N"."“{Ž¡‘>Êrtype‘¹Nhint;Ž¡‘>Êrfile‘¹N"/etc/bind/db.root";Ž¡‘};ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹zïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïJps:SDict begin [ /View [/XYZ H.V] /Dest (page.6) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ3.‘ñ8Lex’¬ž„¹6Ž’ÕÁGï color popŽŽ £n ýˆ.\Si–U vš¸èedono“c˜hiaramen˜te“delle“categorie“(tok˜en)“in“questo“le:Ž©Y ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹P‘ÿ*¸ARš¸èOLA,–U tipGo“'zone'“e“'t˜ypGe'ŽŸn;ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹NOMEFILE,–U tipšGo“'/etc/bind/db.ro˜ot'Ž¤n<ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹DOPPOš¸èAPICE,–U come“quelli“c˜he“circondano“il“nome“del“leŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹APER–ÿ*¸T“A¸èGRAFF‘þã A,‘U ¸fŽ¡ïcolor push Black‘Ž‘ï color popŽŽ‘¹CHIUSA¸èGRAFF‘þã A,‘U ¸gŽ¡ïcolor push Black‘Ž‘ï color popŽŽ‘¹PUNTOEVIR¸èGOLA,‘U ;ŽŸY Il–U le“corrispšGonden¸ète“p˜er“Lex“€è“Esempio“3:ŽŸ55ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ%{Ž¤ Š=‘#include‘¹NŽ¡‘%}Ž¡¡‘%%Ž¡‘[a-zA-Z][a-zA-Z0-9]*‘å8printf("PAROLA‘¹N");Ž¡‘[a-zA-Z0-9\/.-]+‘%Êpprintf("NOMEFILE‘¹N");Ž¡‘\"‘gì´printf("DOPPIOAPICE‘¹N");Ž¡‘\{‘gì´printf("APERTAGRAFFA‘¹N");Ž¡‘\}‘gì´printf("CHIUSAGRAFFA‘¹N");Ž¡‘;‘l¦printf("PUNTOEVIRGOLA‘¹N");Ž¡‘\n‘gì´printf("\n");Ž¡‘[–¹N\t]+‘U|/*“ignora“spazi“bianchi“*/;Ž¡‘%%Ž¦¹Quando–;¯si›;°d€à“come˜input“al˜programma“generato“da˜questo“le˜pGer“Lex˜il“nostro˜le“(usandoŽ© ®esempio3.compile),–U si“ottiene:ŽŸ•Hïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘ÆPAROLA‘¹NAPERTAGRAFFAŽ¡‘PAROLA–¹NNOMEFILE“APERTAGRAFFA“PAROLA“PUNTOEVIRGOLA“CHIUSAGRAFFA“PUNTOEVIRGOLAŽ¡‘PAROLA–¹NPAROLA“APERTAGRAFFA“PAROLA“PUNTOEVIRGOLA“CHIUSAGRAFFA“PUNTOEVIRGOLAŽ¡‘CHIUSAGRAFFA‘¹NPUNTOEVIRGOLAŽ¡¡‘PAROLA–¹NDOPPIOAPICE“NOMEFILE“DOPPIOAPICE“APERTAGRAFFAŽ¡‘PAROLA–¹NPAROLA“PUNTOEVIRGOLAŽ¡‘PAROLA–¹NDOPPIOAPICE“NOMEFILE“DOPPIOAPICE“PUNTOEVIRGOLAŽ¡‘CHIUSAGRAFFA‘¹NPUNTOEVIRGOLAŽŸ¹ ¹Quando–%ƒparagonato›%‚al“le“di˜congurazione“di“cui˜sopra,‘Y›€è“cš¸èhiaro“c˜he›%‚lo“si“€è˜nitidamen¸ète“'categorizzato'.Ž¦Ogni–U parte“del“le“di“congurazione“€è“stato“assoGciato“e“con•¸èv“ertito–U in“una“categoria“(tok¸èen).ŽŸؼE–U questo“€è“esattamenš¸ète“quel“c˜he“serv˜e“pšGer“p˜oter“utilizzare“b˜ene“Y‘ÿ*¸A¸èCC.ŽŸeTïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.3.3) cvn H.B /DEST pdfmark endŸ.ÂÃ3.3Ž‘¾Che–¸cosa“si“€è“vistoŽŸMª¹Si–¡€è“visto“cš¸èhe‘¡Lex“€è“in“grado“di“leggere“input“arbitrari,‘´e“di“determinare“c˜he“cosa‘¡sia“ogni“parte“dell'input.Ž¦Questo–U €è“cš¸èhiamato“'categorizzazione'“(tok˜enizing).ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹…ºïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïJps:SDict begin [ /View [/XYZ H.V] /Dest (page.7) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ4.‘ñ8Y‘ÿ ºA®>CC’ž(O¹7Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [ /View [/XYZ H.V] /Dest (section.4) cvn H.B /DEST pdfmark endŸ À4Ž‘ÁY‘þ®(AcCCŽŸ¿:¹Y‘ÿ*¸Aš¸èCC‘ëupu€ò–ëanalizzare“ussi“in‘ëinput“consisten˜ti“in“categorie“(tok˜en)“con‘ëcerti“v‘ÿqÐalori.‘NPSi“v˜ede“qui“c˜hiaramen˜teŽ¤ ®la–b`relazione“fra“Y›ÿ*¸A¸èCC‘be“Lex,‘¥°Y˜A¸èCC‘bnon“ha“alcuna“idea“di“cosa“i“'ussi“in‘b_input'“siano,‘¥°ha“necessit€à“diŽ¡categorie–[SpreprošGcessate.‘„Anc¸èhe‘[Rse“€è“p˜ossibile›[Rscriv¸èere“un˜proprio“analizzatore“di˜categorie,‘œàqui˜si“lascer€àŽ¡questo–U compito“esclusiv‘ÿqÐamen¸ète“a“Lex.Ž©ؼUna–µInota›µJsulle“grammatic¸èhe“e“sugli˜analizzatori“sinš¸ètattici.‘‘üQuando“Y‘ÿ*¸A˜CC‘µ0vide›µJla“luce,‘ÍSera˜uno“strumen¸ètoŽ¡usato–V@pGer›VAanalizzare“i˜le“in˜input“ai˜compilatori:‘sÁi“programmi.‘tâI‘Uþprogrammi“scritti˜in“un˜linguaggio“diŽ¡programmazione–z·pGer“computer“sono‘z¶tipicamenš¸ète“*non*“am˜bigui“-“hanno“un“signicato“univ˜oGco.‘âDP˜er“questoŽ¡motiv•¸èo,‘®OY‘ÿ*¸A“CC‘hþnon–iEriesce›iFa“fare“fron¸ète˜ad“am¸èbiguit€à˜e“si“lamen¸èter€à˜di“conitti˜spGostamen¸èto/riduzione“oŽ¡riduzione/riduzione.‘m9Qualcosa–HIdi“pi€ù›HJa“riguardo˜di“am¸èbiguit€à˜e“di˜problemi“di“Y‘ÿ*¸A¸èCC‘HGpu€ò“essere˜tro¸èv‘ÿqÐato“nelŽ¡capitolo‘U 'Conitti'.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.4.1) cvn H.B /DEST pdfmark endŸ.ÂÃ4.1Ž‘¾Un–¸semplice“con trollo“termostaticoŽŸMª¹SuppGoniamo–üÇdi“a•¸èv“ere–üÇun“termostato“cš¸èhe“si“vuole“con˜trollare‘üÆusando“un“semplice“linguaggio.‘huUna“sessioneŽ¡con–U il“termostato“p•Gotrebb“e–U essere“di“questo“tipGo:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æriscaldamento‘¹NaccesoŽ¤ Š=‘>ÊrRiscaldamento‘¹Nacceso!Ž¡‘riscaldamento‘¹NspentoŽ¡‘>ÊrRiscaldamento‘¹Nspento!Ž¡‘obiettivo–¹Ntemperatura“22Ž¡‘>ÊrNuova–¹Ntemperatura“impostata!ŽŸؼ¹Le–ž#categorie“(tok•¸èen)›ž$c“he–ž#dobbiamo“essere“in˜grado“di“riconoscere“sono:‘ ‡riscaldamen•¸èto,‘0dacceso/spGen“toŽŸ ®(ST–ÿ*¸A“TO),–U obiettivš¸èo,“tempGeratura,“NUMER˜O.Ž¦L'individuazione–U dei“simš¸èbGoli“di“Lex“a˜vviene“(Esempio“4)“secondo:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ%{Ž¡‘#include‘¹NŽ¡‘#include‘¹N"y.tab.h"Ž¡‘%}Ž¡‘%%Ž¡‘[0-9]+‘U|return‘¹NNUMERO;Ž¡‘riscaldamento‘3öZreturn‘¹NTOKRISCALDAMENTO;Ž¡‘acceso|spento‘3öZreturn‘¹NSTATO;Ž¡‘obiettivo‘FÛ’return‘¹NTOKOBIETTIVO;Ž¡‘temperatura‘=höreturn‘¹NTOKTEMPERATURA;Ž¡‘\n‘gì´/*–¹Nignora“fine“linea“*/;Ž¡‘[–¹N\t]+‘U|/*“ignora“spazi“bianchi“*/;Ž¡‘%%ŽŸؼ¹Si–ª-notano“due“cam•¸èbiamen“ti›ª-impGortan“ti.‘p§Primo,–¿pviene˜incluso˜il˜le˜'y‘ÿ*¸.tab.h',“e˜in˜secondo˜luogo,“non˜vieneŽ¤ ®stampato›ë1n•¸èulla,‘bv“engono˜restituiti˜i–ë2nomi˜delle“categorie.‘N0Questo“cam•¸èbiamen“to˜€è‘ë2necessario˜pGerc“h€é‘ë2si˜passer€àŽ¡tutto›p€a‘pY‘ÿ*¸A•¸èCC‘pyc“he˜si‘pdisin“teressa˜di˜quello‘pc“he˜viene˜stampato‘psullo˜sc“hermo.‘áy‘ÿ*¸.tab.h˜con“tiene‘ple˜denizioniŽ¡di–U queste“categorie.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹’ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïJps:SDict begin [ /View [/XYZ H.V] /Dest (page.8) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ4.‘ñ8Y‘ÿ ºA®>CC’ž(O¹8Ž’ÕÁGï color popŽŽ £n ýˆ.\Ma– da“do•¸èv“e› pro“viene˜y–ÿ*¸.tab.h?‘\yViene˜generato‘ da˜Y“A•¸èCC‘údal˜le˜di˜grammatica˜c“he˜si‘ €è˜in˜proGcin“to˜di˜creare.Ž© ®Visto–U c¸èhe“il“linguaggio“€è“molto“semplice,“lo“stesso“v‘ÿqÐale“pGer“la“grammatica:ŽŸ+ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æcomands:–¹N/*“vuoto“*/Ž¤ Š=‘>Êr|–¹Ncomandi“comandoŽ¡‘>Êr;Ž¡¡‘comando:Ž¡‘>Êrinterruttore_riscaldamentoŽ¡‘>Êr|Ž¡‘>Êrimposta_obiettivoŽ¡‘>Êr;Ž¡¡‘interruttore_riscaldamento:Ž¡‘>ÊrTOKRISCALDAMENTO‘¹NSTATOŽ¡‘>Êr{Ž¡‘d”âprintf("\tRiscaldamento–¹Nacceso“o“spento\n");Ž¡‘>Êr}Ž¡‘>Êr;Ž¡¡‘imposta_obiettivo:Ž¡‘>ÊrTOKOBIETTIVO–¹NTOKTEMPERATURA“NUMEROŽ¡‘>Êr{Ž¡‘d”âprintf("\tTemperatura‘¹Nimpostata\n");Ž¡‘>Êr}Ž¡‘>Êr;ŽŸNå¹La–nprima“parte“€è“quella“cš¸èhe“io“c˜hiamo“la“'radice'“('roGot').‘¼kStabilisce‘nc˜he“ci“sono“dei“'comandi',‘´We“questiŽ¦comandi–^sono›^compGosti“da“comandi˜singoli,‘`Yogn¸èuno“dei“quali˜€è“un“'comando'.‘ŒoCome˜si“v¸èede“questa˜regola“€èŽ¦molto›¾ ricorsiv‘ÿqÐa,‘Ø`pGerc•¸èh€é‘¾!con“tiene˜anc“he˜la˜parola˜'comandi'.‘¬Il˜c“he˜signica˜c“he˜il˜programma‘¾!€è˜in˜grado˜diŽ¦ridurre–ÉÃuna“serie“di“comandi“uno“a“uno.‘ÏjPš¸èer“dettagli“impGortan˜ti“sulla“ricorsivit€à“leggere“il“capitolo“'ComeŽ¦la•¸èv“orano›U in“ternamen“te˜Lex˜e˜Y‘ÿ*¸A“CC'.Ž¤ؼLa–9seconda“regola“denisce“cš¸èhe“cosa“€è“un“comando.‘h&Noi“suppGortiamo“solo“due“tipi“di“comandi,‘>¬un“'in˜terrut-Ž¦tore_riscaldamenš¸èto'–fÏe“un“'impGosta_obiettiv˜o'.‘¦Questo“€è“quello‘fÎc˜he“signica“il“sim˜bGolo“¸j“¹(or)“-“'un“comandoŽ¦consiste–U o“di“un“in•¸èterruttore_riscaldamen“to–U o“di“un“impGosta_obiettiv¸èo'.Ž¡Un›Vin•¸èterruttore_riscaldamen“to–Vconsiste˜nella˜categoria“RISCALD•¸èAMENTO,˜c“he˜€è˜semplicemen“te‘Vla˜parolaŽ¦'riscaldamenš¸èto',–U seguita“da“uno“stato“(c˜he“si“€è“denito“nel“le“di“Lex“come“'acceso'“e“'spGen˜to').Ž¡In–Ä^qualc¸èhe“mošGdo“pi€ù‘Ä]complicato“€è“imp˜osta_obiettiv•¸èo,‘à.c“he‘Ä]consiste–Ä^della“categoria“OBIETTIV¸èO‘ÄA(la“parolaŽ¦'obiettivš¸èo'),–U la“categoria“TEMPERA‘ÿ*¸TURA“(la“parola“'tempGeratura')“e“un“n˜umero.ŽŸ9aïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïWps:SDict begin [ /View [/XYZ H.V] /Dest (subsubsection.4.1.1) cvn H.B /DEST pdfmark endŸXäÁ4.1.1Ž‘#!\Un–Õle“Y‘ÿ ºA®>CC“completoŽŸMª¹La–ãüsezione“precedenš¸ète“ha“mostrato‘ãýsolo“la“parte“di“grammatica“del“le“pGer“Y‘ÿ*¸A˜CC,“ma‘ãýc'€è“di“pi€ù.‘Kɀȑãàla“testataŽ¦c¸èhe–U abbiamo“omesso:ŽŸ+ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ%{Ž¤ Š=‘#include‘¹NŽ¡‘#include‘¹NŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹ ¡ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïJps:SDict begin [ /View [/XYZ H.V] /Dest (page.9) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ4.‘ñ8Y‘ÿ ºA®>CC’ž(O¹9Ž’ÕÁGï color popŽŽ £n ýˆ.\¤ Š=‘Ævoid–¹Nyyerror(const“char“*str)Ž¡‘{Ž¡‘>Êrfprintf(stderr,"errore:‘¹N%s\n",str);Ž¡‘}Ž¡¡‘int‘¹Nyywrap()Ž¡‘{Ž¡‘>Êrreturn‘¹N1;Ž¡‘}Ž¡¡‘main()Ž¡‘{Ž¡‘>Êryyparse();Ž¡‘}Ž¡¡‘%}Ž¡¡‘%token–¹NNUMERO“TOKRISCALDAMENTO“STATO“TOKOBIETTIVO“TOKTEMPERATURAŽ¡¡‘%%ŽŸؼ¹La–/Hfunzione‘/Gyyš¸èerror()“€è“c˜hiamata“da‘/GY‘ÿ*¸A˜CC‘/in“caso‘/Gdi“errore.‘ÿ÷Qui“si“stampa“semplicemen˜te‘/Gil“messaggioŽ¤ ®passato,–U ma“si“pu€ò“fare“di“meglio.‘q€V‘ÿ*¸edere“la“sezione“'Ulteriori“letture'“alla“ne“del“doGcumen¸èto.Ž©ؼLa–ÂBfunzione“yywrap()“pu€ò“essere“usata“pGer“con•¸ètin“uare–ÂBa“leggere‘ÂAda“un“ulteriore“le.‘¸æViene“ric¸èhiamata“allaŽ¡ne–Cdi“un“le›Ce“si“pu€ò“allora“aprire“un˜altro“le“e“restituire“0.‘k{Oppure“si“pu€ò˜restituire“1,‘F­indicando“cos€ì“c¸èheŽ¡questa–85€è“eettiv‘ÿqÐamenš¸ète“la“ne“di“tutti“i“le‘86di“input.‘gÜP˜er“maggiori“informazioni“su“questo,‘=þv˜edere“il“capitoloŽ¡'Come›U la•¸èv“orano˜in“ternamen“te˜Lex˜e˜Y‘ÿ*¸A“CC'.Ž¦Inne–U c'€è“la“funzione“main(),“cš¸èhe“non“fa“n˜ulla“se“non“mettere“tutto“in“mo˜vimen˜to.Ž¦L'ultima–…@linea“denisce‘…Asemplicemenš¸ète“le“categorie“c˜he“v˜erranno‘…Ausate.‘àQueste“v˜engono“proGdotte‘…Anel“le“diŽ¡output–U y›ÿ*¸.tab.h“se“Y˜Aš¸èCC“€è“ric˜hiamato“con“l'opzione“'-d'.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïWps:SDict begin [ /View [/XYZ H.V] /Dest (subsubsection.4.1.2) cvn H.B /DEST pdfmark endŸçÁ4.1.2Ž‘#!\Compilare–Õed“eseguire“il“con®>trollo“termostaticoŽŸÿ+ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Ælex‘¹Nesempio4.lŽ¤ Š=‘yacc–¹N-d“esempio4.yŽ¡‘cc–¹Nlex.yy.c“y.tab.c“-o“esempio4ŽŸؼ¹Noterete–Ÿzalcune“dierenze.‘4ôOra“si‘Ÿyin•¸èv“oGca›Ÿzanc“he˜Y‘ÿ*¸A“CC‘ŸLpGer˜compilare˜la˜nostra˜grammatica,‘ÃÎil˜c“he˜crea˜y‘ÿ*¸.tab.cŽ¤ ®e–•y‘ÿ*¸.tab.h.‘…áLex“si“ric¸èhiama›–come“al˜solito.‘…àQuando“si˜compila,‘2ònon˜serv¸èe“pi€ù˜il“ag“-ll:‘ÔkessendoGci˜ora“unaŽ¡nostra–U funzione“main()“non“serv¸èe“quella“fornita“da“libl.ŽŸ´åïcolor push Black‘ï color popŽŽ‘ÆNOTA:–¹Nnel“caso“otteniate“un“errore“legato“al“fatto“che“il“compilatore“non“€è“in“gradoŽ¤ Š=‘di–¹Ntrovare“'yylval'“aggiungere“in“esempio4.l,“appena“sotto“#include“ó5ùž" cmmi9É<Æy.tab.hÉ>Æ,“questaŽ¡‘riga:ŽŸŠ=‘ïcolor push Blackï color popŽŽ‘extern–¹NYYSTYPE“yylval;ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹ ­ôïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.10) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ4.‘ñ8Y‘ÿ ºA®>CC’™(Ÿ¹10Ž’ÕÁGï color popŽŽ £n ýˆ.\‘ÆPer–¹Nspiegazioni,“vedere“la“sezione“'Come“lavorano“internamente“Lex“e“YACC'.ŽŸؼ¹Una–U sessione“di“esempio:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ$‘¹N./esempio4Ž¤ Š=‘riscaldamento‘¹NaccesoŽ¡‘>ÊrRiscaldamento–¹Nacceso“o“spentoŽ¡‘riscaldamento‘¹NaspentoŽ¡‘>ÊrRiscaldamento–¹Nacceso“o“spentoŽ¡‘obiettivo–¹Ntemperatura“10Ž¡‘>ÊrTemperatura‘¹NimpostataŽ¡‘obiettivo–¹Numidit€à“20Ž¡‘errore:–¹Nsyntax“errorŽ¡‘$ŽŸؼ¹Non–¡Ó€è›¡Òproprio“quello“c¸èhe˜si“v¸èolev‘ÿqÐa“ottenere,‘´ÿma˜pšGer“man¸ètenere“abb˜ordabile›¡Òla“curv‘ÿqÐa“di˜apprendimen¸èto“nonŽ¤ ®si–U pGossono“presenš¸ètare“tutte“in“una“v˜olta“le“bGelle“cose“c˜he“si“pGossono“fare.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.4.2) cvn H.B /DEST pdfmark endŸ.ÂÃ4.2Ž‘¾Miglioramen to–¸del“termostato“p_úer“gestire“parametriŽŸMª¹Come–³si›²€è“visto,‘0—ora“i“comandi˜del“termostato˜vš¸èengono“analizzati“correttamen˜te›²e“pure“gli˜errori“v¸èengonoŽ¡individuati–÷¥in›÷¤moGdo“appropriato.‘RWMa“come“si“pu€ò˜indoš¸èvinare“dalla“form˜ulazione“am˜bigua,‘ Wil‘÷¤programma“nonŽ¡ha–U alcuna“idea“di“quello“cš¸èhe“do˜vrebbGe“fare,“non“gli“viene“passato“nessuno“dei“v‘ÿqÐalori“inseriti.Ž©ؼCominciamo–žöcon›žõaggiungergli“la“capacit€à˜di“leggere“il“n•¸èuo“v“o˜obiettiv“o–žödi“tempGeratura.‘OP¸èer˜fare“questo,Ž¡si–Í–devš¸èe“insegnare“alla‘Í•corrispGondenza“NUMER˜O‘Íwnell'analizzatore“sin˜tattico“(Lexer)‘Í•come“con˜v˜ertirsi“in“unŽ¡v‘ÿqÐalore–U inš¸ètero“c˜he“pšGossa“p˜oi“essere“letto“da“Y‘ÿ*¸A¸èCC.Ž¦Quando– wLex› xtro¸èv‘ÿqÐa“una“corrispGondenza˜dell'obiettiv¸èo“mette“il“testo˜della“corrispGondenza“tro¸èv‘ÿqÐata˜nella“stringaŽ¡di›I¤caratteri–I¥'yytext'.‘m¬Y‘ÿ*¸A¸èCC‘I¡a“sua˜v¸èolta“si˜aspGetta˜di“tro¸èv‘ÿqÐare˜un“v–ÿqÐalore˜nella˜v“ariabile‘I¥'yylv“al'.‘m¬Nell'EsempioŽ¡5,–U vš¸èediamo“l'o˜vvia“soluzione:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ%{Ž¤ Š=‘#include‘¹NŽ¡‘#include‘¹N"y.tab.h"Ž¡‘%}Ž¡‘%%Ž¡‘[0-9]+‘U|yylval=atoi(yytext);–¹Nreturn“NUMERO;Ž¡‘riscaldamento‘3öZreturn‘¹NTOKRISCALDAMENTO;Ž¡‘acceso|spento‘3öZyylval=!strcmp(yytext,"acceso");–¹Nreturn“STATO;Ž¡‘obiettivo‘FÛ’return‘¹NTOKOBIETTIVO;Ž¡‘temperatura‘=höreturn‘¹NTOKTEMPERATURA;Ž¡‘\n‘gì´/*–¹Nignora“fine“linea“*/;Ž¡‘[–¹N\t]+‘U|/*“ignora“spazi“bianchi“*/;Ž¡‘%%ŽŸؼ¹Come–tisi“v¸èede,‘|‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.11) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ4.‘ñ8Y‘ÿ ºA®>CC’™(Ÿ¹11Ž’ÕÁGï color popŽŽ £n ýˆ.\pro•Gdurrebb“e–¬˜un“cošGdice‘¬™pi€ù“v¸èelo˜ce,‘Âvma“si“vuole“qui›¬™mostrare“una“regola“e“una“azione˜pi€ù“complicata,‘Âvtan¸ètoŽ¤ ®pGer‘U cam¸èbiare.Ž©ؼSi–¹ædevš¸èe‘¹çinsegnare“a“Y‘ÿ*¸A˜CC‘¹Ícome“compGortarsi›¹çin“questo“caso.‘ŸÓQuello˜c¸èhe“viene˜c¸èhiamato“'yylv‘ÿqÐal'“in˜Lex“haŽ¡un–U nome“dierenš¸ète“in“Y‘ÿ*¸A˜CC.“Esaminiamo“la“regola“c˜he“impGosta“il“n˜uo˜v˜o“obiettiv˜o“di“tempGeratura:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æimposta_obiettivo:Ž¤ Š=‘>ÊrTOKOBIETTIVO–¹NTOKTEMPERATURA“NUMEROŽ¡‘>Êr{Ž¡‘d”âprintf("\tTemperatura–¹Nimpostata“a“%d\n",$3);Ž¡‘>Êr}Ž¡‘>Êr;ŽŸؼ¹Pš¸èer–Taccedere“al“v‘ÿqÐalore“della“terza“parte“della“regola“(cioG€è‘SÿNUMER˜O),“€è“necessario“usare“$3.‘n Al“termineŽ¤ ®dell'esecuzione–Ì°di“yylex(),‘ê•i“con•¸èten“uti–Ì°di“yylv‘ÿqÐal“v¸èengono“resi›̱dispGonibili“al“terminale,‘ê”e“a“quei˜v‘ÿqÐalori“si“pu€òŽ¡accedere–U con“il“costrutto“$.Ž¦Pš¸èer–U spiegare“ulteriormen˜te“la“cosa“si“osservi“la“n˜uo˜v‘ÿqÐa“regola“'in˜terruttore_riscaldamen˜to':ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æinterruttore_riscaldamento:Ž¤ Š=‘>ÊrTOKRISCALDAMENTO‘¹NSTATOŽ¡‘>Êr{Ž¡‘d”âif($2)Ž¡’Š_Rprintf("\tRiscaldamento‘¹Nacceso\n");Ž¡‘d”âelseŽ¡’Š_Rprintf("\tRiscaldamento‘¹Nspento\n");Ž¡‘>Êr}Ž¡‘>Êr;ŽŸؼ¹Se–U ora“si“esegue“esempio5“dar€à“in“output“correttamenš¸ète“quello“c˜he“si“inserisce.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.4.3) cvn H.B /DEST pdfmark endŸ.ÂÃ4.3Ž‘¾Analizzare–¸un“le“di“congurazioneŽŸMª¹Rivš¸èediamo–U una“parte“del“le“di“congurazione“usato“preceden˜temen˜te:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æzone–¹N"."“{Ž¡‘>Êrtype‘¹Nhint;Ž¡‘>Êrfile‘¹N"/etc/bind/db.root";Ž¡‘};ŽŸؼ¹Si–Ž³ricordi“cš¸èhe“si“€è“gi€à“scritto“un“Analizzatore“lessicale“(Lexer)‘Ž´pGer“questo“le.‘/\T‘ÿ*¸utto“quello“c˜he“ora“€è“necessarioŽ¤ ®fare–ec€è“scrivš¸èere“una‘ebgrammatica“pGer“Y‘ÿ*¸A˜CC,“e“moGdicare“l'Analizzatore“lessicale“cos€ì‘ebc˜he“restituisca“v‘ÿqÐalori“inŽ¡un–U formato“adatto“a“Y‘ÿ*¸A¸èCC.Ž¦Nell'Analizzatore–U lessicale“dall'Esempio“6“si“v¸èede:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ%{Ž¤ Š=‘#include‘¹NŽ¡‘#include‘¹N"y.tab.h"Ž¡‘%}ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹ Çíïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.12) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ4.‘ñ8Y‘ÿ ºA®>CC’™(Ÿ¹12Ž’ÕÁGï color popŽŽ £n ýˆ.\¤ Š=‘Æ%%Ž¡¡‘zone‘^zreturn‘¹NZONETOK;Ž¡‘file‘^zreturn‘¹NFILETOK;Ž¡‘[a-zA-Z][a-zA-Z0-9]*‘å8yylval=strdup(yytext);–¹Nreturn“PAROLA;Ž¡‘[a-zA-Z0-9\/.-]+‘%Êpyylval=strdup(yytext);–¹Nreturn“NOMEFILE;Ž¡‘\"‘gì´return‘¹NDOPPIOAPICE;Ž¡‘\{‘gì´return‘¹NAPERTAGRAFFA;Ž¡‘\}‘gì´return‘¹NCHIUSAGRAFFA;Ž¡‘;‘l¦return‘¹NPUNTOEVIRGOLA;Ž¡‘\n‘gì´/*–¹Nignora“fine“linea“*/;Ž¡‘[–¹N\t]+‘U|/*“ignora“spazi“bianchi“*/;Ž¡‘%%ŽŸ—“¹Se– ]si› ^osserv‘ÿqÐa“atten•¸ètamen“te˜si‘ ]pu€ò˜v“edere‘ ]c“he˜yylv‘ÿqÐal‘ ]€è˜cam“biato!‘”8Non˜ci– ]si˜aspGetta“pi€ù˜c¸èhe“sia˜un“n¸èumeroŽ¤ ®in¸ètero,‘ûrma–åin›åeetti“si˜assume“c¸èhe“sia˜un“c•¸èhar˜*.‘L#P“er˜amor–ådi“semplicit€à˜si“€è˜in•¸èv“oGcato–åstrdup˜sprecando“moltaŽ¡memoria.‘&˜Si–‘~noti›‘}c¸èhe“ci€ò˜pu€ò“non˜essere“un˜problema“in˜molti“casi˜do•¸èv“e–‘~€è˜solo“necessario˜analizzare“un˜leŽ¡una–U v¸èolta“e“pGoi“uscire.Ž©ؼSi–}îv¸èogliono›}ímemorizzare“stringhe“di“caratteri˜pGerc¸èh€é“qui“si“ha˜a“c¸èhe“fare˜principalmen¸ète“con“nomi:‘Ãnomi“diŽ¡le–U e“nomi“di“zone.‘q€In“un“capitolo“successivš¸èo“si“spiegher€à“come“trattare“dati“di“tipi“dieren˜ti.Ž¦Pš¸èer–äÈinformare“Y‘ÿ*¸A˜CC‘ä«riguardo“al“n˜uo˜v˜o“tipGo“di“yylv–ÿqÐal,‘û@v“a–äÈaggiun˜ta“questa“linea“alla“testata“della“grammaticaŽ¡di‘U Y‘ÿ*¸A¸èCC:Ž¤GI‘ûïcolor push Blackï color popŽŽ¾#define–?¬YYSTYPE“char“*Ž¡¹La–ldgrammatica“in“s€é›le€è“ancora“pi€ù“complicata.‘#íLa“v¸èediamo“a“piccole“dosi“pGer˜renderla“pi€ù“facilmen¸ète“digeribile.ŽŸ#rïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æcomandi:Ž¤ Š=‘>Êr|Ž¡‘>Êrcomandi–¹Ncomando“PUNTOEVIRGOLAŽ¡‘>Êr;Ž¡¡¡‘comando:Ž¡‘>Êrimposta_zoneŽ¡‘>Êr;Ž¡¡‘imposta_zone:Ž¡‘>ÊrZONETOK–¹Nnomefradoppiapici“contenutozoneŽ¡‘>Êr{Ž¡‘d”âprintf("Zone–¹Ncompleta“trovata“per“'%s'\n",$2);Ž¡‘>Êr}Ž¡‘>Êr;ŽŸGI¹Questa–ñ5€è“l'inš¸ètroGduzione,‘0inclusa“la“'radice'“ricorsiv‘ÿqÐa“gi€à“menzionata“pi€ù“sopra.‘P2Notare‘ñ4c˜he“si“€è“spGecicato“c˜heŽ¤ ®i–}comandi›|sono“terminati“(e“separati)˜da“;.‘_ŸSi“€è˜denito“un“tipGo“di˜comando,‘*7'impGosta_zone'.‘_ŸConsiste“dellaŽ¡categoria–EÅZONETOK‘E†(la“parola–EÄ'zone'),‘îseguita“da–EÅun“nome›EÄracc¸èhiuso“tra˜doppi“apici˜e“'con•¸èten“utozone'.Ž¡Questo›U con•¸èten“utozone˜comincia˜in˜moGdo˜abbastanza˜semplice:ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹ Óôïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.13) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ4.‘ñ8Y‘ÿ ºA®>CC’™(Ÿ¹13Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æcontenutozone:Ž¤ Š=‘>ÊrAPERTAGRAFFA–¹Ndichiarazionizone“CHIUSAGRAFFAŽ©ؼ¹€È‘ümnecessario–ü˜c¸èhe›ü™cominci“con“una˜APER–ÿ*¸T“Aš¸èGRAFF‘þã A,–ü˜una“¸f¹.‘géP˜oi‘ü™segue“una“dic˜hiarazionizone,‘&wseguita“daŽŸ ®una–U CHIUSA¸èGRAFF‘þã A,“¸g¹.ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Ænomefradoppiapici:Ž¡‘>ÊrDOPPIOAPICE–¹NNOMEFILE“DOPPIOAPICEŽ¡‘>Êr{Ž¡‘d”â$$=$2;Ž¡‘>Êr}Ž¦¹Questa–ŽÄsezione“denisce›ŽÅcosa“sia“un“'nomefradoppiapici':‘S€è“un“NOMEFILE‘Ž’tra“due˜DOPPIOš¸èAPICE.“P˜oi“diceŽ¤ ®qualcosa–»Kdi›»LspGeciale:‘=×il“v‘ÿqÐalore˜di“un˜sim¸èbGolo“di˜tipGo“nomefradoppiapici˜€è“il˜v‘ÿqÐalore“del˜NOMEFILE.“QuestoŽ¡signica–U c¸èhe“nomefradoppiapici“ha“come“suo“v›ÿqÐalore“il“v˜alore“di“lename“senza“i“doppi“apici.ŽŸؼQuesto–•]€è›•^quello“c¸èhe˜il“comando˜magico“'$$=$2;'‘µ|fa.‘29Dice:‘ñûil“mio˜v‘ÿqÐalore“€è˜il“v‘ÿqÐalore˜della“mia˜parte“seconda.Ž¡Quando–¿šsi›¿›fa“riferimen¸èto“a˜nomefradoppiapici“in“altre˜regole“e“si˜accede“al“suo˜v‘ÿqÐalore“con“il˜costrutto“$,‘Ú9siŽ¡vš¸èede–U il“v‘ÿqÐalore“c˜he“si“€è“impGostato“qui“con“$$=$2.Ž¦ïcolor push Black‘ï color popŽŽ‘ÆNOTA:–¹Nquesta“grammatica“s'inceppa“con“nomi“di“file“che“non“contengono“n€é“un“'.'‘ rœn€é“unaŽ¡‘'/'.ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘dichiarazionizone:Ž¤ Š=‘>Êr|Ž¡‘>Êrdichiarazionizone–¹Ndichiarazionezona“PUNTOEVIRGOLAŽ¡‘>Êr;Ž¡¡‘dichiarazionezona:Ž¡‘>ÊrdichiarazioniŽ¡‘>Êr|Ž¡‘>ÊrFILETOK‘¹NnomefradoppiapiciŽ¡‘>Êr{Ž¡‘d”âprintf("Nome–¹Ndi“file“zone“'%s'“trovato\n",$2);Ž¡‘>Êr}Ž¡‘>Êr;Ž¦¹Questa–¤æ€è›¤åuna“dic¸èhiarazione˜generica“c•¸èhe˜in“tercetta–¤ætutti˜i“tipi˜di“dic•¸èhiarazione˜all'in“terno–¤ædel˜bloGcco“'zone'.ŽŸ ®Notiamo–U ancora“la“ricorsivit€à.ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æblocco:Ž¡‘>ÊrAPERTAGRAFFA–¹Ndichiarazionizone“CHIUSAGRAFFA“PUNTOEVIRGOLAŽ¡‘>Êr;Ž¡¡‘dichiarazioni:Ž¡‘>Êr|–¹Ndichiarazioni“dichiarazioneŽ¡‘>Êr;Ž¡¡‘dichiarazione:–¹NPAROLA“|“blocco“|“nomefradoppiapiciŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹ß¼ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.14) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ5.‘ñ8F‘ÿ ºare–Õun“analizzatore“in“C++’(%¹14Ž’ÕÁGï color popŽŽ £n ýˆ.\Questo–U denisce“un“bloGcco“e“le“'dicš¸èhiarazione'“c˜he“vi“si“pGossono“tro˜v‘ÿqÐare.Ž©ؼQuando–U viene“eseguito“il“risultato“in“uscita“appare“come:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ$‘¹N./esempio6Ž¤ Š=‘zone–¹N"."“{Ž¡‘>Êrtype‘¹Nhint;Ž¡‘>Êrfile‘¹N"/etc/bind/db.root";Ž¡‘>Êrtype‘¹Nhint;Ž¡‘};Ž¡‘Nome–¹Ndi“file“zone“'/etc/bind/db.root'“trovatoŽ¡‘Zone–¹Ncompleta“trovata“per“'.'ŽŸ¶ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [ /View [/XYZ H.V] /Dest (section.5) cvn H.B /DEST pdfmark endŸ¯æÀ5Ž‘ÁF‘þ®(are–G\un“analizzatore“in“C++ŽŸ¿:¹P•¸èer›ËXquan“to–ËWLex˜e“Y‘ÿ*¸A¸èCC‘Ë5preceda“il˜C++,‘ææ€è“pGossibile˜generare“un˜analizzatore˜sinš¸ètattico“C++.‘C“Anc˜he“se‘ËXFlexŽ¤ ®include–ìéun'opzione“pGer“generare“un‘ìêAnalizzatore“lessicale“in“C++,›Ánon“v¸èerr€à“usata“qua,˜visto“cš¸èhe“Y‘ÿ*¸A˜CC‘ìÏnonŽ¡sa–U come“gestirla“direttamen¸ète.Ž¦Il–¹ÇmošGdo“c¸èhe‘¹Æpreferisco“p˜er“fare“un“analizzatore‘¹Æsin¸ètattico“p˜er“C++“€è“di“fare›¹Ægenerare“a“Lex“un“le˜in“C,“eŽ¡lasciare›ˆa–‰Y‘ÿ*¸A¸èCC‘Rla“generazione˜del“coGdice˜C++.‘*NQuando“pGoi˜si“eettua˜il“link˜dell'applicazione,‘ªAsi˜p•Gotrebb“eroŽ¡inconš¸ètrare–¨@dei“problemi“pGerc˜h€é,‘½ senza“indicazioni,‘½il“coGdice“C++‘¨Anon“€è“in“grado“di“tro˜v‘ÿqÐare‘¨Ale“funzioni“C,“aŽ¡meno–U cš¸èhe“non“gli“si“dica“c˜he“quelle“funzioni“sono“extern“C.Ž¦Pš¸èer–U fare“ci€ò,“si“fa“una“testata“C“in“Y‘ÿ*¸A˜CC“come“questa:Ž©´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æextern‘¹N"C"Ž¤ Š=‘{Ž¡‘>Êrint‘¹Nyyparse(void);Ž¡‘>Êrint‘¹Nyylex(void);Ž¡‘>Êrint‘¹Nyywrap()Ž¡‘>Êr{Ž¡‘d”âreturn‘¹N1;Ž¡‘>Êr}Ž¡¡‘}ŽŸؼ¹Se–U si“vš¸èolesse“dic˜hiarare“o“cam˜biare“yydebug,“si“dev˜e“fare“ora“in“questo“moGdo:Ž¦ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æextern–¹Nint“yydebug;Ž¡¡‘main()Ž¡‘{Ž¡‘>Êryydebug=1;Ž¡‘>Êryyparse();Ž¡‘}ŽŸؼ¹Questo–øa“causa›ùdella“regola“del“C++“c¸èhe˜esige“un'unica“denizione,‘%ci€ò“c¸èhe“impGedisce˜denizioni“m¸èultiple“diŽŸ ®yydebug.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹êÄïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.15) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ6.‘ñ8Come›Õla•®>v“orano˜in“ternamen“te˜Lex˜e˜Y‘ÿ ºA“CC’äÇt¹15Ž’ÕÁGï color popŽŽ £n ýˆ.\Pu€ò–^ðancš¸èhe“capitare‘^ïc˜he“sia“necessario“ripGetere›^ïla“#dene“di“YYSTYPE‘^«nel“le˜pGer“Lex,‘¡da˜causa“di“unaŽŸ ®maggiore–U rigidit€à“nel“con¸ètrollo“del“tipGo“in“C++.Ž©ؼPš¸èer–U compilare,“fare“qualcosa“di“simile“a“quel“c˜he“segue:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ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ŽŸؼ¹A–U causa“dell'asserzione“-o“y‘ÿ*¸.tab.h“€è“ora“cš¸èhiamato“bindcong2.cc.h,“quindi“tenetene“con˜to.Ž¦P¸èer–~Ãriassumere:‘ÄÅnon›~Âprendetevi“la˜briga“di˜compilare“l'analizzatore“sin¸ètattico˜(Lexer)“in˜C++,‘‰+lasciatelo“inŽ¤ ®C.–MµScrivš¸èete‘M¶il“v˜ostro‘M¶analizzatore“(P˜arser)›M¶in“C++“e˜spiegate“al˜v¸èostro“compilatore˜c¸èhe“alcune˜funzioni“sonoŽ¡funzioni–U C“con“dic¸èhiarazioni“extern“C.ŽŸÖïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [ /View [/XYZ H.V] /Dest (section.6) cvn H.B /DEST pdfmark endŸ¯ÆÀ6Ž‘ÁCome›G\la•cv“orano˜in“ternamen“te˜Lex˜e˜Y‘þ®(A“CCŽŸ¿:¹Nel–Ôle“pGer“Y‘ÿ*¸Aš¸èCC,“siete“v˜oi“a“scriv˜ere“la“v˜ostra‘Ôfunzione“main()“c˜he“ad“un“certo“pun˜to“c˜hiama“yyparse().Ž¡La–U funzione“yyparse()“viene“creata“automaticamenš¸ète“da“Y‘ÿ*¸A˜CC,“e“nisce“in“y‘ÿ*¸.tab.c.Ž¦yyparse()–_legge“un“usso“di“coppie“simš¸èbGolo/v‘ÿqÐalore“pro˜v˜enien˜ti“da“yylex()“c˜he“€è“necessario“fornire.‘¯=Si“pu€òŽ¡scrivš¸èere– questa“funzione“pGer‘ con˜to“proprio“o“lasciare“questo“compito› a“Lex.‘ANei“nostri“esempi˜si“€è“scelto“diŽ¡lasciare–U questo“compito“a“Lex.Ž¦La–f­yylex()“come“scritta“da“Lex“legge“i‘f®caratteri“da“un“punš¸ètatore“a“le“FILE‘f©*“c˜hiamato“yyin.‘¦'Se“non“vieneŽ¡spšGecicato– –yyin“Lex“usa“lo“standard“input.‘_ýL'output“v‘ÿqÐa‘ •in“yy¸èout,‘+e“se“non“sp˜ecicato“nisce“sullo“stdout.‘_ýSiŽ¡pu€ò–2ancš¸èhe“moGdicare“yyin“nella“funzione‘2Žyywrap()“c˜he“viene“c˜hiamata“a“ne“le.‘eúQuesta“funzione“pGermetteŽ¡di–U aprire“un“altro“le,“e“con•¸ètin“uare‘U nell'analisi.Ž¦In–.Æquesto“caso›.Åv‘ÿqÐa“fatto“in“moGdo˜cš¸èhe“restituisca“0.‘d·Nel“caso“si“v˜olesse“far›.Ånire“l'analisi“dopGo“questo˜le“gli“siŽ¡faccia–U restituire“1.Ž¦Ogni–.àc¸èhiamata›.ßa“yylex()˜restituisce“un˜v‘ÿqÐalore“in•¸ètero˜c“he‘.àrappresen“ta˜un–.àtipGo˜di“categoria.‘þ¾Questo“dice˜aŽ¡Y‘ÿ*¸A•¸èCC‘bóc“he–c9genere“di“categoria›c8ha“letto.‘›ËIl˜simš¸èbGolo“pu€ò“ev˜en˜tualmen˜te“a˜v˜ere“un‘c8v‘ÿqÐalore,‘¦¿c˜he“do˜vr€à“essereŽ¡messo–U nella“v›ÿqÐariabile“yylv˜al.Ž¦Pš¸èer–U default“yylv‘ÿqÐal“€è“di“tipGo“in˜t“ma“si“pu€ò“cam˜biarlo“dal“le“pGer“Y‘ÿ*¸A˜CC“ridenendo“YYSTYPE“con“#dene.Ž¦€È‘iÞnecessario–j&c¸èhe›j%l'Analizzatore“lessicale“(Lexer)˜sia“in˜grado“di“accedere˜a“yylv‘ÿqÐal.‘°‘P¸èer˜questo“la˜si“dev¸èeŽ¡dic•¸èhiarare›ºúnell'am“bito–ºûdell'Analizzatore˜lessicale“(Lexer)˜come˜una“v‘ÿqÐariabile˜extern.‘£Lo“Y‘ÿ*¸A¸èCC‘ºžoriginaleŽ¡tralascia–&cdi›&bfare“questo“p•Ger˜v¸èoi,‘Z´p“er˜cui‘&csi˜do¸èvrebb“e–&caggiungere“il˜seguen¸ète“coGdice“al˜proprio“AnalizzatoreŽ¡lessicale–U (Lexer),“giusto“sotto“#include“µ<¹y‘ÿ*¸.tab.hµ>¹:Ž¤ؼ‘ûïcolor push Blackï color popŽŽ¾extern–?¬YYSTYPE“yylval;Ž¡¹Bison,‘¾}cš¸èhe–˜Ô€è“utilizzato“di“questi“tempi“dalla‘˜Õmaggioranza“della“gen˜te,‘¾}lo“fa“automaticamen˜te“pGer“l'utilizzatore.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹õÑïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.16) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ6.‘ñ8Come›Õla•®>v“orano˜in“ternamen“te˜Lex˜e˜Y‘ÿ ºA“CC’äÇt¹16Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.6.1) cvn H.B /DEST pdfmark endŸ Ã6.1Ž‘¾V›þàalori–¸di“categoria“(T˜ok en“v‘ÿ@ alues)ŽŸMª¹Come›nÞdetto‘nÝpreceden•¸ètemen“te˜yylex()‘nÝdev“e˜restituire–nÝquale˜tipGo“di˜categoria“incon¸ètra˜e“mettere˜il“suo˜v‘ÿqÐaloreŽ¤ ®in–õØyylv‘ÿqÐal.‘S§Quando“queste›õ×categorie“v¸èengono“denite˜con“il“comando˜%tokš¸èen“ad“esse“v˜engono‘õ×assegnati“idŽ¡[iden•¸èticativi]›U n“umerici˜a˜partire˜da˜256.ŽŸؼGrazie–ŸKa›ŸJquesto,‘±Õ€è“pGossibile“a•¸èv“ere˜tutti–ŸKi˜caratteri“ASCIGI‘Ÿ8come˜categorie.‘PDiciamo“c¸èhe˜si“v•¸èoglia˜scriv“ere‘ŸKunŽ¡calcolatore,–U sino“ad“ora“a¸èvremmo“scritto“l'Analizzatore“lessicale“come“segue:ŽŸÿ:ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ[0-9]+‘/= yylval=atoi(yytext);–¹Nreturn“NUMERO;Ž¤ Š=‘[–¹N\n]+‘/= /*“ignora“spazi“bianchi“*/;Ž¡‘-‘FÛ’return‘¹NMENO;Ž¡‘\*‘B"Dreturn‘¹NPER;Ž¡‘\+‘B"Dreturn‘¹NPIU;Ž¡‘...Ž©#¹La–U grammatica“di“Y‘ÿ*¸Aš¸èCC“con˜terrebbGe“allora:ŽŸÿ;ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘>ÊrÆexp:‘å8NUMEROŽ¡‘d”â|Ž¡‘d”âexp–¹NPIU“expŽ¡‘d”â|Ž¡‘d”âexp–¹NMENO“expŽ¡‘d”â|Ž¡‘d”âexp–¹NPER“expŽ¦¹Questo›ls€è‘lrin•¸èutilmen“te˜complicato.‘·xUsando˜caratteri–lrcome˜abbreviazioni“degli˜id˜dei“sim•¸èbGoli˜n“umerici,‘rGsi˜pu€òŽ¤ ®riscriv¸èere–U l'Analizzatore“lessicale“come:Ž¦‘ûïcolor push Blackï color popŽŽ¾[0-9]+‘4|¸yylval=atoi(yytext);–?¬return“NUMERO;Ž¡[–?¬\n]+‘4|¸/*“ignora“spazi“bianchi“*/;Ž¡.‘N»return–?¬(int)“yytext[0];Ž¦¹Quest'ultimo–•¡pun¸èto“mette“in“corrispšGondenza“tutti“i“singoli“caratteri‘• p˜er“i“quali“non“€è“stata“tro¸èv‘ÿqÐata“unaŽ¡corrispGondenza.ŽŸؼLa–U grammatica“pšGer“Y‘ÿ*¸A¸èCC“sarebb˜e“allora:ŽŸÿ;ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘>ÊrÆexp:‘å8NUMEROŽ¤ Š=‘d”â|Ž¡‘d”âexp–¹N'+'“expŽ¡‘d”â|Ž¡‘d”âexp–¹N'-'“expŽ¡‘d”â|Ž¡‘d”âexp–¹N'*'“expŽ¦¹Questo–mð€è›mïmolto“pi€ù“stringato“e˜ancš¸èhe“molto“pi€ù“c˜hiaro.‘»ïNon“€è‘mïnecessario“dic˜hiarare“questi“sim˜bGoli‘mïascii“conŽ¤ ®%tokš¸èen–U nella“testata,“sono“deniti“implicitamen˜te.ŽŸؼUn'altra–¡^cosa“molto›¡]utile“a“propGosito“di“questo“costrutto˜€è“cš¸èhe“ora“Lex“non“cerc˜her€à‘¡]una“corrispGondenza“aŽ¡tutto–Y[quello›Y\c¸èhe“gli“spGediamo˜-“evitando“il˜compšGortamen¸èto“di“default“p˜er›Y\il“quale“tutto˜ci€ò“c¸èhe“in˜input“nonŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹Úïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.17) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ6.‘ñ8Come›Õla•®>v“orano˜in“ternamen“te˜Lex˜e˜Y‘ÿ ºA“CC’äÇt¹17Ž’ÕÁGï color popŽŽ £n ýˆ.\troš¸èv‘ÿqÐa–êÖuna‘êÕcorrispGondenza“viene“in˜viato‘êÕin“output“iden˜tico.‘2 Se“l'uten˜te“di›êÕquesto“calcolatore“usa˜un“,‘CpGerŽ¤ ®esempio,–U ora“dar€à“un“errore“di“analisi,“in•¸èv“ece–U di“v¸èenir“riesso“nello“standard“output.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.6.2) cvn H.B /DEST pdfmark endŸ.ÂÃ6.2Ž‘¾Ricorsione:‘ÿ 'a–¸destra“€è“sbagliata'“(righ t“is“wrong)ŽŸMª¹La–µ‘ricorsione“€è“un›µ’aspGetto“vitale“di“Y‘ÿ*¸A¸èCC.“Senza“di˜essa“non“si“pu€ò“spGecicare“c¸èhe“un˜le“consista“di“unaŽ¡sequenza–^üdi“comandi“indipšGenden¸èti‘^ýo“asserzioni.‘Di“p˜er“s€é‘^ýstesso,‘asY‘ÿ*¸Aš¸èCC‘^ù€è“in˜teressato‘^ýsolo“alla“prima“regola,Ž¡o–U a“quella“cš¸èhe“si“designa“essere,“con“il“sim˜bGolo“'%start',“la“regola“di“partenza.ŽŸؼLa–‹ ricorsione›‹ appare“in˜Y‘ÿ*¸A¸èCC‘ŠÖdi˜due“tipi:‘ ua˜destra“e˜a“sinistra.‘.$La“ricorsione˜a“sinistra,‘³uquella“c¸èhe˜si“do¸èvrebbGeŽ¡usare–U la“maggior“parte“delle“vš¸èolte,“assomiglia“a“quella“c˜he“segue:Ž©ؼ‘ûïcolor push Blackï color popŽŽ¾commands:–?¬/*“vuoto“*/Ž¡‘)ý`|Ž¡‘)ý`commands‘?¬commandŽ¦¹Questa–adice:‘‰hun›acomando“pu€ò“o“essere“vuoto“o“consistere˜di“pi€ù“comandi“seguiti“da“un“comando.‘•]P¸èer“comeŽ¡la•¸èv“ora›ÆY‘ÿ*¸A“CC,˜ci€ò‘Æsignica˜c“he˜Y‘ÿ*¸A“CC‘Åópu€ò–Æora˜ritagliare˜gruppi˜individuali˜di“comandi˜facilmen¸ète˜(dall'inizio)Ž¡via–U via“riducendoli.ŽŸؼPš¸èaragoniamola–U con“la“ricorsione“a“destra,“c˜he“abbastanza“stranamen˜te“a“molte“pGersone“pare“migliore:Ž©ؼ‘ûïcolor push Blackï color popŽŽ¾commands:–?¬/*“vuoto“*/Ž¡‘)ý`|Ž¡‘)ý`command‘?¬commandsŽ¦¹Ma–1.questa›1-€è“costosa.‘e…Se“usata˜come“regola“%start,‘8^ric¸èhiede“a˜Y‘ÿ*¸A¸èCC‘1%di“tenere˜tutti“i“comandi“del˜v¸èostro“leŽ¡nello–úHla“ricorsione“a“destra“appare“molto“naturale,˜maŽ¡€è–U com¸èunque“costosa:Ž¦‘ûïcolor push Blackï color popŽŽ¾commands:–?¬/*“vuoto“*/Ž¡‘)ý`|Ž¡‘)ý`command–?¬PUNTOEVIRGOLA“commandsŽ¦¹Il–umošGdo‘ucorretto“p˜er“co˜dicare“in›uquesto“caso“€è“usando˜la“ricorsione“a“sinistra˜(non“sono“stato“io˜ad“in•¸èv“en“tarmiŽ¡neppure‘U questo):Ž¦‘ûïcolor push Blackï color popŽŽ¾commands:–?¬/*“vuoto“*/Ž¡‘)ý`|Ž¡‘)ý`commands–?¬command“PUNTOEVIRGOLAŽ¦¹Una–Úävš¸èersione“preceden˜te‘Úådi“questo“HO˜WTO‘Ú€erroneamen˜te“usa˜v›ÿqÐa“la‘Úåricorsione“a“destra.‘ ÍMarkus“T‘ÿ*¸risk˜aŽ¡gen•¸ètilmen“te–U ce“l'ha“fatto“notare.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹Pïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.18) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ6.‘ñ8Come›Õla•®>v“orano˜in“ternamen“te˜Lex˜e˜Y‘ÿ ºA“CC’äÇt¹18Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.6.3) cvn H.B /DEST pdfmark endŸ Ã6.3Ž‘¾A dv–ÿ@ anced‘¸yylv“al:‘ÿ %unionŽŸMª¹A•¸èttualmen“te,‘V si›UÝdev“e˜denire˜*il*˜tip•Go˜di˜yylv‘ÿqÐal.‘s¶Questo˜p“er€ò˜non˜v‘ÿqÐa˜sempre˜b“ene.‘s¶Ci˜sono˜situazioni˜in˜cuiŽ¤ ®dobbiamo–;çessere“in“grado“di“gestire“tipi‘;ædi“dati“m¸èultipli.‘iT‘ÿ*¸ornando“al“nostro“ipGotetico“termostato,‘@òmagari“siŽ¡vuole–U essere“in“grado“di“scegliere“quale“stufa“si“vuole“con¸ètrollare,“cos€ì:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æstufa‘¹NedificioprincipaleŽ¤ Š=‘>ÊrSelected–¹N'edificioprincipale'“stufaŽ¡‘obiettivo–¹Ntemperatura“23Ž¡‘>Êr'edificioprincipale'–¹Nstufa“obiettivo“temperatura“adesso“23ŽŸؼ¹Quello–kFcš¸èhe“si“ric˜hiede‘kGqui“€è“c˜he“yylv‘ÿqÐal“sia“una‘kG'union'“c˜he“pu€ò“con˜tenere“sia“stringhe“c˜he‘kGn˜umeri“in˜teri“-“maŽ¤ ®non‘U sim•¸èultaneamen“te.Ž©ؼSi–iåricordi“c¸èhe›iæin“precedenza“si“era“detto“a˜Y‘ÿ*¸A•¸èCC‘i©c“he˜tipšGo–iåci“si“asp˜ettaš¸èv‘ÿqÐa“c˜he“yylv‘ÿqÐal‘iæfosse“denendo“YYSTYPE.Ž¡Si–"pu€ò“ragionev•¸èolmen“te›#denire–"YYSTYPE‘in“moGdo“c¸èhe“sia˜una“'union'“nello“stesso˜moGdo,‘'ˆma“Y‘ÿ*¸A¸èCC‘ha“unŽ¡metošGdo–U pi€ù“semplice“p˜er“fare“questo:‘q€il“comando“%union.Ž¦BasandoGci›΃sull'esempio–΄4,‘éosi“pu€ò˜ora˜scriv¸èere“la˜grammatica˜pGer“Y‘ÿ*¸A•¸èCC‘Îadell'Esempio˜7.‘D¢Prima˜l'in“troGduzione:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ%token–¹NTOKSTUFA“TOKRISCALDAMENTO“TOKOBIETTIVO“TOKTEMPERATURAŽ¤ Š=¡‘%unionŽ¡‘{Ž¡‘>Êrint‘¹Nnumero;Ž¡‘>Êrchar‘¹N*stringa;Ž¡‘}Ž¡¡‘%token–¹N“STATOŽ¡‘%token–¹N“NUMEROŽ¡‘%token–¹N“PAROLAŽŸؼ¹Si–ý€è›üdenita“la˜'union',‘5ôcš¸èhe“con˜tiene‘üsoltan˜to“un‘ün˜umero“e“una‘üstringa.‘P˜oi“usando‘üuna“sin˜tassi‘üestesa“diŽ¤ ®%tokš¸èen–U si“€è“spiegato“a“Y‘ÿ*¸A˜CC“a“quale“parte“della“'union'“ciascuna“categoria“do˜vrebbGe“accedere.Ž¦In–ápquesto“caso,›„si“€è“pGermesso“alla“categoria“ST–ÿ*¸A“TO‘áKdi–ápusare“un“in¸ètero,˜come“prima.‘pLa“stessa“cosa“pGer“ilŽ¡sim•¸èbGolo›U NUMER“O˜c“he˜viene˜usato˜p•Ger˜leggere˜la˜temp“eratura.Ž¦Nuo•¸èv“o›U in“v“ece˜€è˜il˜sim“bGolo˜P‘ÿ*¸AR“OLA,˜c“he˜€è˜dic“hiarato˜necessitare˜una˜stringa.Ž¦Ancš¸èhe–U il“le“dell'Analizzatore“lessicale“(Lexer)“cam˜bia“un“pGo':ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æ%{Ž¤ Š=‘#include‘¹NŽ¡‘#include‘¹NŽ¡‘#include‘¹N"y.tab.h"Ž¡‘%}Ž¡‘%%Ž¡‘[0-9]+‘B"Dyylval.numero=atoi(yytext);–¹Nreturn“NUMERO;Ž¡‘stufa‘FÛ’return‘¹NTOKSTUFA;Ž¡‘riscaldamento‘!"return‘¹NTOKRISCALDAMENTO;Ž¡‘acceso|spento‘!"yylval.numero=!strcmp(yytext,"acceso");–¹Nreturn“STATO;ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹ “ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.19) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ7.‘ñ8Debugging’„/D¹19Ž’ÕÁGï color popŽŽ £n ýˆ.\‘Æobiettivo‘3öZreturn‘¹NTOKOBIETTIVO;Ž¤ Š=‘temperatura‘*ƒ¾return‘¹NTOKTEMPERATURA;Ž¡‘[a-z0-9]+‘3öZyylval.stringa=strdup(yytext);return‘¹NPAROLA;Ž¡‘\n‘U|/*–¹Nignora“fine“linea“*/;Ž¡‘[–¹N\t]+‘B"D/*“ignora“spazi“bianchi“*/;Ž¡‘%%ŽŸؼ¹Come–si›pu€ò“v¸èedere,‘$Lnon“si“accede˜pi€ù“direttamen¸ète“a˜yylv‘ÿqÐal,‘$Ksi˜aggiunge“un“susso˜c¸èhe“indica“a˜quale“parteŽ¤ ®di–1¹esso“si“vuole“accedere.‘LNon“si“ha“bisogno“di“farlo“nella“grammatica“pšGer“Y‘ÿ*¸A¸èCC‘1€p˜er€ò,‘hàvisto“cš¸èhe“Y‘ÿ*¸A˜CCŽ¡compie–U la“magia“da“s€é:Ž©´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æscegli_stufa:Ž¤ Š=‘>ÊrTOKSTUFA‘¹NPAROLAŽ¡‘>Êr{Ž¡‘d”âprintf("\tScelta–¹Nstufa“'%s'\n",$2);Ž¡‘d”âstufa=$2;Ž¡‘>Êr}Ž¡‘>Êr;ŽŸؼ¹A‘Øaseguito–Ø‚della“dicš¸èhiarazione‘؃del“%tok˜en›؃di“cui˜sopra,‘ù[Y‘ÿ*¸A•¸èCC‘Ø`sceglie˜automaticamen“te‘Ø‚il˜mem“bro‘Ø‚'stringa'Ž¤ ®dalla–3¥nostra›3¤'union'.‘fWSi“noti˜pure“c¸èhe˜si“€è“memorizzata˜una“copia˜di“$2,‘:Wc•¸èhe˜successiv‘ÿqÐamen“te–3¥viene˜usata“pGerŽ¡dire–U all'uten¸ète“a“quale“stufa“sta“mandando“comandi:Ž¦ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Ætarget_set:Ž¤ Š=‘>ÊrTOKOBIETTIVO–¹NTOKTEMPERATURA“NUMEROŽ¡‘>Êr{Ž¡‘d”âprintf("\tPer–¹Nstufa“'%s'“temperatura“impostata“a“%d\n",stufa,$3);Ž¡‘>Êr}Ž¡‘>Êr;ŽŸؼ¹P¸èer–U maggiori“dettagli“leggere“esempio7.y‘ÿ*¸.ŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [ /View [/XYZ H.V] /Dest (section.7) cvn H.B /DEST pdfmark endŸ¾À7Ž‘ÁDebuggingŽŸ¿:¹SpšGecialmen¸ète–PÁquando“si“sta“imparando“€è“imp˜ortanš¸ète“a˜v˜ere“strumen˜ti‘PÂpGer“il“debugging.‘¶F‘ÿ*¸ortunatamen˜te“Y‘ÿ*¸A˜CCŽ¤ ®pu€ò–õídare“molte“informazioni.‘SèQueste“informazioni“ric¸èhiedono“alcune“attivit€à“addizionali,‘!cos€ì“€è“necessarioŽ¡fornire–U qualc¸èhe“opzione“pGer“abilitarle.Ž©ؼQuando–(Äsi“compila›(Åla“grammatica“si“dev¸èe“aggiungere˜debug“e“v¸èerbGose“alla“linea“di˜comando“di“Y‘ÿ*¸A¸èCC.Ž¡Nella–U testata“C“della“grammatica“aggiungere“la“seguen¸ète“denizione:Ž¦in¸èt‘U yydebug=1;Ž¦Questo–U generer€à“il“le“'y‘ÿ*¸.output'“cš¸èhe“spiega“la“macc˜hina“degli“stati“c˜he“€è“stata“creata.Ž¦Quando–b/si“lancia›b0il“binario“generato,‘esv¸èerr€à“mostrato˜*molto*“di“quello“c¸èhe“sta˜succendendo,‘esincluso“a“qualeŽ¡stato–U la“maccš¸èhina“degli“stati“si“tro˜v‘ÿqÐa“attualmen˜te,“e“quale“categoria“si“sta“leggendo.Ž¦Pš¸èeter–ÑdJinks“ha“scritto“una‘Ñepagina“in“Ädebugging“ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://www.cs.man.ac.uk/~pjj/cs2121/debug.htmlï color popŽ’ñpèŸù¨ïps:SDict begin H.R endŽ’ñpèï«ps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://www.cs.man.ac.uk/~pjj/cs2121/debug.html) >> /Subtype /Link H.B /ANN pdfmark endï color pop“¹c˜heŽ¡conš¸ètiene–U alcuni“errori“com˜uni“e“come“risolv˜erli.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹.Žïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.20) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ7.‘ñ8Debugging’„/D¹20Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.7.1) cvn H.B /DEST pdfmark endŸ Ã7.1Ž‘¾La–¸macc hina“degli“statiŽŸMª¹In•¸èternamen“te,‘t1l'Analizzatore–mûlessicale›múdi“Y‘ÿ*¸A¸èCC‘môesegue“una˜cosiddetta“'macc¸èhina˜degli“stati'.‘¼Come˜il“nomeŽ¤ ®suggerisce–á€è›âuna“macc•¸èhina˜c“he–ápu€ò˜assumere“molti˜stati.‘_Ci“sono˜pGoi“regole˜cš¸èhe“go˜v˜ernano›âi“passaggi˜da“unoŽ¡stato–úa›úun“altro.‘S!T‘ÿ*¸utto“parte˜con“la˜cosiddetta“regola˜c¸èhe“ho˜c¸èhiamato“'radice'˜menzionata“preceden•¸ètemen“te.Ž©ؼP¸èer–U citare“dall'uscita“dell'Esempio“6“y‘ÿ*¸.output:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æstato‘¹N0Ž¤ Š=¡‘+å:0–¹N$accept:“.“comandi“$endŽ¡¡‘+å:$default‘%Êpriduzione–¹Ncon“la“regola“1“(comandi)Ž¡¡‘+å:comandi‘*ƒ¾prosecuzione–¹Nallo“stato“1Ž¡¡‘stato‘¹N1Ž¡¡‘+å:0–¹N$accept:“comandi“.“$endŽ¡‘+å:2–¹Ncomandi:“comandi“.“comando“PUNTOEVIRGOLAŽ¡¡‘+å:$end‘ž†shift–¹Ne“prosecuzione“allo“stato“2Ž¡‘+å:ZONETOK‘ rœshift–¹Ne“prosecuzione“allo“stato“3Ž¡¡‘+å:comando‘!"prosecuzione–¹Nallo“stato“4Ž¡‘+å:imposta_zone‘ rœprosecuzione–¹Nallo“stato“5ŽŸؼ¹P¸èer–kdefault,‘p–questo“stato›kriduce“l'uso˜della“regola˜'comandi'.‘³jQuesta˜€è“la˜regola“ricorsiv‘ÿqÐa˜menzionata“primaŽ¤ ®cš¸èhe–SÕdenisce“'comandi'“come“insieme‘SÖdi“dic˜hiarazioni“di“comandi“individuali,‘Tseguita‘SÖda“un“pun˜to“e“virgola,Ž¡seguito›U ev•¸èen“tualmen“te˜da˜altri˜comandi.Ž¦Questo› wstato‘ xcon•¸ètin“ua˜a– xridurre˜la“frase˜sino˜a“quando˜non“incon¸ètra˜qualcosa“c¸èhe˜€è˜in“grado˜di“capire,‘6inŽ¡questo–Âßcaso,›ÞNun‘ÂÞZONETOK,“cioG€è,˜la“parola“'zone'.‘º»V‘ÿ*¸a“quindi“allo‘ÂÞstato“3,˜cš¸èhe“ha‘ÂÞulteriormen˜te“a‘ÂÞc˜he“fareŽ¡con–U un“comando“di“zona:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Æstate‘¹N3Ž¤ Š=¡‘+å:4–¹Nimposta_zone:“ZONETOK“.“nomefradoppiapici“contenutozoneŽ¡¡‘+å:DOPPIOAPICE‘ rœshift–¹Ne“prosecuzione“allo“stato“6Ž¡¡‘+å:nomefradoppiapici‘ rœprosecuzione–¹Nallo“stato“7ŽŸؼ¹La–„„prima“linea“conš¸ètiene“un‘„…'.'‘ÿ¬pGer“indicare“do˜v˜e“si“€è:‘ÐIsi“€è“appGena“visto“un“ZONETOK‘„xe“si‘„…€è“in“cerca“di“unŽ¤ ®'nomefradoppiapici'.‘{»Apparen•¸ètemen“te–­ßun›­Þnomefradoppiapici“comincia˜con“un˜DOPPIOš¸èAPICE,“c˜he‘­ÞmandaŽ¡la–U macc¸èhina“allo“stato“6.Ž¦Pš¸èer– oandare“oltre“con“l'esempio,‘*ùutilizzare“l'Esempio“6“c˜he“con˜tiene“le“opzioni“citate“nella“sezione“Debugging,Ž¡oppure–U aggiungete“le“opzioni“all'Esempio“7,“ricompilate,“eseguite,“ed“esaminate“y‘ÿ*¸.output.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹<ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.21) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ8.‘ñ8Ulteriori‘Õletture’hÛ¤¹21Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [ /View [/XYZ H.V] /Dest (subsection.7.2) cvn H.B /DEST pdfmark endŸ Ã7.2Ž‘¾Conitti:‘ÿ 'sp_úosta/riduci',‘¸'riduci/riduci'ŽŸMª¹Quando›.ªY‘ÿ*¸A•¸èCC‘.¡a“vvisa–.«di˜un˜conitto,‘6\€è˜probabile“ci˜si“tro¸èvi˜nei“guai.‘d®La˜soluzione“di˜questi“conitti˜sem¸èbraŽ¤ ®essere–‚–in›‚•qualc¸èhe“moGdo“una˜forma“d'arte“c¸èhe“pu€ò˜insegnare“molto“a˜propGosito“del“linguaggio˜in“denizione.Ž¡Pi€ù–U di“quanš¸èto“non“si“sarebbGe“v˜oluto“sapGere.ŽŸؼI‘ƒSproblemi–ƒ¡girano‘ƒ¢inš¸ètorno“al“moGdo“d'in˜terpretare›ƒ¢una“sequenza“di“categorie.‘ýSi“suppGonga˜di“denire“unŽ¡linguaggio–U cš¸èhe“dev˜e“essere“in“grado“di“accettare“en˜tram˜bi“questi“comandi:Ž¤µïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘>ÊrÆcancella–¹Nstufa“tutteŽ© Š=‘>Êrcancella–¹Nstufa“numeroŽŸ*‹¹P¸èer–U farlo“si“denisce“la“grammatica:Ž¡ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘>ÊrÆcancella_stufe:Ž¦‘d”âTOKCANCELLA–¹NTOKSTUFA“modoŽ¦‘d”â{Ž¦’Š_Rcancellastufe($3);Ž¦‘d”â}Ž¦¦‘>Êrmodo:‘+êPAROLAŽ¦¦‘>Êrcancella_una_stufa:Ž¦‘d”âTOKCANCELLA–¹NTOKSTUFA“PAROLAŽ¦‘d”â{Ž¦’Š_Rcancella($3);Ž¦‘d”â}ŽŸ*‹¹Si–ann¸èusa›gi€à“oGdore˜di“guai.‘^ÐLa˜macc¸èhina“degli˜stati“comincia˜leggendo“la˜parola“'delete'˜e“dev¸èe˜pGoi“decidereŽ¤ ®do•¸èv“e–ˆŠandare“basandosi›ˆ‹sulla“successiv‘ÿqÐa“categoria.‘-NQuesta˜prossima“categoria“pu€ò“essere“un˜mošGdo“c¸èhe“sp˜ecicaŽ¡come–U cancellare“le“stufe,“oppure“il“nome“di“una“stufa“da“cancellare.Ž©ؼIl–)problema›)€è“c¸èhe˜pGer“en•¸ètram“bi˜i–)comandi˜la“prossima˜categoria“sar€à“una˜P›ÿ*¸AR¸èOLA.“Y˜A¸èCC‘(ùquindi“non‘)ha“laŽ¡minima–t{idea“su›tzcosa“fare.‘Ï‘Questo“pGorta˜ad“un“a¸èvviso“di“'riduzione/riduzione',‘|Qe“a“un“ulteriore˜aš¸èvviso“c˜he“ilŽ¡noGdo–U 'cancella_una_stufa'“non“vš¸èerr€à“mai“raggiun˜to.Ž¦In–Îèquesto“caso›Îéil“conitto“€è“risolto“facilmen¸ète˜(cioG€è“rinominando“il“primo˜comando“in“'cancel-Ž¡la_tutte_le_stufe',‘yo–¯Îfacendo“div•¸èen“tare–¯Îuna“categoria“separata›¯Í'tutte'),‘zma“qualc•¸èhe˜v“olta–¯Î€è“pi€ù“dicileŽ¡v¸èenirne–‘­fuori.‘'(Il“le›‘®y‘ÿ*¸.output“generato“quando˜si“passa“a“y¸èacc˜l'opzione“v¸èerbGose“pu€ò“essere˜di“grandissimoŽ¡aiuto.ŽŸš±ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [ /View [/XYZ H.V] /Dest (section.8) cvn H.B /DEST pdfmark endŸ¯ÆÀ8Ž‘ÁUlteriori‘G\lettureŽŸ¿:¹GNU‘ïY‘ÿ*¸Aš¸èCC‘î(Bison)–!viene“fornito“con“un‘ info-le“(.info)“molto“bGello“c˜he“doGcumen˜ta‘ la“sin˜tassi“di“Y‘ÿ*¸A˜CCŽ¡molto–¶ubšGene.‘•Menziona‘¶vLex“solo“una“v¸èolta,‘ÎÊma“p˜er›¶valtri“v¸èersi“€è“molto“buono.‘•Si˜pGossono“leggere“i“le“.infoŽ¡con–U Emacs“o“con“quello“strumenš¸èto“molto“bGello“c˜he“€è“'pinfo'.‘q€€È“dispGonibile“anc˜he“sul“sito“GNU:Ž¦ÄBISON‘“°Manual–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://www.gnu.org/manual/bison/ï color popŽ’§õ€Ÿù¨ïps:SDict begin H.R endŽ’§õ€ïps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://www.gnu.org/manual/bison/) >> /Subtype /Link H.B /ANN pdfmark endï color pop“¹.Ž¦Flex–<µviene“fornito“con›<¶una“buona“manpage“c¸èhe“€è“molto“utile˜se“si“ha“gi€à“una“comprensione˜a“grandi“linee“diŽ¡cosa–U faccia“Flex.‘q€IlŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹IPïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.22) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ9.‘ñ8Riconoscimenš®>ti–Õe“ringraziamen˜ti’×v¹22Ž’ÕÁGï color popŽŽ £n ýˆ.\ÄManuale‘“°Flex–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://www.gnu.org/manual/flex/ï color popŽ’¢µÔŸù¨ïps:SDict begin H.R endŽ’¢µÔïœps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://www.gnu.org/manual/flex/) >> /Subtype /Link H.B /ANN pdfmark endï color pop“¹€è“anc¸èhe“dispGonibile“online.ŽŸؼDop•Go›&l'in¸ètro“duzione–%di˜Lex“e˜Y‘ÿ*¸A¸èCC‘€è˜probabile“ci˜si“accorga˜c¸èhe˜si“ha˜necessit€à“di˜maggiori˜informazioni.‘W×IoŽ¤ ®non–U ho“ancora“letto“alcuno“di“questi“libri,“ma“sono“buoni:ŽŸؼ‘ûïcolor push Black‘ÁBison-The–ÕY‘ÿ ºacc-Compatible“P®>arser“Generatorï color popŽŽŽ©®‘¹Di–~¥Charles›~¤Donnelly“e“Ric¸èhard˜Stallman.‘1îUn“uten¸ète˜di“ÄA¾˜mazonŽ¡‘ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://www.amazon.com/exec/obidos/ASIN/0595100325/qid=989165194/sr=1-–€2/ref=sc_b_3/002-“7737249-“1404015ï color popŽ’žÜŸù¨ïps:SDict begin H.R endŽ’žÜïâps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://www.amazon.com/exec/obidos/ASIN/0595100325/qid=989165194/sr=1-2/ref=sc_b_3/002-7737249-1404015) >> /Subtype /Link H.B /ANN pdfmark endï color popŽ¡‘¹lo–U ha“tro¸èv‘ÿqÐato“utile.ŽŸ®‘ûïcolor push Black‘ÁLex–Õ&“Y‘ÿ ºaccï color popŽŽŽ¦‘¹Di– açJohn› aæR.“Levine,‘ %T‘ÿ*¸on¸èy˜Mason“e“Doug˜Bro¸èwn.‘—Հȑ `considerato“il˜la•¸èv“oro‘ açstan-Ž¡‘dard› ƒ9sull'argomen•¸èto,‘ Àanc“he˜se– ƒ:€è˜un“pGo'˜datato.‘ûÌRecensioni˜su“di˜esso“su˜ÄA¾˜mazonŽ¡‘ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://www.amazon.com/exec/obidos/ASIN/1565920007/ref=sim_books/002-–€7737249-“1404015ï color popŽ’´¤ÄŸù¨ïps:SDict begin H.R endŽ’´¤ÄïÐps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://www.amazon.com/exec/obidos/ASIN/1565920007/ref=sim_books/002-7737249-1404015) >> /Subtype /Link H.B /ANN pdfmark endï color pop‘U ¹.ŽŸ®‘ûïcolor push Black‘ÁCompilers–Õ:‘ Principles,“T›ÿ ºec®>hniques,“and“T˜oQÂolsï color popŽŽŽ¦‘¹Di–RûAlfred›RúV.“Aho,‘ShRa¸èvi˜Sethi,‘SiJerey˜D.“Ullman.‘pÉIl˜'Dragon“BoGok'.‘pɀȑRùuscito“nel˜1985“e˜lo“con•¸ètin“uanoŽ¡‘a–U ristampare.‘q€Considerato“il“la•¸èv“oro–U standard“sulla“costruzione“di“compilatori.Ž¦‘ÄA¾˜mazon‘8Àïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://www.amazon.com/exec/obidos/ASIN/0201100886/ref=sim_books/002-–€7737249-“1404015ï color popŽ’´¤ÄŸù¨ïps:SDict begin H.R endŽ’´¤ÄïÐps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://www.amazon.com/exec/obidos/ASIN/0201100886/ref=sim_books/002-7737249-1404015) >> /Subtype /Link H.B /ANN pdfmark endï color popŽŸؼ¹Thomas–‡ìNiemann“ha‘‡íscritto“un“doGcumenš¸èto“c˜he“spiega‘‡ícome“scriv˜ere“compilatori“e“calcolatori‘‡ícon“Lex“eŽ¡Y‘ÿ*¸Aš¸èCC.–U Lo“si“pu€ò“tro˜v‘ÿqÐare“Äqui“ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://epaperpress.com/lexandyacc/index.htmlï color popŽ’æñŸù¨ïps:SDict begin H.R endŽ’æñï©ps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://epaperpress.com/lexandyacc/index.html) >> /Subtype /Link H.B /ANN pdfmark endï color pop“¹.Ž©ؼIl–ôïnewsgroup“mošGderato“comp.compilers‘ôîpu€ò“essere“utile“ma“o˜ccorre“tenere“a“men•¸ète‘ôîc“he–ôïle“p˜ersone“nonŽ¡sono–Viun›VhhelpGdesk“dedicato˜agli“analizzatori!‘ uZPrima˜di“pGostare˜si“legga˜la“loro˜in•¸èteressan“te‘ViÄp‘ÿ}/aginaŽ¡ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://compilers.iecc.com/ï color popŽ’ˆwxŸù¨ïps:SDict begin H.R endŽ’ˆwxï—ps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://compilers.iecc.com/) >> /Subtype /Link H.B /ANN pdfmark endï color pop–U ¹e“spGecialmen¸ète“la“ÄF‘þú_A¾˜Q“ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://compilers.iecc.com/faq.txtï color popŽ’­5,Ÿù¨ïps:SDict begin H.R endŽ’­5,ïžps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://compilers.iecc.com/faq.txt) >> /Subtype /Link H.B /ANN pdfmark endï color pop“¹.Ž¦Lex–ûA-›ûBA‘û+Lexical“Analyzer˜Generator“b¸èy“M.˜E.“Lesk˜e“E.˜Sc¸èhmidt“€è˜uno“dei˜doGcumen¸èti“di˜riferimen¸èto“originaliŽ¡pGer–U Lex.‘q€Si“pu€ò“tro¸èv‘ÿqÐareŽ¦Äqui–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://www.cs.utexas.edu/users/novak/lexpaper.htmï color popŽ’/ìŸù¨ïps:SDict begin H.R endŽ’/ìï®ps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://www.cs.utexas.edu/users/novak/lexpaper.htm) >> /Subtype /Link H.B /ANN pdfmark endï color pop“¹.Ž¦Y–ÿ*¸acc:‘ÖY“et–¦ËAnother›¦ÊCompiler-Compiler“di“Stephen“C.“Johnson“€è“uno“dei˜doGcumenš¸èti“di“riferimen˜to“originaliŽ¡pGer–U Y‘ÿ*¸Aš¸èCC.“Si“pu€ò“tro˜v‘ÿqÐareŽ¦Äqui–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://www.cs.utexas.edu/users/novak/yaccpaper.htmï color popŽ’o˜Ÿù¨ïps:SDict begin H.R endŽ’o˜ï¯ps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://www.cs.utexas.edu/users/novak/yaccpaper.htm) >> /Subtype /Link H.B /ANN pdfmark endï color pop“¹.‘q€Conš¸ètiene“utili“suggerimen˜ti“di“stile.ŽŸI–ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [ /View [/XYZ H.V] /Dest (section.9) cvn H.B /DEST pdfmark endŸwÀ9Ž‘ÁRiconoscimenšcti–G\e“ringraziamen˜tiŽŸ”’ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹P¸èete–U Jinks“µ<¹p‘Ž0jj%cs.man.ac.ukµ>Ž¤®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Chris–U Lattner“µ<¹sabre%nondot.orgµ>Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹John–U W.“Milla•¸èw“a“y‘U µ<¹johnmilla“w“a“y%y“ahoGo.comµ>Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Martin–U Neitzel“µ<¹neitzel%gaertner.deµ>Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Sumit›U P•¸èanda“y“a˜µ<¹sumit%elitecore.comµ>Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Esmond–U Pitt“µ<¹esmond.pitt%bigpGond.comµ>Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Eric–U S.“Ra¸èymondŽŽŸïcolor push Black’ÕÁGï color popŽŽŒ‹Y!ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end ©K… ý>‘ìïcolor push Blackïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popŽïps:SDict begin H.R endïKps:SDict begin [ /View [/XYZ H.V] /Dest (page.23) cvn H.B /DEST pdfmark endï color popŸ„€ÕÁGŽÁ9.‘ñ8Riconoscimenš®>ti–Õe“ringraziamen˜ti’×v¹23Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Bob–U Scš¸èhmertz“µ<¹sc˜hmertz%w˜am.umd.eduµ>Ž¤®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹A•¸èdam›U Sulmic“ki˜µ<¹adam%cfar.umd.eduµ>Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Markus–U T‘ÿ*¸risk›ÿqÐa“µ<¹trisk˜a%gmx.atµ>Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Erik–U V‘ÿ*¸erbruggen“µ<¹erik%road-w¸èarrior.cs.kun.nlµ>Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Gary–‚%V.“V‘ÿ*¸aughan›‚$µ<¹gary%gn¸èu.orgµ>“¹(leggete“il“suo˜splendido“ÄA¾˜utob–ÿ}/o“okŽŸ ®‘ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://sources.redhat.com/autobookï color popŽ’²tØŸù¨ïps:SDict begin H.R endŽ’²tØïŸps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://sources.redhat.com/autobook) >> /Subtype /Link H.B /ANN pdfmark endï color pop‘U ¹)Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘ÄIvo–“°van“der“Wijk–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://vanderwijk.infoï color popŽ‘sxÈŸù¨ïps:SDict begin H.R endŽ‘sxÈï“ps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://vanderwijk.info) >> /Subtype /Link H.B /ANN pdfmark endï color pop“¹(ŽŸ®‘ÄA¾˜maze‘“°Internet–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¾http://www.amaze.nlï color popŽ‘c¹ÄŸù¨ïps:SDict begin H.R endŽ‘c¹Äïps:SDict begin [ /H /I /Border [0 0 0] /Color [0 1 1] /Action << /Subtype /URI /URI (http://www.amaze.nl) >> /Subtype /Link H.B /ANN pdfmark endï color pop“¹)ŽŽŸïcolor push Black’ÕÁGï color popŽŽŒøtƒ’À;è©K…ÕÁGó5ùž" cmmi9óqLË ectt0900ó½HЃ ecti1000ó¥!¢N ecbx1200ó]fŒ ecbx1000ó&Lt$ffffecbx1440óqLË ectt1000óø8‹ ecsi1000óŒ6 ecss1000óþÖëI½q½qecss2074ó 1ê± ecrm1000ó !",š cmsy10ó  b> cmmi10ù}„ßßßßesempi-lex-yacc/0000770000000000000560000000000011264776442013251 5ustar rootplugdevesempi-lex-yacc/compila.esempio10000770000000000000560000000005411264776440016341 0ustar rootplugdevlex esempio1.l cc lex.yy.c -o esempio1 -lfl esempi-lex-yacc/compila.esempio20000770000000000000560000000005411264776440016342 0ustar rootplugdevlex esempio2.l cc lex.yy.c -o esempio2 -lfl esempi-lex-yacc/compila.esempio30000770000000000000560000000005411264776441016344 0ustar rootplugdevlex esempio3.l cc lex.yy.c -o esempio3 -lfl esempi-lex-yacc/compila.esempio40000770000000000000560000000010311264776441016340 0ustar rootplugdevlex esempio4.l yacc -d esempio4.y cc lex.yy.c y.tab.c -o esempio4 esempi-lex-yacc/compila.esempio50000770000000000000560000000010311264776441016341 0ustar rootplugdevlex esempio5.l yacc -d esempio5.y cc lex.yy.c y.tab.c -o esempio5 esempi-lex-yacc/compila.esempio60000770000000000000560000000012511264776441016346 0ustar rootplugdevlex esempio6.l yacc --verbose --debug -d esempio6.y cc lex.yy.c y.tab.c -o esempio6 esempi-lex-yacc/compila.esempio70000770000000000000560000000010311264776441016343 0ustar rootplugdevlex esempio7.l yacc -d esempio7.y cc lex.yy.c y.tab.c -o esempio7 esempi-lex-yacc/esempio1.l0000770000000000000560000000016311264776441015152 0ustar rootplugdev%{ #include %} %% stop printf("Ricevuto comando Stop\n"); start printf("Ricevuto comando Start\n"); %% esempi-lex-yacc/esempio2.l0000770000000000000560000000015511264776441015154 0ustar rootplugdev%{ #include %} %% [0123456789]+ printf("NUMERO\n"); [a-zA-Z][a-zA-Z0-9]* printf("PAROLA\n"); %% esempi-lex-yacc/esempio3.input0000770000000000000560000000021611264776441016057 0ustar rootplugdevlogging { category lame-servers { null; }; category cname { null; }; }; zone "." { type hint; file "/etc/bind/db.root"; }; esempi-lex-yacc/esempio3.l0000770000000000000560000000062611264776441015160 0ustar rootplugdev%{ #include %} %% [a-zA-Z][a-zA-Z0-9]* printf("PAROLA "); [a-zA-Z0-9\/.-]+ printf("NOMEFILE "); \" printf("DOPPIOAPICE "); \{ printf("APERTAGRAFFA "); \} printf("CHIUSAGRAFFA "); ; printf("PUNTOEVIRGOLA "); \n printf("\n"); [ \t]+ /* ignora spazi bianchi */; %% esempi-lex-yacc/esempio3.out0000770000000000000560000000056211264776441015533 0ustar rootplugdevPAROLA APERTAGRAFFA PAROLA NOMEFILE APERTAGRAFFA PAROLA PUNTOEVIRGOLA CHIUSAGRAFFA PUNTOEVIRGOLA PAROLA PAROLA APERTAGRAFFA PAROLA PUNTOEVIRGOLA CHIUSAGRAFFA PUNTOEVIRGOLA CHIUSAGRAFFA PUNTOEVIRGOLA PAROLA DOPPIOAPICE NOMEFILE DOPPIOAPICE APERTAGRAFFA PAROLA PAROLA PUNTOEVIRGOLA PAROLA DOPPIOAPICE NOMEFILE DOPPIOAPICE PUNTOEVIRGOLA CHIUSAGRAFFA PUNTOEVIRGOLA esempi-lex-yacc/esempio4.l0000770000000000000560000000056111264776441015157 0ustar rootplugdev%{ #include #include "y.tab.h" %} %% [0-9]+ return NUMERO; riscaldamento return TOKRISCALDAMENTO; acceso|spento return STATO; obiettivo return TOKOBIETTIVO; temperatura return TOKTEMPERATURA; \n /* ignora fine linea */; [ \t]+ /* ignora spazi bianchi */; %% esempi-lex-yacc/esempio4.y0000770000000000000560000000125011264776441015170 0ustar rootplugdev%{ #include #include void yyerror(const char *str) { fprintf(stderr,"errore: %s\n",str); } int yywrap() { return 1; } main() { yyparse(); } %} %token NUMERO TOKRISCALDAMENTO STATO TOKOBIETTIVO TOKTEMPERATURA %% comandi: /* vuoto */ | comandi comando ; comando: interruttore_riscaldamento | imposta_obiettivo ; interruttore_riscaldamento: TOKRISCALDAMENTO STATO { printf("\tRiscaldamento acceso o spento\n"); } ; imposta_obiettivo: TOKOBIETTIVO TOKTEMPERATURA NUMERO { printf("\tTemperatura impostata\n"); } ; esempi-lex-yacc/esempio5.l0000770000000000000560000000065011264776441015157 0ustar rootplugdev %{ #include #include "y.tab.h" %} %% [0-9]+ yylval=atoi(yytext); return NUMERO; riscaldamento return TOKRISCALDAMENTO; acceso|spento yylval=!strcmp(yytext,"acceso"); return STATO; obiettivo return TOKOBIETTIVO; temperatura return TOKTEMPERATURA; \n /* ignora fine linea */; [ \t]+ /* ignora spazi bianchi */; %% esempi-lex-yacc/esempio5.y0000770000000000000560000000140611264776441015174 0ustar rootplugdev%{ #include #include void yyerror(const char *str) { fprintf(stderr,"errore: %s\n",str); } int yywrap() { return 1; } main() { yyparse(); } %} %token NUMERO TOKRISCALDAMENTO STATO TOKOBIETTIVO TOKTEMPERATURA %% comandi: /* vuoto */ | comandi comando ; comando: interruttore_riscaldamento | imposta_obiettivo ; interruttore_riscaldamento: TOKRISCALDAMENTO STATO { if($2) printf("\tRiscaldamento acceso\n"); else printf("\tRiscaldamento spento\n"); } ; imposta_obiettivo: TOKOBIETTIVO TOKTEMPERATURA NUMERO { printf("\tTemperatura impostata a %d\n",$3); } ; esempi-lex-yacc/esempio6.input0000770000000000000560000000010311264776442016056 0ustar rootplugdevzone "." { type hint; file "/etc/bind/db.root"; }; esempi-lex-yacc/esempio6.l0000770000000000000560000000077111264776442015165 0ustar rootplugdev%{ #include #include "y.tab.h" %} %% zone return ZONETOK; file return FILETOK; [a-zA-Z][a-zA-Z0-9]* yylval=strdup(yytext); return PAROLA; [a-zA-Z0-9\/.-]+ yylval=strdup(yytext); return NOMEFILE; \" return DOPPIOAPICE; \{ return APERTAGRAFFA; \} return CHIUSAGRAFFA; ; return PUNTOEVIRGOLA; \n /* ignora fine linea */; [ \t]+ /* ignora spazi bianchi */; %% esempi-lex-yacc/esempio6.y0000770000000000000560000000203611264776442015176 0ustar rootplugdev%{ #include #include #define YYSTYPE char * int yydebug=0; void yyerror(const char *str) { fprintf(stderr,"errore: %s\n",str); } int yywrap() { return 1; } main() { yyparse(); } %} %token PAROLA NOMEFILE DOPPIOAPICE APERTAGRAFFA CHIUSAGRAFFA PUNTOEVIRGOLA ZONETOK FILETOK %% comandi: | comandi comando PUNTOEVIRGOLA ; comando: imposta_zone ; imposta_zone: ZONETOK nomefradoppiapici contenutozone { printf("Zone completa trovata per '%s'\n",$2); } ; contenutozone: APERTAGRAFFA dichiarazionizone CHIUSAGRAFFA nomefradoppiapici: DOPPIOAPICE NOMEFILE DOPPIOAPICE { $$=$2; } ; dichiarazionizone: | dichiarazionizone dichiarazionezona PUNTOEVIRGOLA ; dichiarazionezona: dichiarazioni | FILETOK nomefradoppiapici { printf("Nome di file zone '%s' trovato\n",$2); } ; blocco: APERTAGRAFFA dichiarazionizone CHIUSAGRAFFA PUNTOEVIRGOLA ; dichiarazioni: | dichiarazioni dichiarazione ; dichiarazione: PAROLA | blocco | nomefradoppiapici esempi-lex-yacc/esempio7.l0000770000000000000560000000103211264776442015155 0ustar rootplugdev%{ #include #include #include "y.tab.h" %} %% [0-9]+ yylval.numero=atoi(yytext); return NUMERO; stufa return TOKSTUFA; riscaldamento return TOKRISCALDAMENTO; acceso|spento yylval.numero=!strcmp(yytext,"acceso"); return STATO; obiettivo return TOKOBIETTIVO; temperatura return TOKTEMPERATURA; [a-z0-9]+ yylval.stringa=strdup(yytext);return PAROLA; \n /* ignora fine linea */; [ \t]+ /* ignora spazi bianchi */; %% esempi-lex-yacc/esempio7.y0000770000000000000560000000154211264776442015200 0ustar rootplugdev%{ #include #include void yyerror(const char *str) { fprintf(stderr,"errore: %s\n",str); } int yywrap() { return 1; } main() { yyparse(); } char *stufa="default"; %} %token TOKSTUFA TOKRISCALDAMENTO TOKOBIETTIVO TOKTEMPERATURA %union { int numero; char *stringa; } %token STATO %token NUMERO %token PAROLA %% comandi: | comandi comando ; comando: interruttore_stufa | imposta_obiettivo | scegli_stufa interruttore_stufa: TOKRISCALDAMENTO STATO { if($2) printf("\tStufa '%s' accesa\n", stufa); else printf("\tStufa '%s' spenta\n", stufa); } ; imposta_obiettivo: TOKOBIETTIVO TOKTEMPERATURA NUMERO { printf("\tPer stufa '%s' temperatura impostata a %d\n",stufa, $3); } ; scegli_stufa: TOKSTUFA PAROLA { printf("\tScelta stufa '%s'\n",$2); stufa=$2; } ; esempi-lex-yacc/y.output0000770000000000000560000001466011264776442015015 0ustar rootplugdevGrammatica 0 $accept: comandi $end 1 comandi: /* vuoto */ 2 | comandi comando PUNTOEVIRGOLA 3 comando: imposta_zone 4 imposta_zone: ZONETOK nomefradoppiapici contenutozone 5 contenutozone: APERTAGRAFFA dichiarazionizone CHIUSAGRAFFA 6 nomefradoppiapici: DOPPIOAPICE NOMEFILE DOPPIOAPICE 7 dichiarazionizone: /* vuoto */ 8 | dichiarazionizone dichiarazionezona PUNTOEVIRGOLA 9 dichiarazionezona: dichiarazioni 10 | FILETOK nomefradoppiapici 11 blocco: APERTAGRAFFA dichiarazionizone CHIUSAGRAFFA PUNTOEVIRGOLA 12 dichiarazioni: /* vuoto */ 13 | dichiarazioni dichiarazione 14 dichiarazione: PAROLA 15 | blocco 16 | nomefradoppiapici Simboli terminali e regole in cui appaiono $end (0) 0 error (256) PAROLA (258) 14 NOMEFILE (259) 6 DOPPIOAPICE (260) 6 APERTAGRAFFA (261) 5 11 CHIUSAGRAFFA (262) 5 11 PUNTOEVIRGOLA (263) 2 8 11 ZONETOK (264) 4 FILETOK (265) 10 Simboli nonterminali e regole in cui appaiono $accept (11) nel primo membro: 0 comandi (12) nel primo membro: 1 2, nel secondo membro: 0 2 comando (13) nel primo membro: 3, nel secondo membro: 2 imposta_zone (14) nel primo membro: 4, nel secondo membro: 3 contenutozone (15) nel primo membro: 5, nel secondo membro: 4 nomefradoppiapici (16) nel primo membro: 6, nel secondo membro: 4 10 16 dichiarazionizone (17) nel primo membro: 7 8, nel secondo membro: 5 8 11 dichiarazionezona (18) nel primo membro: 9 10, nel secondo membro: 8 blocco (19) nel primo membro: 11, nel secondo membro: 15 dichiarazioni (20) nel primo membro: 12 13, nel secondo membro: 9 13 dichiarazione (21) nel primo membro: 14 15 16, nel secondo membro: 13 stato 0 0 $accept: . comandi $end $default riduzione con la regola 1 (comandi) comandi prosecuzione allo stato 1 stato 1 0 $accept: comandi . $end 2 comandi: comandi . comando PUNTOEVIRGOLA $end shift e prosecuzione allo stato 2 ZONETOK shift e prosecuzione allo stato 3 comando prosecuzione allo stato 4 imposta_zone prosecuzione allo stato 5 stato 2 0 $accept: comandi $end . $default accetta stato 3 4 imposta_zone: ZONETOK . nomefradoppiapici contenutozone DOPPIOAPICE shift e prosecuzione allo stato 6 nomefradoppiapici prosecuzione allo stato 7 stato 4 2 comandi: comandi comando . PUNTOEVIRGOLA PUNTOEVIRGOLA shift e prosecuzione allo stato 8 stato 5 3 comando: imposta_zone . $default riduzione con la regola 3 (comando) stato 6 6 nomefradoppiapici: DOPPIOAPICE . NOMEFILE DOPPIOAPICE NOMEFILE shift e prosecuzione allo stato 9 stato 7 4 imposta_zone: ZONETOK nomefradoppiapici . contenutozone APERTAGRAFFA shift e prosecuzione allo stato 10 contenutozone prosecuzione allo stato 11 stato 8 2 comandi: comandi comando PUNTOEVIRGOLA . $default riduzione con la regola 2 (comandi) stato 9 6 nomefradoppiapici: DOPPIOAPICE NOMEFILE . DOPPIOAPICE DOPPIOAPICE shift e prosecuzione allo stato 12 stato 10 5 contenutozone: APERTAGRAFFA . dichiarazionizone CHIUSAGRAFFA $default riduzione con la regola 7 (dichiarazionizone) dichiarazionizone prosecuzione allo stato 13 stato 11 4 imposta_zone: ZONETOK nomefradoppiapici contenutozone . $default riduzione con la regola 4 (imposta_zone) stato 12 6 nomefradoppiapici: DOPPIOAPICE NOMEFILE DOPPIOAPICE . $default riduzione con la regola 6 (nomefradoppiapici) stato 13 5 contenutozone: APERTAGRAFFA dichiarazionizone . CHIUSAGRAFFA 8 dichiarazionizone: dichiarazionizone . dichiarazionezona PUNTOEVIRGOLA CHIUSAGRAFFA shift e prosecuzione allo stato 14 FILETOK shift e prosecuzione allo stato 15 $default riduzione con la regola 12 (dichiarazioni) dichiarazionezona prosecuzione allo stato 16 dichiarazioni prosecuzione allo stato 17 stato 14 5 contenutozone: APERTAGRAFFA dichiarazionizone CHIUSAGRAFFA . $default riduzione con la regola 5 (contenutozone) stato 15 10 dichiarazionezona: FILETOK . nomefradoppiapici DOPPIOAPICE shift e prosecuzione allo stato 6 nomefradoppiapici prosecuzione allo stato 18 stato 16 8 dichiarazionizone: dichiarazionizone dichiarazionezona . PUNTOEVIRGOLA PUNTOEVIRGOLA shift e prosecuzione allo stato 19 stato 17 9 dichiarazionezona: dichiarazioni . 13 dichiarazioni: dichiarazioni . dichiarazione PAROLA shift e prosecuzione allo stato 20 DOPPIOAPICE shift e prosecuzione allo stato 6 APERTAGRAFFA shift e prosecuzione allo stato 21 $default riduzione con la regola 9 (dichiarazionezona) nomefradoppiapici prosecuzione allo stato 22 blocco prosecuzione allo stato 23 dichiarazione prosecuzione allo stato 24 stato 18 10 dichiarazionezona: FILETOK nomefradoppiapici . $default riduzione con la regola 10 (dichiarazionezona) stato 19 8 dichiarazionizone: dichiarazionizone dichiarazionezona PUNTOEVIRGOLA . $default riduzione con la regola 8 (dichiarazionizone) stato 20 14 dichiarazione: PAROLA . $default riduzione con la regola 14 (dichiarazione) stato 21 11 blocco: APERTAGRAFFA . dichiarazionizone CHIUSAGRAFFA PUNTOEVIRGOLA $default riduzione con la regola 7 (dichiarazionizone) dichiarazionizone prosecuzione allo stato 25 stato 22 16 dichiarazione: nomefradoppiapici . $default riduzione con la regola 16 (dichiarazione) stato 23 15 dichiarazione: blocco . $default riduzione con la regola 15 (dichiarazione) stato 24 13 dichiarazioni: dichiarazioni dichiarazione . $default riduzione con la regola 13 (dichiarazioni) stato 25 8 dichiarazionizone: dichiarazionizone . dichiarazionezona PUNTOEVIRGOLA 11 blocco: APERTAGRAFFA dichiarazionizone . CHIUSAGRAFFA PUNTOEVIRGOLA CHIUSAGRAFFA shift e prosecuzione allo stato 26 FILETOK shift e prosecuzione allo stato 15 $default riduzione con la regola 12 (dichiarazioni) dichiarazionezona prosecuzione allo stato 16 dichiarazioni prosecuzione allo stato 17 stato 26 11 blocco: APERTAGRAFFA dichiarazionizone CHIUSAGRAFFA . PUNTOEVIRGOLA PUNTOEVIRGOLA shift e prosecuzione allo stato 27 stato 27 11 blocco: APERTAGRAFFA dichiarazionizone CHIUSAGRAFFA PUNTOEVIRGOLA . $default riduzione con la regola 11 (blocco)