Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Τομέας Τεχνολογίας Πληροφορικής & Υπολογιστών Εργαστήριο Τεχνολογίας Λογισμικού Μεταγλωττιστές 0 Θέμα εργασίας (1 ) https://courses.softlab.ntua.gr/compilers/ Αθήνα, Φεβρουάριος 0
Alan flexml-lexocamllexalex bisonml-yaccocamlyacchappy JavaCC
1 1 1 1 1 1 1 0 1 0 1 Alan Alan byte else false if int proc reference return while true 0 0000 \ \ a 1 \n \ \x1d abc Route Hello world!\n Name:\t\ Douglas Adams\ \nvalue:\t\n = + - * / %! & ==!= < > <= >=
\n \t \r \0 \\ \ \ \ \xnn nn 1 ( ) [ ] {, : ; Alan -- (* *) 1 1 1 1 1 1 0 Alan int byte 0 Alan t [] t if while 1 Alan
1 i : int; b : byte; s : byte [0]; 1 1 1 1 1 1 0 1 0 1 proc void Alan reference p1 () : proc p (n : int) : proc p (a : int, b : int, b : reference byte) : proc f1 (int x) : int f (s : reference byte []) : int Alan { 0 1 Alan Alan if while
1 1 1 1 1 1 a t [] i int a[i] t i a byte[n+ 1] n byte 0 1 0 1 Alan int byte Alan true false 0 1 Alan Alan + - int! + - * / % int byte ==!= < > <= >= int byte
Alan + -! * / % + - ==!= > < <= >= & 1 & Alan 1 1 1 1 1 1 f t t proc f(e 1,..., e n ) t n f t t t t 0 1 Alan ; l = e; e l l t e t { f(e 1,..., e n ); f proc
1 if (c) s 1 else s c s 1 s else while (c) s c s return e ; e proc e e 1 1 1 Alan 1 1 1 writeinteger (n : int) : proc writebyte (b : byte) : proc writechar (b : byte) : proc writestring (s : reference byte []) : proc 0 1 Alan writebyte writechar readinteger () : int readbyte () : byte readchar () : byte readstring (n : int, s : reference byte []) : proc 0 1 Alan readstring \0 extend (b : byte) : int shrink (i : int) : byte byte int byte
1 strlen (s : reference byte []) : int strcmp (s1 : reference byte [], s : reference byte []) : int strcpy (trg : reference byte [], src : reference byte []) : proc strcat (trg : reference byte [], src : reference byte []) : proc Alan 1 1 1 1 1 1 1 0 1 ::= ::= ( [ ] ) : ( ) ::= (, ) ::= : [ reference ] ::= int byte ::= [ [ ] ] ::= proc ::= ::= : [ [ ] ] ; ::= ; = ; ; if ( ) [ else ] while ( ) return [ ] ; ::= { ( ) ::= ( [ ] ) ::= (, ) ::= ( ) ( + - ) ( + - * / % ) ::= [ [ ] ] ::= true false ( )! ( ==!= < > <= >= ) ( & ) Alan
left middle right Alan 1 hello () : proc { writestring( Hello world!\n ); n Alan hanoi 1 solve () : proc hanoi (rings : int, source : reference byte [], target : reference byte [], auxiliary : reference byte []) : proc move (source : reference byte [], target : reference byte[]) : proc { writestring( Moving from ); writestring(source);
1 1 writestring( to ); writestring(target); writestring(.\n ); 1 1 1 1 0 1 { -- hanoi if (rings >= 1) { hanoi(rings-1, source, auxiliary, target); move(source, target); hanoi(rings-1, auxiliary, target, source); -- hanoi NumberOfRings : int; { -- solve writestring( Rings: ); NumberOfRings = readinteger(); hanoi(numberofrings, left, right, middle ); -- solve Alan n n k ± 1 k t := n t 1 t + 1 t t < 0 t t < t t = t t t i := t/ t i t t Alan 1 main () : proc prime (n : int) : int i : int; { if (n < 0) return prime(-n); else if (n < ) return 0; else if (n == ) return 1; else if (n % == 0) return 0;
1 1 1 1 1 1 else { i = ; while (i <= n / ) { if (n % i == 0) return 0; i = i + ; return 1; 0 1 0 1 0 1 0 1 limit : int; number : int; counter : int; { -- main writestring( Limit: ); limit = readinteger(); writestring( Primes:\n ); counter = 0; if (limit >= ) { counter = counter + 1; writeinteger(); writestring( \n ); if (limit >= ) { counter = counter + 1; writeinteger(); writestring( \n ); number = ; while (number <= limit) { if (prime(number - 1) == 1) { counter = counter + 1; writeinteger(number - 1); writestring( \n ); if (number!= limit & prime(number + 1) == 1) { counter = counter + 1; writeinteger(number + 1); writestring( \n ); number = number + ; writestring( \ntotal: ); writeinteger(counter); writestring( \n ); -- main Alan 1 main () : proc r : byte [];
1 1 1 1 1 1 0 1 reverse (s : reference byte []) : proc i : int; l : int; { l = strlen(s); i = 0; while (i < l) { r[i] = s[l-i-1]; i = i+1; r[i] = \0 ; { -- main reverse( \n!dlrow olleh ); writestring(r); -- main Alan x n Alan x[0], x[1],... x[n 1] i n x[i] > x[i + 1] x[i] x[i + 1] x Alan 1 1 1 1 1 1 1 0 main () : proc bsort (n : int, x : reference int []) : proc swap (x : reference int, y : reference int) : proc t : int; { t = x; x = y; y = t; changed : byte; i : int; { -- bsort changed = y ; while (changed == y ) { changed = n ; i = 0;
1 0 1 0 1 0 1 while (i < n-1) { if (x[i] > x[i+1]) { swap(x[i], x[i+1]); changed = y ; i = i+1; -- bsort writearray (msg : reference byte [], n : int, x : reference int []) : proc i : int; { writestring(msg); i = 0; while (i < n) { if (i > 0) writestring(, ); writeinteger(x[i]); i = i+1; writestring( \n ); seed : int; x : int [1]; i : int; { -- main seed = ; i = 0; while (i < 1) { seed = (seed * 1 + 0 + i) % 1; x[i] = seed; i = i+1; writearray( Initial array:, 1, x); bsort(1, x); writearray( Sorted array:, 1, x); -- main
-f -i *.alan *.imm *.asm /tmp/hello.alan /tmp/hello.imm /tmp/hello.asm -Ο -f -i Makefile make make clean bison flex make distclean Μakefile flex bison CC=gcc CFLAGS=-Wall compiler: compiler.lex.o compiler.tab.o symbol.o symbolc.o $(CC) $(CFLAGS) -o compiler compiler.lex.o compiler.tab.o \ symbol.o symbolc.o compiler.lex.c: compiler.l compiler.tab.h flex -it compiler.l > compiler.lex.c compiler.tab.c compiler.tab.h: compiler.y bison -dv compiler.y clean: $(RM) *.o compiler.tab.c compiler.tab.h compiler.lex.c \ compiler core printf( %d: %s, %s, %s, %s\n,...) ετικέττα: <tab> εντολή <tab> όρισμα-1, όρισμα- <tab> εντολή <tab> όρισμα-1, όρισμα-