Fromelle sprog Per P. Madsen Afd. for proceskontrol
Indhold. MM1: Programmeringssprog - compiler. MM2: Formelgramatik og syntaksbeskrivelsesformer. MM3: Endelige automater. MM4: LEX - et værktøj til genkendelse af regulære sprog. MM5: Top-down parsning (Predictive recursive decent ). MM6: Top-down parsning (JavaCC ). MM7: Bottom up parsing og YACC. MM8: Back-end. MM9: Sprog typer: Imperative sprog, logiske sprog mfl. MM10: Eksamems opgave.
Sprog Et sprog L(G) er mængden af sætninger afledt af grammatikken G. Grammatik er en 4-tupel: G={S,P,N,T}. Hvor: S er sætnings- eller startsymbolet. P er et sæt af produktioner N er et sæt af non-terminale symboler T er et sæt af terminale symboler
Grammatik program -> ’program’ ’(’ idT ’)’ varlist ’begin’ stlist ’end’ varlist -> type idlist ’;’ type -> ’float’ | ’int’ idlist -> idT idelmlist idelmlist -> ’,’ idT idelmlist | stlist -> statement stlist | statement -> idT ’=’ exp ’;’ exp -> idT bexp | ’(’ exp ’)’ bexp bexp-> ’+’ exp bexp | ’-’ exp bexp |
Syntaks Syntaks: Læren om hvordan de enkelte ord sammensættes. Et syntaktisk korrekt program/sprog er et sprog bestående af sætminger afledt af den grammatik der definere sproget.
Source/Target sprog Compiler Source sprogTarget sprog Fortolker Source sprog Kald til runtime-/ operativ-systemet Assembler, mellemkode fx Java.class, andet sprog fx C.
Source sprog Generelle sprog: Java, C++, Dedikerede sprog: Latex, XML, HTML, VRML, Matlab,,,,, Formålet med dedikeret sprog: ’’Easy to Use’’ lag oven på div. Software for nemt at kunne løse dedikerede opgaver. Fx: LaTeX: Skrive tekst oven på TEX typesætter. Matlab: Beregne og behandle data oven på matrix og grafik bib. VRML: Opbygge 3D vernden oven på 3D grafik bib.
Target sprog Target sprog: Skal kunne vidrebearbejdes af målsystemet. –Assembler til målsystemet. –Mellem kode hvis det kan vidrebearbejdes af målsystemet –Fx: C hvis der til målsystemet findes en C compiler. –Kode til en virtuelmaskine.
Target sprog Tre adr.instruktioner fx: Mellemkode. Res= opr1 Operation opr2 Alm CPU. MOVE src,dist Simple risc CPU. MOVWF dist SUBWF adr Stak maskine. Fx JVM Load opr1 Load opr2 Sub Out Res
#include float a,b,c; float e[5]; int *ptr; void viggo() { a= b+c; } int main() { b=2; c=3; viggo(); printf("a= %f\n",a); } 1.file"tmp.c" 2.section.text 3.globl _viggo 4 _viggo: pushl%ebp E5 movl%esp, %ebp D flds_b D fadds_c f D91D1000 fstps_a D popl%ebp C3 ret 12 LC3: D2025.ascii "a= %f\12\0" A00
#include float a,b,c; float e[5]; int *ptr; void viggo() { a= b+c; } int main() { b=2; c=3; viggo(); printf("a= %f\n”,a); } 14.globl _main 15 _main: e 55 pushl%ebp f 89E5 movl%esp, %ebp EC08 subl$8, %esp E4F0 andl$-16, %esp B movl$0, %eax c 29C4 subl%eax, %esp e B movl$0x , %eax A movl%eax, _b B movl$0x , %eax d A movl%eax, _c E8B9FFFF call_viggo 26 FF EC04 subl$4, %esp a D flds_a D6424F8 leal-8(%esp), %esp DD1C24 fstpl(%esp) pushl$LC c E89FFFFF call_printf 32 FF C410 addl$16, %esp C9 leave C3 ret
#include float a,b,c; float e[5]; int *ptr; void viggo() { a= b+c; } int main() { b=2; c=3; viggo(); printf("a= %f\n",a); } 36.comm _a,16 37.comm _b,16 38.comm _c,16 39.comm _e,32 40.comm _ptr, ident"GCC: (GNU) 3.3.1" GAS LISTING tmp.s page 2 DEFINED SYMBOLS *ABS*: tmp.c tmp.s:4.text: _viggo *COM*: _b *COM*: _c *COM*: _a tmp.s:15.text: e _main *COM*: _e *COM*: _ptr UNDEFINED SYMBOLS _printf
Compiler/fortolker struktur Mellem- kode Kald til Runtimesy s. Mellemk. - optimerin g Kode- genererin g Kode- optimerin g Lexikalsk - analyse Syntax- analyse Semantik- analyse if viggo == 3 then.... If token Ident token IdentX(type=Int) Gen(Comp, *Viggo,3) Gen(jump if not, adress) Compiler Fortolker Front end Back end