ࡱ> KMJybjbjEE44'',<<`xxxxxSSSjllllll$K!#:SSSSSxx???Sxxj?Sj??"xOcu)dV0,'$'$"'$"4SS?SSSSS?SSSSSSS'$SSSSSSSSS :Politecnico di Torino III Facolt di Ingegneria Linguaggi e Traduttori Costruzione dinamica e grafica di alberi di derivazione Relatori: DavideBertola (matricola 113900) Luca Ardito (matricola 114093) Obiettivo Si intende costruire dinamicamente un albero di derivazione grafico utilizzando librerie GRAPPA ottimizzate per la creazione di alberi e grafi. Descrizione del progetto Si devono avere a disposizione: un file.cup, un file jflex e un file di testo che contenga i simboli terminali su cui verr disegnato lalbero di derivazione Il programma disegna graficamente lalbero di derivazione a partire da un file cup che lutente d in ingresso. In una prima fase uno scanner elimina tutte le azioni semantiche del file cup e le sostituisce con quelle necessarie affinch venga costruito lalbero. Successivamente vengono lanciati scanner (dellutente) e parser (modificato) i quali lavorano sul file di testo fornito dallutente Durante lesecuzione viene creato un file che passato come parametro alla gui disegna graficamente lalbero di derivazione Requisiti di sistema Per il corretto funzionamento del programma necessario che sia installata una java virtual machine sun (jdk 1.4.2 o superiori). Non necessario che siano installati jflex cup e le librerie grappa: allinterno del progetto sono presenti i file.jar che contengono ci che serve per eseguire il programma. Istruzioni per luso Sono presenti due script di avvio qualora si usino sistemi operativi Microsoft (win.bat) o Unix (unix.sh) Entrambi gli script hanno bisogno di quattro parametri affinch tutto funzioni correttamente: cartella in cui presente il progetto (si consiglia di utilizzare i comandi chdir (win) o pwd (unix)) file.jflex (utente) file.cup (utente) file.txt (utente) Esempi: win c:\project file.jflex file.cup file.txt => windows ./unix /home/user/project file.jflex file.cup file.txt => unix Librerie GRAPPA Grazie a queste librerie possibile scrivere una gui standard il cui contenuto dipende da un file in ingresso. Viene infatti lanciato automaticamente uno scanner che controlla che la sintassi sia corretta e successivamente si occupa di popolare la gui. Si possono gestire tanti particolari (forma del nodo, colore, tipo di carattere di testo) ma non sono stati presi in esame in quanto poco interessanti al fine di costruire un albero di derivazione corretto. Sotto riportato un esempio di file di configurazione che permette di disegnare 2 nodi elementi ed elemento di forma ovale e di colore verde collegati tra di loro. Parametri molto importanti sono le dimensioni del nodo (width,height) e la posizione (x,y) digraph "unix" { graph [ fontname = "Arial", fontcolor= black, fontsize = 24, size = "6,6" ]; node [label = "\N", shape = circle, sides = 1, distortion ="0.0", orientation ="0.0", skew ="0.0", color = white, style = filled, fontname = "Helvetica-Outline" ]; graph [lp= "800,750"]; graph [bb= "150,200,1150,1300"]; elementi_0 [label="elementi" sides=9, distortion="0", orientation=0, skew="1", color=green, pos="450,1226", width="0.5", height="0.5"]; elemento_55 [label="elemento" sides=9, distortion="0", orientation=0, skew="1", color=green, pos="300,1098", width="0.5", height="0.5"]; elementi_0 -> elemento_55 }  Funzionamento del programma Lo script iniziale prepara le variabili dambiente e successivamente passa come parametro di uno scanner il file.cup dellutente. Questo scanner sostituisce il codice java dellutente con il seguente codice: init with {: my_stack = new Stack(); :}; parser code {: public Stack my_stack; public DatWriter dat_writer; public Node parse_tree; public Symbol scan() throws java.lang.Exception { Symbol sym = getScanner().next_token(); Node n = new Node(sym.toString()); this.my_stack.push(n); if (sym!=null) { if (sym.toString().equals("#0") ) { this.parse_tree.finalize(); this.dat_writer = new DatWriter("foo.dot", this.parse_tree); } return sym; } else { return new Symbol(EOF_sym()); } } public void reduce(String nome, int k) { Node cur, looka, head; head = new Node(nome); this.parse_tree = head; looka = (Node) this.my_stack.pop(); for (int i = 0; i < k; i++) { cur = (Node) this.my_stack.pop(); head.link(cur); } this.my_stack.push(head); this.my_stack.push(looka); } public Node get_tree() { return this.parse_tree; } :}; Lascia inalterate tutte le dichiarazioni di simboli terminali e non terminali, non altera le regole ma subito dopo di ognuna va ad inserire {:parser.reduce("elementi",0); :} dove elementi il simbolo non terminale e lintero rappresenta il numero di terminali da ridurre Costruzione dellalbero e creazione dinamica del file.dot = > DADE Conclusioni ??? 6Uepw B K ` a e Ƕ~tt~j\QFhKOJQJ\^JhxOJQJ\^JhxhxOJQJ\^Jhxhx5\hKOJQJ^Jhx5CJ$\aJ$hxOJQJ^Jh*OJQJ^Jh*5CJ$\aJ$hv9CJOJQJ^JaJ h*h*CJOJQJ^JaJh*h*CJaJh*CJ,aJ,hK5CJ,\aJ,h*5CJ,\aJ,h*CJ$aJ$h*CJaJ2356MNOPQRSTUVWXYgd*$a$gd* B K J K ` a gdxgd*gd* d e v \{wi[iPPho5OJQJ\^JhxOJQJ^JmH sH hKOJQJ^JmH sH h=hKOJQJ^JhxOJQJ^Jh=hKOJQJ\^Jh=hx5OJQJ\^Jh=h=OJQJ\^Jh=hxOJQJ\^Jhx5CJ$\aJ$hK5CJ$\aJ$hOJQJ\^JhKOJQJ\^JhxOJQJ\^J v"\{|&'()gdo5gdKgd* & Fgd=gdx{|#$%&)VaŧugUuUuGh=ho55OJQJ^J#h=ho55OJQJ^JmH sH h=OJQJ^JmH sH  ho5ho5OJQJ^JmH sH ho5hOJQJ^JhOJQJ^Jho5OJQJ^J h=ho5CJOJQJ^JaJho5ho5OJQJ^Jh=CJOJQJ^JaJho5CJOJQJ^JaJ ho5ho5CJOJQJ^JaJho5OJQJ^JmH sH )V ^`gd=gdKgdo5#LRSǵxmXJm?1hCJOJQJ^JaJhOJQJ\^Jh=CJOJQJ^JaJ(h=h=CJOJQJ^JaJmH sH h=OJQJ\^Jh=5CJ$\aJ$h5CJ$\aJ$h=OJQJ^JmH sH 0jhhOJQJU^JmHnHtHu#ho5hOJQJ\^JmH sH hOJQJ\^JmH sH ho5OJQJ\^JmH sH h=ho55OJQJ^JhHkhho5OJQJ^J"#,Db{|*Pod7$8$H$gd=gd=2Jc3LNRSefgd=d7$8$H$gd=defh5CJ$\aJ$hCJOJQJ^JaJh=OJQJ^JhhOJQJ^JhOJQJ^Jgd=21h:pv9. A!n"n#$n% *DdQ  lA ?grafoImmagine 0grafo.jpgRF6/q. "DF6/q. JFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 6Mmg 9$$5FIa C,$@d@^=sw{V?" Ƨ'-qt@c4odyeOOZ7k+[C[W}҉F2[ˌdA `? zZE|L9_އ1%o%v^ܗ.|""-*7lfhhcH! vӋm5o>||8##55V2X7Ĵg䙄v|Qv~~aEW{!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPYOV|Ksnۿbۜg hTs ռG4I#C+ qkƥ= Ec,I``YV;fFr~ פt|8 BY˒Lc8?vx^Vғ~Qj3LI rpь>vVXhZ+unˀH!`DR/զMTZ$z5[>39IZ"zjw6Ʈ Gkqv3Ƭ˔Qr)m޿ymFhUiU_(,X9fOz2u<"XH%dU@*t`4baefH`RF쑌l1V]{|'2/Zc[Qx|7qqڕݥo0gԩ FrnW9^Mu9--S2ew$ ۓ3խƳs{1A rA$ke$2 c ux{L^$]:2v#1TB ¨˰ŠMY_}U&ޯԢ+(((((((((((((((((((((xmm常8` $Q@$}KU-{Gqai\B"]A'56qQiS2;e 6NB28=o BgLO6γ/ph,cI 09rV95%w7x$*2+(f_Goi{ǝcn꿦xͥ?ZBp5GXخ@9,VrmEmX`wgtBU2ۻ*p^ <MK ~EWzEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPYoQOqu>|[hHF3W%Av*Yw0Ȩ-Vh.MRdyRJb(F+%8WeL>\MBU\dY#tْ-IR b2Lvђ@8\H"&PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPXiZT\Ɂwx0Ai 9 vI+M6IҿDӎn&eiY,KGcagYgaiy rI8Q$4æ[q#'$w U@PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE^NO.$)bI *bH@$yᵷX$/$0UE$xsX~M8.0rD׋L.>2tl+9`gqͪ$fEC]Hr:|!XpCV׮We<1Jݖ}W{?\q{=d$8(v?+e_74`l ^'ܬ`]E}|dS%8.ES((((((((((((((((((((((u?Ojz}[+v8pk˼alu>{KžkkK[l .QKF谮'%Wo%vx!(T)$r(eu#x 1^m ~ۋ}J3q<8.d@!||㈜JR?9S9t^<[MHo B5wETYpv1Z#TԢQ0xnⵕLO/A'`_4u-ՙ<9HZ)ʢ<or\xF.[̳ɋF]~n1_|Laϵ=?9# 'wݯ}O7>^Y1X"܌}䒄l5NJnSu~>-bJWr:[:w ܂yoB“'sg;u%kO !i"*c|6 Y?Pmv+;mucWyxA]J]h: U֝"OoV7ٞi)H" QWkx[F[nc򼭅`WH @3BF̡Sk$lLq_VJxdQE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@g5t;"7>%sї (4 o!! omF7:7$>`[h Rmt=fYs=Ig>mW< 7G=Wjߑz//%>Dv{63:&~䆍AISA VG  HB(qaaIY G gF6AEV@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEj 666666666vvvvvvvvv666666>6666666666666666666666666666666666666666666666666hH6666666666666666666666666666666666666666666666666666666666666666662 0@P`p2( 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p8XV~ OJPJQJ_HmHnHsHtHL`L v9Normale dCJ_HaJmHsHtH LA L Car. predefinito paragrafoXiX 0Tabella normale4 l4a 4k 4 0 Nessun elenco bob *Default 7$8$H$-B*CJOJQJ^J_HaJmHphsHtH PZ`P o50 Testo normale dCJOJQJaJV/V o50Testo normale CarattereCJOJQJaJT"T o50 Testo fumetto dCJOJQJ^JaJZ/1Z o50Testo fumetto CarattereCJOJQJ^JaJH@BH = Paragrafo elenco ^m$PK![Content_Types].xmlj0Eжr(΢Iw},-j4 wP-t#bΙ{UTU^hd}㨫)*1P' ^W0)T9<l#$yi};~@(Hu* Dנz/0ǰ $ X3aZ,D0j~3߶b~i>3\`?/[G\!-Rk.sԻ..a濭?PK!֧6 _rels/.relsj0 }Q%v/C/}(h"O = C?hv=Ʌ%[xp{۵_Pѣ<1H0ORBdJE4b$q_6LR7`0̞O,En7Lib/SeеPK!kytheme/theme/themeManager.xml M @}w7c(EbˮCAǠҟ7՛K Y, e.|,H,lxɴIsQ}#Ր ֵ+!,^$j=GW)E+& 8PK!HRtheme/theme/theme1.xmlYMoE#F{oc'vGuرHF[xw;jf7q7J\ʯ AxgfwIFPA}H1^3tH6r=2%@3'M 5BNe tYI?C K/^|Kx=#bjmo>]F,"BFVzn^3`ե̳_wr%:ϻ[k.eNVi2],S_sjcs7f W+Ն7`g ȘJj|l(KD-ʵ dXiJ؇kZov[fDNc@M!͐,a'4Y_wp >*D8i&X\,Wxҕ=6.^ۄ Z *lJ~auԙՍj9 !bM@-U8kp0vbp!H#m|&HyȝC)^+Ikio ,A*k,GMg,JnO#KtZ妇|1ikBԥ0 jW¦l|Vn[u~3j ȦyK$rzQL -V 5-nhxL|UviE>fO(8B#6¯S ܣioWnsΊ|{epv4Y%W:.t0O%Jݍq7ŔRN)z?@G\׶Dž8t4~_`zd kH*N69mYiHE=hK&NaV.˒eLFԕU{D vEꦛdmNU(CNޜR콶3a3/TU-!޲!ljUJ[A++T[Xs/7s b1p߃eBoC  d%;x 'hIF'|I{Z.3WSÎBWCdO(, Q݃@o)i ~SFρ(~+ѐnPK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-![Content_Types].xmlPK-!֧6 +_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!HRtheme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK] 4 { )8@0(  B S  ? RZ"%1;<D^bv a f g m n v j r  :BLUV`oy0<Skr %*CGKZdis&.;Jde   1346L  # LR>p`樹h^`OJQJo(hHh^`OJQJ^Jo(hHohp^p`OJQJo(hHh@ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohP^P`OJQJo(hH>p*v9o5=Kx@p@Unknown G*Ax Times New Roman5Symbol?. *Cx ArialArial?= *Cx Courier New7K@Cambria7.{ @Calibri9=  K @Consolas5. *[`)Tahoma;WingdingsA BCambria Math"1X= " "!n02QHX $P*2! xxLucaLuca Oh+'0 px   Luca traduttoriLuca1Microsoft Office Word@@\@hLq՜.+,0 hp|  "   Titolo  !"#$%&()*+,-./0123456789;<=>?@ACDEFGHILRoot Entry FvuNData *1Table'7$WordDocument44SummaryInformation(:DocumentSummaryInformation8BCompObj}  F+Documento di Microsoft Office Word 97-2003 MSWordDocWord.Document.89q