X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=documentation;h=47008eefba987fb88613cf46094072b64c289764;hb=ad65f2bc9228f04e0df3e309518f3c5b27cbfc06;hp=70bd0c818b7f8c298ca3658a67729c6413db122b;hpb=ef4659dbfa5051372cf067f8c0ed2bbe77146650;p=proglang.git diff --git a/documentation b/documentation index 70bd0c8..47008ee 100644 --- a/documentation +++ b/documentation @@ -1,97 +1,121 @@ ####### DOCUMENTATIATOIAITAT ION ######## +Usage: -a simple c-like language with support for if/else-statements, while-loops and the standard arithmetic (+, -, /, *) and comparison expressions (<, >, <=, >=, ==, !=). also, post increase/decrease expressions (++, --) are supported. Assignments are allowed in expressions, but they are only allowed on the right side of arithmetic/comparision operators if they are put inside parenthesis +./CompInt [-c] [file] +-c : Compile [file], interprets if it isn't specified -data types: -integers and booleans. +if no arguments are specified then the file is interpreted -comments: -// and /* */ comments are allowed. +Files: +Interpret.hs: Handles the interpretation of a program -(For compilation to work the Bool type in Abssyntax has to be removed so the internal haskell type is used) +Compile.hs: Compiles the program into a c program -shift/reduce conflicts: +Typechecker.hs: Simple modification of the bnfc-generated Testsyntax which calls the type-checking functions. -if with else: 1 conflict -An if statement before the else could be reduced to an if statement lacking the else, but the correct thing is to shift it onto the stack. +Typecheck.hs: Contains the type-checking functions typeCheckExp, typeCheckVar and typeCheckStm and some utility functions, responsible for the entire type-checking process. +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, Plus, Minus, Times, Div, Lt, ELt, Gt, EGt] -[Eq, Neq] + => <= => => v is the result of using operator o on v1 and v2 -e:bool <= e1:t & e2:t -where e is e1 Eq e2. +[Assignment] -[Plus, Minus, Times, Div] + => c'[i -> v] <= => -e:int <= e1:int & e2:int -where e is e1 Plus e2. +Assign the value v to i in the first scope i is found in. +[ENeg] -[Lt, ELt, Gt, EGt] + => <-v,c'> <= => -e:bool <= e1:int & e2:int -where e is e1 Lt e2. +[ENot] -[Assignment] + => <= => -T+ i := e:t <= i:t E T & T+ e:t -where the assignment is identifier i = expression e. +[EVar] + => -[ExpT] +[EInt] -u,e:t <= e:t & u:t -where the expression is type u expression e. + => +[EBool] -[ENeg] + => -e:int <= e:int +[EReadI,EReadB] + => <= => -[ENot] +[EPost] -e:bool <= e:bool + => 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, SBlock] +[SExp] -S:NoType <= e:t + => c' <= => +[SBlock] + + => c''' <= push(c) => c' => c'' pop(c'') => c''' + +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''