# HG changeset patch # User Christian Urban # Date 1642982433 0 # Node ID 81ee93b8725839542e00bc635fcf7500a2409637 # Parent 8fb3b6d3be70e3e7a323671ae1a60855f75b2716 changed os-lib as a replacement for ammonite-ops diff -r 8fb3b6d3be70 -r 81ee93b87258 handouts/amm-ho.pdf Binary file handouts/amm-ho.pdf has changed diff -r 8fb3b6d3be70 -r 81ee93b87258 handouts/amm-ho.tex --- a/handouts/amm-ho.tex Thu Jan 20 08:58:38 2022 +0000 +++ b/handouts/amm-ho.tex Mon Jan 24 00:00:33 2022 +0000 @@ -67,7 +67,8 @@ Ammonite can be achieved with \begin{lstlisting}[numbers=none,language=Scala] -scala> import ammonite.ops._ +scala> import $ivy.`com.lihaoyi::os-lib:0.8.0` +scala> import os._ scala> read(pwd / "file.name") res1: String = """...""" diff -r 8fb3b6d3be70 -r 81ee93b87258 progs/fun/fun.sc --- a/progs/fun/fun.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/progs/fun/fun.sc Mon Jan 24 00:00:33 2022 +0000 @@ -166,7 +166,12 @@ } -import ammonite.ops._ +// pre-2.5.0 ammonite +// import ammonite.ops._ + +// post 2.5.0 ammonite +import $ivy.`com.lihaoyi::os-lib:0.8.0` +import os._ def compile_to_file(prog: List[Decl], class_name: String) : Unit = write.over(pwd / s"$class_name.j", compile(prog, class_name)) diff -r 8fb3b6d3be70 -r 81ee93b87258 progs/fun/fun_llvm.sc --- a/progs/fun/fun_llvm.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/progs/fun/fun_llvm.sc Mon Jan 24 00:00:33 2022 +0000 @@ -264,7 +264,11 @@ prelude ++ (prog.map(compile_decl).mkString) -import ammonite.ops._ +// pre-2.5.0 ammonite +// import ammonite.ops._ + +// post 2.5.0 ammonite +import $ivy.`com.lihaoyi::os-lib:0.8.0` @main diff -r 8fb3b6d3be70 -r 81ee93b87258 progs/fun/fun_parser.sc --- a/progs/fun/fun_parser.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/progs/fun/fun_parser.sc Mon Jan 24 00:00:33 2022 +0000 @@ -158,7 +158,11 @@ // Reading tokens and Writing parse trees -import ammonite.ops._ +// pre-2.5.0 ammonite +// import ammonite.ops._ + +// post 2.5.0 ammonite +import $ivy.`com.lihaoyi::os-lib:0.8.0` def parse_tks(tks: List[Token]) : List[Decl] = Prog.parse_single(tks) diff -r 8fb3b6d3be70 -r 81ee93b87258 progs/fun/fun_tokens.sc --- a/progs/fun/fun_tokens.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/progs/fun/fun_tokens.sc Mon Jan 24 00:00:33 2022 +0000 @@ -249,7 +249,11 @@ else { println (s"Tokenise Error") ; sys.exit(-1) } } -import ammonite.ops._ +// pre-2.5.0 ammonite +// import ammonite.ops._ + +// post 2.5.0 ammonite +import $ivy.`com.lihaoyi::os-lib:0.8.0` //@doc("Tokenising a file.") @main diff -r 8fb3b6d3be70 -r 81ee93b87258 progs/fun/funt.sc --- a/progs/fun/funt.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/progs/fun/funt.sc Mon Jan 24 00:00:33 2022 +0000 @@ -161,7 +161,11 @@ (library + instructions).replaceAllLiterally("XXX", class_name) } -import ammonite.ops._ +// pre-2.5.0 ammonite +// import ammonite.ops._ + +// post 2.5.0 ammonite +import $ivy.`com.lihaoyi::os-lib:0.8.0` def compile_to_file(prog: List[Decl], class_name: String) : Unit = write.over(pwd / s"$class_name.j", compile(prog, class_name)) diff -r 8fb3b6d3be70 -r 81ee93b87258 progs/while-arrays/compile_arrays.sc --- a/progs/while-arrays/compile_arrays.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/progs/while-arrays/compile_arrays.sc Mon Jan 24 00:00:33 2022 +0000 @@ -214,7 +214,15 @@ // java arr/arr // automating the above -import ammonite.ops._ + +// pre-2.5.0 ammonite +// import ammonite.ops._ + +// post 2.5.0 ammonite +import $ivy.`com.lihaoyi::os-lib:0.8.0` +import os._ + + def compile_to_file(bl: Block, class_name: String) : Unit = write.over(pwd / s"$class_name.j", compile(bl, class_name)) diff -r 8fb3b6d3be70 -r 81ee93b87258 progs/while-arrays/compile_arrays2.sc --- a/progs/while-arrays/compile_arrays2.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/progs/while-arrays/compile_arrays2.sc Mon Jan 24 00:00:33 2022 +0000 @@ -231,7 +231,14 @@ // java arr/arr // automating the above -import ammonite.ops._ + +// pre-2.5.0 ammonite +// import ammonite.ops._ + +// post 2.5.0 ammonite +import $ivy.`com.lihaoyi::os-lib:0.8.0` +import os._ + def compile_to_file(bl: Block, class_name: String) : Unit = write.over(pwd / s"$class_name.j", compile(bl, class_name)) diff -r 8fb3b6d3be70 -r 81ee93b87258 progs/while-arrays/compile_bfc.sc --- a/progs/while-arrays/compile_bfc.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/progs/while-arrays/compile_bfc.sc Mon Jan 24 00:00:33 2022 +0000 @@ -63,7 +63,14 @@ } // automating the above -import ammonite.ops._ + +// pre-2.5.0 ammonite +// import ammonite.ops._ + +// post 2.5.0 ammonite +import $ivy.`com.lihaoyi::os-lib:0.8.0` +import os._ + def compile_to_file(bl: Block, class_name: String) : Unit = write.over(pwd / s"$class_name.j", compile(bl, class_name)) diff -r 8fb3b6d3be70 -r 81ee93b87258 solution/cw3/lexer.sc --- a/solution/cw3/lexer.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/solution/cw3/lexer.sc Mon Jan 24 00:00:33 2022 +0000 @@ -202,16 +202,17 @@ val KEYWORD : Rexp = "while" | "if" | "then" | "else" | "do" | "for" | "to" | "true" | "false" | "read" | "write" | "skip" val OP : Rexp = "+" | "-" | "*" | "%" | "/" | "==" | "!=" | ">" | "<" | ">=" | "<=" | ":=" | "&&" | "||" val LET: Rexp = RANGE(('A' to 'Z').toSet ++ ('a' to 'z')) -val SYM : Rexp = LET | RANGE(Set('.', '_', '>', '<', '=', ';', ',', ':')) +val SYM : Rexp = (LET | RANGE(Set('.', '_', '>', '<', '=', ';', ',', ':'))) val PARENS : Rexp = "(" | "{" | ")" | "}" val SEMI : Rexp = ";" -val WHITESPACE : Rexp = PLUS(" ") | "\n" | "\t" +val WHITESPACE : Rexp = PLUS(" ") | "\n" | "\t" | "\r" val DIGIT : Rexp = RANGE(('0' to '9').toSet) val DIGIT1 : Rexp = RANGE(('1' to '9').toSet) val STRING : Rexp = "\"" ~ (SYM | " " | "\\n" | DIGIT).% ~ "\"" val ID : Rexp = LET ~ (LET | "_" | DIGIT).% val NUM : Rexp = "0" | (DIGIT1 ~ DIGIT.%) -val COMMENT : Rexp = "//" ~ (SYM | " " | DIGIT).% ~ "\n" +val EOL : Rexp = "\n" | "\r\n" +val COMMENT : Rexp = "//" ~ (SYM | PARENS | " " | DIGIT).% ~ EOL val WHILE_REGS = (("k" $ KEYWORD) | ("o" $ OP) | @@ -248,3 +249,18 @@ lexing_simp(WHILE_REGS, s).collect(token) +val fact = """ +write "Input n please"; +read n; +write "The factors of n are"; +f := 2; +while n != 1 do { + while (n / f) * f == n do { + write f; + n := n / f + }; + f := f + 1 +} +""" +println(tokenise(fact)) + diff -r 8fb3b6d3be70 -r 81ee93b87258 solution/cw3/parser.sc --- a/solution/cw3/parser.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/solution/cw3/parser.sc Mon Jan 24 00:00:33 2022 +0000 @@ -132,8 +132,8 @@ (AExp ~ T_OP("!=") ~ AExp) ==> { case x ~ _ ~ z => Bop("!=", x, z): BExp } || (AExp ~ T_OP("<") ~ AExp) ==> { case x ~ _ ~ z => Bop("<", x, z): BExp } || (AExp ~ T_OP(">") ~ AExp) ==> { case x ~ _ ~ z => Bop(">", x, z): BExp } || - (T_PAREN("(") ~ BExp ~ List(T_PAREN(")"), T_OP("&&")) ~ BExp) ==> { case _ ~ y ~ _ ~ v => And(y, v): BExp } || - (T_PAREN("(") ~ BExp ~ List(T_PAREN(")"), T_OP("||")) ~ BExp) ==> { case _ ~ y ~ _ ~ v => Or(y, v): BExp } || + (T_PAREN("(") ~ BExp ~ T_PAREN(")") ~ T_OP("&&") ~ BExp) ==> { case _ ~ y ~ _ ~ _ ~ v => And(y, v): BExp } || + (T_PAREN("(") ~ BExp ~ T_PAREN(")") ~ T_OP("||") ~ BExp) ==> { case _ ~ y ~ _ ~ _ ~ v => Or(y, v): BExp } || (T_KEYWORD("true") ==> (_ => True: BExp )) || (T_KEYWORD("false") ==> (_ => False: BExp )) || (T_PAREN("(") ~ BExp ~ T_PAREN(")")) ==> { case _ ~ x ~ _ => x } @@ -145,7 +145,9 @@ (T_KEYWORD("while") ~ BExp ~ T_KEYWORD("do") ~ Block) ==> { case _ ~ y ~ _ ~ w => While(y, w) : Stmt } || (T_KEYWORD("read") ~ IdParser()) ==> { case _ ~ id => Read(id): Stmt} || (T_KEYWORD("write") ~ IdParser()) ==> { case _ ~ id => WriteId(id): Stmt} || - (T_KEYWORD("write") ~ StringParser()) ==> { case _ ~ s => WriteString(s): Stmt} + (T_KEYWORD("write") ~ StringParser()) ==> { case _ ~ s => WriteString(s): Stmt} || + (T_KEYWORD("write") ~ T_PAREN("(") ~ IdParser() ~ T_PAREN(")")) ==> { case _ ~ _ ~ id ~ _ => WriteId(id): Stmt} || + (T_KEYWORD("write") ~ T_PAREN("(") ~ StringParser() ~ T_PAREN(")")) ==> { case _ ~ _ ~ s ~ _ => WriteString(s): Stmt} lazy val Stmts: Parser[List[Token], Block] = (Stmt ~ T_SEMI ~ Stmts) ==> { case x ~ _ ~ z => x :: z : Block } || @@ -224,6 +226,10 @@ def eval(bl: Block) : Env = eval_bl(bl, Map()) +println("Primes eval") +println(tokenise(os.read(os.pwd / "primes.while"))) +println(eval(Stmts.parse_all(tokenise(os.read(os.pwd / "primes.while"))).head)) + println("Factors eval") println(eval(Stmts.parse_all(tokenise(os.read(os.pwd / "factors.while"))).head)) diff -r 8fb3b6d3be70 -r 81ee93b87258 solution/cw3/parser2.sc --- a/solution/cw3/parser2.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/solution/cw3/parser2.sc Mon Jan 24 00:00:33 2022 +0000 @@ -240,6 +240,10 @@ println("Factors eval") println(eval(Stmts.parse_all(tokenise(os.read(os.pwd / "factors.while"))).head)) +println("Primes eval") +println(eval(Stmts.parse_all(tokenise(os.read(os.pwd / "primes.while"))).head)) + + println("Collatz2 eval") println(eval(Stmts.parse_all(tokenise(os.read(os.pwd / "collatz2.while"))).head)) diff -r 8fb3b6d3be70 -r 81ee93b87258 solution/cw4/lexer.sc --- a/solution/cw4/lexer.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/solution/cw4/lexer.sc Mon Jan 24 00:00:33 2022 +0000 @@ -205,13 +205,14 @@ val SYM : Rexp = LET | RANGE(Set('.', '_', '>', '<', '=', ';', ',', ':')) val PARENS : Rexp = "(" | "{" | ")" | "}" val SEMI : Rexp = ";" -val WHITESPACE : Rexp = PLUS(" ") | "\n" | "\t" +val WHITESPACE : Rexp = PLUS(" ") | "\n" | "\t" | "\r" val DIGIT : Rexp = RANGE(('0' to '9').toSet) val DIGIT1 : Rexp = RANGE(('1' to '9').toSet) val STRING : Rexp = "\"" ~ (SYM | " " | "\\n" | DIGIT).% ~ "\"" val ID : Rexp = LET ~ (LET | "_" | DIGIT).% val NUM : Rexp = "0" | (DIGIT1 ~ DIGIT.%) -val COMMENT : Rexp = "//" ~ (SYM | " " | DIGIT).% ~ "\n" +val EOL : Rexp = "\n" | "\r\n" +val COMMENT : Rexp = "//" ~ (SYM | PARENS | " " | DIGIT).% ~ EOL val WHILE_REGS = (("k" $ KEYWORD) | ("o" $ OP) | diff -r 8fb3b6d3be70 -r 81ee93b87258 solution/cw5/fun_tokens.sc --- a/solution/cw5/fun_tokens.sc Thu Jan 20 08:58:38 2022 +0000 +++ b/solution/cw5/fun_tokens.sc Mon Jan 24 00:00:33 2022 +0000 @@ -195,7 +195,7 @@ "w" | "x" | "y" | "z" | "A" | "B" | "C" | "D" |"E" | "F" | "G" | "H" | "I" | "J" | "K" |"L" | "M" | "N" | "O" | "P" | "Q" | "R" |"S" | "T" | "U" | - "V" | "W" | "X" | "Y" | "Z" | "_" + "V" | "W" | "X" | "Y" | "Z" | "_" | ":" val DIGIT = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" val ID = SYM ~ (SYM | DIGIT).% val NUM = PLUS(DIGIT) diff -r 8fb3b6d3be70 -r 81ee93b87258 solution/cw5/sqr.fun --- a/solution/cw5/sqr.fun Thu Jan 20 08:58:38 2022 +0000 +++ b/solution/cw5/sqr.fun Mon Jan 24 00:00:33 2022 +0000 @@ -8,5 +8,8 @@ else skip() }; -all(0) - \ No newline at end of file +{ + print_string("Squares"); + new_line(); + all(0) +} \ No newline at end of file