X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=documentation;h=47008eefba987fb88613cf46094072b64c289764;hb=ad65f2bc9228f04e0df3e309518f3c5b27cbfc06;hp=d649bbaedbe29fe03f586ac9699b30c70b0f4348;hpb=2c2f90fca1005f6dedc69ee7f3d7c5072e5c123b;p=proglang.git diff --git a/documentation b/documentation index d649bba..47008ee 100644 --- a/documentation +++ b/documentation @@ -1,7 +1,18 @@ ####### DOCUMENTATIATOIAITAT ION ######## +Usage: + +./CompInt [-c] [file] + +-c : Compile [file], interprets if it isn't specified + +if no arguments are specified then the file is interpreted Files: +Interpret.hs: Handles the interpretation of a program + +Compile.hs: Compiles the program into a c program + Typechecker.hs: Simple modification of the bnfc-generated Testsyntax which calls the type-checking functions. Typecheck.hs: Contains the type-checking functions typeCheckExp, typeCheckVar and typeCheckStm and some utility functions, responsible for the entire type-checking process. @@ -9,77 +20,102 @@ Typecheck.hs: Contains the type-checking functions typeCheckExp, typeCheckVar an Abssyntax.hs, Parsyntax.y, Lexsyntax.x,ErrM.hs,Printsyntax.hs,Skelsyntax.hs: The files generated by bnfc, only modification is the removal of the Bool type in Abssyntx.hs so haskell's internal type can be used. -typing rules +semantic rules ++++++++++++ -(t is little tau, T is large tau, E is 'in', and + is that other symbol) +(v is used for values, e for expressions, s for statements, c is the context) -[Eq, Neq] +[Eq, NEq, Plus, Minus, Times, Div, Lt, ELt, Gt, EGt] -e:bool <= e1:t & e2:t -where e is e1 Eq e2. + => <= => => v is the result of using operator o on v1 and v2 -[Plus, Minus, Times, Div] +[Assignment] -e:int <= e1:int & e2:int -where e is e1 Plus e2. + => c'[i -> v] <= => +Assign the value v to i in the first scope i is found in. -[Lt, ELt, Gt, EGt] +[ENeg] -e:bool <= e1:int & e2:int -where e is e1 Lt e2. + => <-v,c'> <= => -[Assignment] +[ENot] -T+ i := e:t <= i:t E T & T+ e:t -where the assignment is identifier i = expression e. + => <= => +[EVar] -[ExpT] + => -u,e:t <= e:t & u:t -where the expression is type u expression e. +[EInt] + => -[ENeg] +[EBool] -e:int <= e:int + => +[EReadI,EReadB] -[ENot] + => <= => + +[EPost] + + => v']> <= c(i) => v, v±1 => v' + +Look up the variable, add/subtract 1 from the value then return the old value and context with modified value + +[SExp] -e:bool <= e:bool + => c' <= => +[SBlock] -[SExp, SBlock] + => c''' <= push(c) => c' => c'' pop(c'') => c''' -S:NoType <= e:t +Push a new scope onto the context, execute the statements in this context and the pop the scope from the context +[SEQ] + + => c'' <= => c' => c'' [SIf] -T+ if e then s1 else s2 <= T+ e:bool & T+ s1 & T+ s2 + => pop(c''') <= => push(c') => c''' + + => pop(c''') <= => push(c') => c''' [SWhile] -T+ while e do s <= T+ e:bool & T+ s + => c' => => + + => pop(c''') => => push(c') => c'' => c''' [SDecl] -T+ i:t => T', i:t <= i!ET & e:t & u:t + => c'[i->v] <= => + +Adds i with value v to the current scope in the context -(Type u Ident i = Exp e) +[SDeclD] + => c[i->0] + => c[i->false] +Adds i with default value in the current scope +[SNoop] + => c +SNoops does nothing so the same context is returned +[SPrint] + => c'' <= => => c''