commit 2465cf84b78a993943064e828363ee265e3db534 Author: NikolajDanger Date: Sat Apr 30 09:46:03 2022 +0200 some stuff diff --git a/W1/calculator.fsx b/W1/calculator.fsx new file mode 100644 index 0000000..53ef0ad --- /dev/null +++ b/W1/calculator.fsx @@ -0,0 +1,268 @@ +(* ABSTRACT SYNTAX *) + +type VALUE = INT of int + +type BINOP = BPLUS | BMINUS | BTIMES + +type RANGEOP = RSUM | RPROD | RMAX | RARGMAX + +type EXP = + | CONSTANT of VALUE + | VARIABLE of string + | OPERATE of BINOP * EXP * EXP + | LET_IN of string * EXP * EXP + | OVER of RANGEOP * string * EXP * EXP * EXP + +(* A list mapping variable names to their values. *) +type SymTab = (string * VALUE) list + +(* Inserts a variable into the variable table. *) +let bind v k vtab = (v, k) :: vtab : SymTab + +(* Lookup a the value of a variable. *) +let rec lookup v = function + | (v', k) :: vtab -> if v = v' then k else lookup v vtab + | (_ : SymTab) -> failwith ("unbound variable : " + v) + +(* HELP FUNCTIONS *) +let VALUEtoint = function INT x -> x + +(* EVALUATION *) + +(***************************************************** + * TODO: Task 2: complete the definition of `eval`. You may also + * define any auxiliary functions as you see fit, to help express `eval` + * as cleanly and concisely as possible. + ****************************************************) + +(* The evaluation function. *) +let rec eval (vtab : SymTab) (e : EXP) : VALUE = + match e with + | CONSTANT n -> n + | VARIABLE v -> + lookup v vtab + | OPERATE (op, e1, e2) -> + let exp1 = VALUEtoint (eval vtab e1) + let exp2 = VALUEtoint (eval vtab e2) + match op with + | BPLUS -> INT (exp1 + exp2) + | BMINUS -> INT (exp1 - exp2) + | BTIMES -> INT (exp1 * exp2) + | LET_IN (var, e1, e2) -> + let exp1 = eval vtab e1 + let vtab = bind var exp1 vtab + eval vtab e2 + | OVER (rop, var, e1, e2, e3) -> + let exp1 = VALUEtoint (eval vtab e1) + let exp2 = VALUEtoint (eval vtab e2) + let results = [ + for i in exp1..exp2 -> + let vtab = bind var (INT i) vtab + eval vtab e3 + ] + match rop with + | RSUM -> List.fold (fun (INT acc) (INT elem) -> INT (acc + elem)) (INT 0) results + | RPROD -> List.fold (fun (INT acc) (INT elem) -> INT (acc * elem)) (INT 1) results + | RMAX -> List.fold (fun (INT acc) (INT elem) -> INT (max acc elem)) results[0] results + | RARGMAX -> + let max_elem = List.fold (fun (INT acc) (INT elem) -> INT (max acc elem)) results[0] results + INT ((List.findIndex ((=) max_elem) results) + exp1) + + +(* YOU SHOULDN'T NEED TO MODIFY ANYTHING IN THE REMAINDER OF THIS FILE, + BUT YOU ARE WELCOME TO LOOK AT IT. *) + +(* LEXER + ********** + * A lexer, is a program which reads a stream/list of chars, + * and transforms them into a list of tokens. + ********** + * This example code is very simple and naive, but it should not + * introduce anything which you have not seen on the PoP course. + * Furhter more, we hope that you will read it, and get an intuition + * about what is going on + ********** + *) + +type TOKEN = + | NUM of int | ID of string + | PLUS | MULT | MINUS | EQ + | LPAR | RPAR | LET | IN + | SUM | PROD | MAX | ARGMAX | OF | TO + +let explode (s : string) = [for c in s -> c] +let isA t c = List.exists (fun c' -> c = c') t + +let digit = ['0'..'9'] +let letter = ['a'..'z'] +let symbol = explode "+-*/=()" +let whitespace = explode " \t\n" + +let keyword = ["let"; "in"; "sum"; "prod"; "max"; "argmax"; "of"; "to"] + +let rec lex = function + | (c :: _) as cs when c |> isA digit -> lexNum "" cs + | (c :: _) as cs when c |> isA letter -> lexWord "" cs + | (c :: cs) when c |> isA symbol -> lexSymbol c :: lex cs + | (c :: cs) when c |> isA whitespace -> lex cs + | (c :: cs) -> failwith ("invalid character : " + string c) + | (_ : char list) -> ([] : TOKEN list) + +and lexNum s = function + | (c :: cs) when c |> isA digit -> lexNum (s + string c) cs + | cs -> (NUM (System.Int32.Parse s)) :: lex cs + +and lexWord s = function + | (c :: cs) when c |> isA (letter @ digit) -> lexWord (s + string c) cs + | cs -> + (if s |> isA keyword then getKeyWord s else ID s) :: lex cs + +and lexSymbol = function + | '+' -> PLUS + | '-' -> MINUS + | '*' -> MULT + | '=' -> EQ + | '(' -> LPAR + | ')' -> RPAR + | sym -> failwith ("Unknown Symbol : " + string sym) + +and getKeyWord = function + | "let" -> LET + | "in" -> IN + | "sum" -> SUM + | "prod" -> PROD + | "max" -> MAX + | "argmax" -> ARGMAX + | "to" -> TO + | "of" -> OF + | word -> failwith ("Invalid Keyword : " + word) + +(* PARSER + ********** + * A parser transforms the list of tokens to an abstract syntax tree, + * which reprecents the syntax of an expression. + ********** + * The example code uses a somewhat ad hoc approach. + * Later on in the course, we will see more systematic ways of + * constructing parsers. + *) + + +(* Returns tail of ts, assuming head of ts equals t *) +let expect t ts = + match ts with + | t' :: ts1 when t' = t -> ts1 + | _ -> failwith "parse error" + +(* Each parser function returns the expression parsed from the beginning + of the token list, together with any remaining tokens. *) + +let rec parse_exp ts = + match ts with + | LET :: ID v :: EQ :: ts1 -> + let (e1, ts2) = parse_exp ts1 + let ts3 = expect IN ts2 + let (e2, ts4) = parse_exp ts3 + (LET_IN (v,e1,e2), ts4) + | r :: ID v :: EQ :: ts1 when r |> isA [SUM; PROD; MAX; ARGMAX] -> + let (e1, ts2) = parse_exp ts1 + let ts3 = expect TO ts2 + let (e2, ts4) = parse_exp ts3 + let ts5 = expect OF ts4 + let (e3, ts6) = parse_exp ts5 + let rop = match r with + | SUM -> RSUM + | PROD -> RPROD + | MAX -> RMAX + | ARGMAX -> RARGMAX + | _ -> failwith ("Unknown range operation : " + string r) + (OVER (rop, v, e1, e2, e3), ts6) + | _ -> parse_arith ts + +and parse_arith ts = + let (e1, ts1) = parse_term ts + parse_terms e1 ts1 +and parse_terms e1 ts = + match ts with + | PLUS :: ts1 -> let (e2, ts2) = parse_term ts1 + parse_terms (OPERATE (BPLUS, e1,e2)) ts2 + | MINUS :: ts1 -> let (e2, ts2) = parse_term ts1 + parse_terms (OPERATE (BMINUS, e1,e2)) ts2 + | _ -> (e1, ts) + +and parse_term ts = + let (e1, ts1) = parse_factor ts + parse_factors e1 ts1 +and parse_factors e1 ts = + match ts with + | MULT :: ts1 -> let (e2, ts2) = parse_factor ts1 + parse_factors (OPERATE (BTIMES, e1,e2)) ts2 + | _ -> (e1, ts) + +and parse_factor ts = + match ts with + | ID v :: ts1 -> (VARIABLE v, ts1) + | NUM n :: ts1 -> (CONSTANT (INT n), ts1) + | LPAR :: ts1 -> + let (e, ts2) = parse_exp ts1 + let ts3 = expect RPAR ts2 + (e, ts3) + | _ -> failwith ("parse error") + +let parse ts = + let (e, ts1) = parse_exp ts + if ts1 = [] then e else failwith "parse error" + +(************* + * When interpreting code, we lex it into tokens, parse the tokens into an + * abstract syntax tree, and evaluate the tree into some value. + * The definition of what it means to be a value, and an expression (tree), + * can be found in the parser. + ************* + * In this code, the evaluation of such a tree has been reprecented, should + * be implemented in the below function [eval] {~_^} + *) + +(* FOR RUNNING A PROGRAM *) +let run program = (lex >> parse >> eval []) (explode program) + +(* Tests *) +let eval_test_constant = (eval [] (CONSTANT (INT 4)) = INT 4) + +//let eval_test_lookup = (eval [("x", INT 4)] (VARIABLE "x") = INT 4) + +let program0 = "1 - 2 - 3" + +let program1 = "let x = 4 in x + 3" + +let program2 = ("let x0 = 2 in \ + let x1 = x0 * x0 in \ + let x2 = x1 * x1 in x2 * x2") + +let program3 = "sum x = 1 to 4 of x*x" +let program4 = "max x = 0 to 10 of 5 * x - x * x" +let program5 = "argmax x = 0 to 10 of 5 * x - x * x" + +(* +let eval_test_arithmetic = (run program0 = INT -4) +let eval_test_let = (run program1 = INT 7) +let eval_test_nested_let = (run program2 = INT 30) +let eval_test_max = (run program4 = INT 6) +let eval_test_argmax = (run program4 = INT 2) +*) + +(* THIS FUNCTION CALLS RUN ON USER INPUT IN AN INTERACTIVE LOOP *) +let interpreter () = + let mutable running = true + printfn "Welcome to the calculator! Type \"exit\" to stop." + while running do + printf "Input an expression : " + let program = System.Console.ReadLine() + try + if program = "" then () + else if program = "exit" then running <- false + else printfn "Evaluation result : %A" (run program) + with + | Failure (msg) -> printfn "%s" msg + +interpreter () diff --git a/W1/report/main.aux b/W1/report/main.aux new file mode 100644 index 0000000..9d58a80 --- /dev/null +++ b/W1/report/main.aux @@ -0,0 +1,5 @@ +\relax +\@writefile{toc}{\contentsline {section}{\numberline {Task 1}}{1}{}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {Task 2}}{1}{}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {Task 3}}{1}{}\protected@file@percent } +\gdef \@abspage@last{1} diff --git a/W1/report/main.fdb_latexmk b/W1/report/main.fdb_latexmk new file mode 100644 index 0000000..8095965 --- /dev/null +++ b/W1/report/main.fdb_latexmk @@ -0,0 +1,20 @@ +# Fdb version 3 +["pdflatex"] 1651237923 "/home/nikolaj/Code/Datalogi/2022B4-IPS/IPS_W-assignments/W1/main.tex" "main.pdf" "main" 1651237923 + "/home/nikolaj/Code/Datalogi/2022B4-IPS/IPS_W-assignments/W1/main.tex" 1651237922 364 e3b792744da3753f628354d9558911dc "" + "/usr/share/texmf-dist/fonts/map/fontname/texfonts.map" 1647844622 3524 cb3e574dea2d1052e39280babc910dc8 "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmbx12.tfm" 1647844622 1324 c910af8c371558dc20f2d7822f66fe64 "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1647844622 1288 655e228510b4c2a1abe905c368440826 "" + "/usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb" 1647844622 32080 340ef9bf63678554ee606688e7b5339d "" + "/usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb" 1647844622 35752 024fb6c41858982481f6968b5fc26508 "" + "/usr/share/texmf-dist/tex/latex/base/article.cls" 1647844622 20144 8a7de377ae7a11ee924a7499611f5a9d "" + "/usr/share/texmf-dist/tex/latex/base/size10.clo" 1647844622 8448 96f18c76bf608a36ee6fbf021ac1dd32 "" + "/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def" 1647844622 29921 d0acc05a38bd4aa3af2017f0b7c137ce "" + "/usr/share/texmf-dist/web2c/texmf.cnf" 1647844622 39911 2da6c67557ec033436fe5418a70a8a61 "" + "/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1650359669 4408072 42ceaa83bae76aebad711d3f3dd7f55f "" + "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1650359660 2924504 ea4c5c72b0c4652da661684b3e043938 "" + "main.aux" 1651237923 311 d89453a43fde1809b6531a97b3ddf7d3 "pdflatex" + "main.tex" 1651237922 364 e3b792744da3753f628354d9558911dc "" + (generated) + "main.aux" + "main.log" + "main.pdf" diff --git a/W1/report/main.fls b/W1/report/main.fls new file mode 100644 index 0000000..d157e28 --- /dev/null +++ b/W1/report/main.fls @@ -0,0 +1,43 @@ +PWD /home/nikolaj/Code/Datalogi/2022B4-IPS/IPS_W-assignments/W1 +INPUT /usr/share/texmf-dist/web2c/texmf.cnf +INPUT /var/lib/texmf/web2c/pdftex/pdflatex.fmt +INPUT /home/nikolaj/Code/Datalogi/2022B4-IPS/IPS_W-assignments/W1/main.tex +OUTPUT main.log +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +INPUT ./main.aux +INPUT main.aux +INPUT main.aux +OUTPUT main.aux +INPUT /usr/share/texmf-dist/fonts/map/fontname/texfonts.map +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmr12.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmbx12.tfm +OUTPUT main.pdf +INPUT /var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map +INPUT main.aux +INPUT /usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb diff --git a/W1/report/main.log b/W1/report/main.log new file mode 100644 index 0000000..8640f28 --- /dev/null +++ b/W1/report/main.log @@ -0,0 +1,64 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.23 (TeX Live 2021/Arch Linux) (preloaded format=pdflatex 2022.4.19) 29 APR 2022 15:12 +entering extended mode + restricted \write18 enabled. + file:line:error style messages enabled. + %&-line parsing enabled. +**/home/nikolaj/Code/Datalogi/2022B4-IPS/IPS_W-assignments/W1/main.tex +(/home/nikolaj/Code/Datalogi/2022B4-IPS/IPS_W-assignments/W1/main.tex +LaTeX2e <2021-11-15> patch level 1 +L3 programming layer <2022-02-24> (/usr/share/texmf-dist/tex/latex/base/article.cls +Document Class: article 2021/10/04 v1.4n Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2021/10/04 v1.4n Standard LaTeX file (size option) +) +\c@part=\count185 +\c@section=\count186 +\c@subsection=\count187 +\c@subsubsection=\count188 +\c@paragraph=\count189 +\c@subparagraph=\count190 +\c@figure=\count191 +\c@table=\count192 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) (/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2022-02-07 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count193 +\l__pdf_internal_box=\box50 +) (./main.aux) +\openout1 = `main.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./main.aux) ) +Here is how much of TeX's memory you used: + 404 strings out of 478276 + 7535 string characters out of 5853013 + 298976 words of memory out of 5000000 + 18691 multiletter control sequences out of 15000+600000 + 469864 words of font info for 30 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 34i,5n,38p,193b,107s stack positions out of 5000i,500n,10000p,200000b,80000s + +Output written on main.pdf (1 page, 28488 bytes). +PDF statistics: + 18 PDF objects out of 1000 (max. 8388607) + 10 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/W1/report/main.pdf b/W1/report/main.pdf new file mode 100644 index 0000000..610c170 Binary files /dev/null and b/W1/report/main.pdf differ diff --git a/W1/report/main.synctex.gz b/W1/report/main.synctex.gz new file mode 100644 index 0000000..e4fa6df Binary files /dev/null and b/W1/report/main.synctex.gz differ diff --git a/W1/report/main.tex b/W1/report/main.tex new file mode 100644 index 0000000..66cedc8 --- /dev/null +++ b/W1/report/main.tex @@ -0,0 +1,16 @@ +\documentclass[a4paper]{article} + +\renewcommand{\thesection}{Task \arabic{section}} + +\begin{document} +\section{} +\begin{enumerate} + \item I am a DIKU Computer Science BSc, general profile + \item I have little to no proficiency with F\# + \item I have mininal knowledge of assembly programming + \item +\end{enumerate} + +\section{} +\section{} +\end{document} \ No newline at end of file