Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Τομέας Τεχνολογίας Πληροφορικής & Υπολογιστών Εργαστήριο Τεχνολογίας Λογισμικού Μεταγλωττιστές 0 Θέμα εργασίας ( ) https://courses.softlab.ntua.gr/compilers/ Αθήνα, Φεβρουάριος 0
PCL flexml-lexocamllexalex bisonml-yaccocamlyacchappy JavaCC real
0 0 0 PCL PCL PCL foo Foo FOO 0 0000.0.e 0.0e+ 000.0e- \ \
\n \t \r \0 \\ \ \ \ 0 0 a \n \ abc Route Hello world!\n Name:\t\ Douglas Adams\ \nvalue:\t\n ^ @ PCL (* *) PCL integer boolean char real PCL
0 0 0 array [n] of t n t n t array of t t t ^t t t array [0] of integer array of ^integer ^array of array [0] of boolean integer real t PCL PCL integer boolean false = 0 true = char real array [ n ] of t n t ^t PCL program p; p PCL
var var var i : integer; x, y : real; var s : array [0] of char; 0 0 PCL var procedure p (); procedure p (n : integer); procedure p (a, b : integer; var b : boolean); function f (x : real) : real; function f (var s : array of char) : integer; function f (n : integer; x : real) : ^array of real; forward 0 PCL 0 nil
0 0 0 0 array [n] of char n \0 PCL l array [n] of t array of t e integer l[e] t e n n l n e ^t e^ t e t result t PCL integer true false boolean real char nil ^t t PCL ^ PCL ^ PCL
PCL [ ] @ ^ + - not * / div mod and + - or = > < <= >= <> 0 0 0 @ l t @l ^t l + - not boolean + - * / div mod + - * integer integer real / real div mod integer integer = <> boolean < > <= >= boolean and or boolean PCL f t f(e,..., e n ) t n
0 0 0 f t t t t t ^t ^t PCL l := e l t e t t t integer real ^array [n] of t ^array of t ; end if e then s else s e boolean s s else while e do s e boolean s I:s I s goto I I return new new l l ^t t l t
0 new [e] l l ^array of t e integer e n l array [n] of t dispose new dispose l l ^t t l new l dispose [] l l ^array of t l new l PCL PCL 0 0 procedure writeinteger (n : integer); procedure writeboolean (b : boolean); procedure writechar (c : char); procedure writereal (r : real); procedure writestring (var s : array of char); PCL function readinteger () : integer; function readboolean () : boolean; function readchar () : char; function readreal () : real; procedure readstring (size : integer; var s : array of char); PCL readstring \0 0 function abs (n : integer) : integer; function fabs (r : real) : real;
0 function sqrt (r : real) : real; function sin (r : real) : real; function cos (r : real) : real; function tan (r : real) : real; function arctan (r : real) : real; function exp (r : real) : real; function ln (r : real) : real; function pi () : real; π function trunc (r : real) : integer; function round (r : real) : integer; trunc r round function ord (c : char) : integer; function chr (n : integer) : char; PCL 0 ::= program ;. ::= ( ) ::= var ( (, ) : ; ) + label (, ) ; ; ; forward ; ::= procedure ( [ ( ; ) ] ) function ( [ ( ; ) ] ) : ::= [ var ] (, ) : ::= integer real boolean char array [ [ ] ] of ^ ::= ( ; ) end ::= ϵ := if then [ else ] while do : goto return new [ [ ] ] dispose [ [ ] ] ::=
left middle right ::= result [ ] ^ ( ) ::= true false ( ) nil @ 0 ::= ( [ (, ) ] ) ::= not + - ::= + - * / div mod or and = <> < <= > >= PCL PCL program hello; writestring( Hello world!\n ) end. n
hanoi 0 0 0 program solve; var numberofrings : integer; procedure hanoi (var source, target, auxiliary : array of char; rings : integer); procedure move (var source, target : array of char); writestring( Move from ); writestring(source); writestring( to ); writestring(target); writestring(.\n ) if rings >= then hanoi(source, auxiliary, target, rings-); move(source, target); hanoi(auxiliary, target, source, rings-) end writestring( Please, give the number of rings : ); numberofrings := readinteger(); writestring( \nhere is the solution :\n\n ); hanoi( left, right, middle, numberofrings) end. n n k ± k t := n t t + t t < 0 t
t < t t = t t t i := t/ t i t t PCL 0 0 0 0 program primes; var limit, number, counter : integer; function prime (n : integer) : boolean; var i : integer; if n < 0 then result := prime(-n) else if n < then result := false else if n = then result := true else if n mod = 0 then result := false else i := ; while i <= n div do if n mod i = 0 then result := false; return i := i+ end result := true writestring( Please, give the upper limit : ); limit := readinteger(); writestring( Prime numbers between 0 and ); writeinteger(limit); writestring( \n\n ); counter := 0; if limit >= then counter := counter + ; writestring( \n ) if limit >= then counter := counter + ; writestring( \n ); number := ;
0 0 while number <= limit do if prime(number-) then counter := counter + ; writeinteger(number-); writestring( \n ) if (number <> limit) and prime(number+) then counter := counter + ; writeinteger(number+); writestring( \n ); number := number + writestring( \n ); writeinteger(counter); writestring( prime number(s) were found.\n ) end. 0 0 program reverse; function strlen (var s : array of char) : integer; result := 0; while s[result]!= \0 do result := result + var r : array [] of char; procedure reverse (var s : array of char); var i, l : integer; l := strlen(s); i := 0; while i < l do r[i] := s[l-i-]; i := i+ r[i] := \0 reverse( \n!dlrow olleh ); writestring(r) end. PCL
x n PCL x[0] x[]... x[n ] i n x[i] > x[i + ] x[i] x[i + ] x PCL 0 0 0 0 program bsort; procedure BubbleSort (var x : array of integer; n : integer); var i : integer; changed : boolean; procedure swap (var x, y : integer); var t : integer; t := x; x := y; y := t changed := true; while changed do i := 0; changed := false; while i < n- do if x[i] > x[i+] then swap(x[i], x[i+]); changed := true i := i+ end end procedure PrintArray (var msg : array of char; var x : array of integer; n : integer); var i : integer; writestring(msg); i := 0; while i < n do if i > 0 then writestring(, ); writeinteger(x[i]);
0 0 i := i+ writestring( \n ); var i : integer; x : array [] of integer; seed : integer; i := 0; seed := ; while i < do seed := (seed * + + i) mod 0; x[i] := seed; i := i + PrintArray( Initial array:, x, ); BubbleSort(x, ); PrintArray( Sorted array:, x, ) end. n n k 0 0 program mean; var n, k, i, seed : integer; sum : real; writestring( Give n: ); n := readinteger(); writestring( Give k: ); k := readinteger(); i := 0; sum := 0.0; seed := ; while i < k do seed := (seed * + + i) mod n; sum := sum + seed; i := i + if k > 0 then writestring( Mean: ); writereal(sum / k); writestring( \n ) end end.
(n )/ k -f -i *.pcl *.imm *.asm /tmp/hello.pcl /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 core distclean: clean $(RM) compiler