From 01362bfb4adce7a738ec5fc4619962e48ff87470 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Wed, 24 Feb 2021 18:21:40 +0300 Subject: [PATCH 01/55] Revert "Prepared assignment" This reverts commit 26bd91c45f8a8f1b0f6cbf57b411bfe20b9db911. --- Makefile | 4 +- README.md | 2 +- regression/Embedding.meta | 24 ++- regression/Makefile | 3 +- runtime/Makefile | 7 - runtime/runtime.c | 14 -- src/Makefile | 4 +- src/X86.lama | 316 -------------------------------------- 8 files changed, 13 insertions(+), 361 deletions(-) delete mode 100644 runtime/Makefile delete mode 100644 runtime/runtime.c delete mode 100644 src/X86.lama diff --git a/Makefile b/Makefile index 04bfba1aae..b58d41d760 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,11 @@ .PHONY: all all: - make -C src - make -C runtime + make -C src make -C regression clean: make clean -C src - make clean -C runtime make clean -C regression diff --git a/README.md b/README.md index d212fdfc8d..c4d644d49a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# compiler-2020 +# compilers-2021-spring A supplementary repository for the course on compilers. diff --git a/regression/Embedding.meta b/regression/Embedding.meta index 278f3ba57c..b18a77bff7 100644 --- a/regression/Embedding.meta +++ b/regression/Embedding.meta @@ -6,7 +6,6 @@ import World; import Stmt; import State; import SM; -import X86; -- Embeds expression operands: strings are -- embedded into identifiers, integer constants --- into @@ -61,20 +60,15 @@ infixr >> before ::= (s1, s2) { -- Returns embedded program (thus, the file has to be recompiled as the -- program changes) -fun program () { +public fun program () { PROGRAM_BODY } -case sysargs of - [_] -> printf ("%s\n", compileX86 (compileSM (program ()))) -| _ -> - var input = - reverse (fix (fun (f) {fun (acc) {case readLine () of HASH val -> acc | arg -> f (stringInt (arg) : acc) esac}}) ({})); - - iter (fun (x) {printf ("%d\n", x)}, - case sysargs[1] of - "-i" -> evalStmt (input, program ()) - | "-s" -> evalSM (input, compileSM (program ())) - esac - ) -esac \ No newline at end of file +var input = reverse (fix (fun (f) {fun (acc) {case readLine () of #val -> acc | arg -> f (stringInt (arg) : acc) esac}}) ({})); + +iter (fun (x) {printf ("%d\n", x)}, + case sysargs[1] of + "-i" -> evalStmt (input, program ()) + | "-s" -> evalSM (input, compileSM (program ())) + esac + ) \ No newline at end of file diff --git a/regression/Makefile b/regression/Makefile index ffec8f2502..7494eefd01 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -11,11 +11,10 @@ check: $(TESTS) $(TESTS): %: %.lama @echo $@ cpp -P -D PROGRAM_BODY="`tr -d '\n' < $<`" Embedding.meta > tmp.lama - $(LAMAC) -I ../src -o $@ tmp.lama -ds + $(LAMAC) -I ../src -o $@ tmp.lama $(RM) tmp.lama cat $@.input | ./$@ -i > $@.log && diff $@.log orig/$@.log cat $@.input | ./$@ -s > $@.log && diff $@.log orig/$@.log - ./$@ > $@.s && gcc -g -m32 -o $@.run ../runtime/runtime.o $@.s && cat $@.input | ./$@.run > $@.log && diff $@.log orig/$@.log clean: $(RM) *.s *.i *~ $(LOGS) $(TESTS) diff --git a/runtime/Makefile b/runtime/Makefile deleted file mode 100644 index a4d5e8b02a..0000000000 --- a/runtime/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: runtime.o - -runtime.o: runtime.c - gcc -g -m32 -c runtime.c - -clean: - rm -f *.a *.o *~ diff --git a/runtime/runtime.c b/runtime/runtime.c deleted file mode 100644 index 8e9e6b3f7c..0000000000 --- a/runtime/runtime.c +++ /dev/null @@ -1,14 +0,0 @@ -# include - -void Lwrite (int x) { - printf ("%d\n", x); -} - -int Lread () { - int result; - - scanf ("%d", &result); - - return result; -} - diff --git a/src/Makefile b/src/Makefile index d1a63ff8cf..894faad910 100644 --- a/src/Makefile +++ b/src/Makefile @@ -12,9 +12,7 @@ Expr.o: State.o Stmt.o: State.o Expr.o World.o -SM.o: State.o World.o - -X86.o: SM.o +SM.o: State.o World.o %.o: %.lama $(LAMAC) -I . -c $< diff --git a/src/X86.lama b/src/X86.lama deleted file mode 100644 index 5e1da76c2e..0000000000 --- a/src/X86.lama +++ /dev/null @@ -1,316 +0,0 @@ --- X86 codegeneration interface --- We use stack machine programs as intermediate representation -import SM; -import Collection; -import List; -import Buffer; -import Fun; - --- Assembler language interface --- The registers: -var regs = ["%ebx", "%ecx", "%esi", "%edi", "%eax", "%edx", "%ebp", "%esp"]; - --- We can not freely operate with all register; only with 4 by now -var nRegs = regs.length - 5; - --- For convenience we define the following synonyms for the registers: -var ebx = R (0), - ecx = R (1), - esi = R (2), - edi = R (3), - eax = R (4), - edx = R (5), - ebp = R (6), - esp = R (7); - --- We need to know the word size to calculate offsets correctly -var wordSize = 4; - --- We need to distinguish the following operand types: --- R (int) -- hard register --- S (int) -- a position on the hardware stack --- M (string) -- a named memory location --- L (int) -- an immediate operand - --- Some x86 instruction (we do not need all of them): --- Mov (opnd, opnd) -- copies a value from the first to the second operand --- Binop (string, opnd, opnd) -- makes a binary operation; note, the first operand --- designates x86 operator, not the source language one --- IDiv (opnd) -- x86 integer division, see instruction set reference --- Cltd -- see instruction set reference --- Set (string, string) -- sets a value from flags; the first operand is the --- suffix, which determines the value being set, the --- the second --- (sub)register name --- Push (opnd) -- pushes the operand on the hardware stack --- Pop (opnd) -- pops from the hardware stack to the operand --- Call (string) -- calls a function by its name --- Ret -- returns from a function --- Meta (string) -- metainformation (declarations, etc.) - --- Machine instruction printer -fun insnString (insn) { - - fun binopString (op) { - case op of - "+" -> "addl" - | "-" -> "subl" - | "*" -> "imull" - | "&&" -> "andl" - | "!!" -> "orl" - | "^" -> "xorl" - | "cmp" -> "cmpl" - esac - } - - fun opndString (opnd) { - case opnd of - R (i) -> regs [i] - | S (i) -> sprintf ("-%d(%%ebp)", (i+1) * wordSize) - | M (x) -> x - | L (i) -> sprintf ("$%d", i) - esac - } - - case insn of - Cltd -> "\tcltd\n" - | Set (suf, s) -> sprintf ("\tset%s\t%s\n", suf, s) - | IDiv (s1) -> sprintf ("\tidivl\t%s\n", opndString (s1)) - | Binop (op, s1, s2) -> sprintf ("\t%s\t%s,\t%s\n", binopString (op), opndString (s1), opndString (s2)) - | Mov (s1, s2) -> sprintf ("\tmovl\t%s,\t%s\n", opndString (s1), opndString (s2)) - | Push (s) -> sprintf ("\tpushl\t%s\n", opndString (s)) - | Pop (s) -> sprintf ("\tpopl\t%s\n", opndString (s)) - | Ret -> "\tret\n" - | Call (p) -> sprintf ("\tcall\t%s\n", p) - | Meta (m) -> m - esac -} - --- Environment for symbolic interpreter --- An environment holds --- a symbolic stack --- a maximal stack depth reached so far --- a set of global variable names - -fun makeEnv (stack, stackSlots, globals) { - -- Returns an internal name for a global variable - fun globalName (name) { - "global_" ++ name - } - - -- Returns a string representation of the environment - fun envString () { - sprintf ("Stack : %s\nStackSlots: %d\nGlobals : %s\n", stack.string, stackSlots, elements (globals).string) - } - - -- Allocates a new position on the symbolic stack; - -- returns a pair: a location for allocated item and - -- an updated environment - fun allocate () { - case - case stack of - {} -> [ebx, 0] - | S (n) : _ -> [S (n+1), n+2] - | R (n) : _ -> if n < nRegs then [R (n+1), stackSlots] else [S (0), 1] fi - | _ -> [S (0), 1] - esac - of [x, n] -> [x, makeEnv (x : stack, if n > stackSlots then n else stackSlots fi, globals)]esac - } - - -- Pushes an item on the symbolic state; returns an updated envirtonment - fun push (y) { - makeEnv (y : stack, stackSlots, globals) - } - - -- Pops one item from the symbolic stack; returns a pair: a popped - -- item and an updated environment - fun pop () { - case stack of - x : stack -> [x, makeEnv (stack, stackSlots, globals)] - esac - } - - -- Pops two items from the symbolic stack; returns a triple: - -- popped items and an undated environment - fun pop2 () { - case stack of - x : y : stack -> [x, y, makeEnv (stack, stackSlots, globals)] - esac - } - - -- Adds a global variable; returns an updated environment - fun addGlobal (name) { - makeEnv (stack, stackSlots, addSet (globals, globalName (name))) - } - - -- References a global variable - fun loc (name) { - M (globalName (name)) - } - - -- Gets a list of global variables from the environment - fun getGlobals () { - globals.elements - } - - -- Gets a maximal stack size from the environment - fun getStackSize () { - stackSlots - } - - [envString, allocate, push, pop, pop2, addGlobal, loc, getGlobals, getStackSize] -} - --- Exported accessors -fun envString (env) { - env [0] () -} - -fun allocate (env) { - env [1] () -} - -fun push (env, x) { - env [2] (x) -} - -fun pop (env) { - env [3] () -} - -fun pop2 (env) { - env [4] () -} - -fun addGlobal (env, name) { - env [5] (name) -} - -fun loc (env, name) { - env [6] (name) -} - -fun getGlobals (env) { - env [7] () -} - -fun getStackSize (env) { - env [8] () -} - --- Creates an initial environment -fun initEnv () { - makeEnv (0, emptySet (compare), emptySet (compare)) -} - --- Codegeneration helper functions --- Generates code section -fun codeSection (text) { - singletonBuffer (Meta ("\t.text\n")) <+> text -} - --- Generates data section -fun dataSection (text) { - singletonBuffer (Meta ("\t.data\n")) <+> text -} - --- Generates data definition -fun dataDef (name) { - Meta (sprintf ("%s:\t.int\t0\n", name)) -} - --- Generates function prologue -fun prologue (size) { - singletonBuffer (Push (ebp)) <+ - Mov (esp, ebp) <+ - Binop ("-", L (wordSize*size), esp) -} - --- Generates function epilogue -fun epilogue () { - singletonBuffer (Mov (ebp, esp)) <+ - Pop (ebp) <+ - Binop ("^", eax, eax) <+ - Ret -} - --- Checks if an operand resides on a stack -fun stackOpnd (opnd) { - case opnd of - S (_) -> true - | _ -> false - esac -} - --- Checks if an operand resides in memory -fun memOpnd (opnd) { - case opnd of - S (_) -> true - | M (_) -> true - | _ -> false - esac -} - --- Generates a move between locations, using --- intermediate register if needed -fun move (from, to) { - if memOpnd (from) && memOpnd (to) - then singletonBuffer (Mov (from, eax)) <+ Mov (eax, to) - else singletonBuffer (Mov (from, to)) - fi -} - --- Gets a suffix for Set instruction from --- source language comparison operator -fun suffix (op) { - case op of - "<" -> "l" - | "<=" -> "le" - | "==" -> "e" - | "!=" -> "ne" - | ">=" -> "ge" - | ">" -> "g" - esac -} - --- Compiles stack machine code into a list of x86 instructions. Takes an environment --- and stack machine code, returns an updated environment and x86 code. -fun compile (env, code) { - fun compile (env, code) { - foldl ( - fun ([env, scode], i) { - var code = scode <+ Meta ("# " ++ showSMInsn (i) ++ "\n"); - case i of - READ -> - case env.allocate of - [s, env] -> [env, code <+ Call ("Lread") <+ Mov (eax, s)] - esac - | WRITE -> - case env.pop of - [s, env] -> [env, code <+ Push (s) <+ Call ("Lwrite") <+ Pop (eax)] - esac - | _ -> failure ("codegeneration for instruction %s is not yet implemented\n", i.string) - esac - }, [env, emptyBuffer ()], code) - } - - compile (env, code) -} - --- A top-level codegeneration function. Takes a stack machine program --- and returns x86 listing as a string -public fun compileX86 (code) { - case compile (initEnv (), code) of - [env, code] -> - map (insnString, - getBuffer $ - singletonBuffer (Meta ("\t.global\tmain\n")) <+> - dataSection (listBuffer $ map (dataDef, getGlobals (env))) <+> - codeSection ( - singletonBuffer (Meta ("main:\n")) <+> - prologue (getStackSize (env)) <+> - code <+> - epilogue () - ) - ).stringcat - esac -} From 5e6e7ccf2b521fb030cc15494a0ebe3a8e52bfd5 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Tue, 2 Mar 2021 17:26:47 +0300 Subject: [PATCH 02/55] Makefile --- src/Expr.lama | 30 +++++++++++++++++++++++++++++- src/Makefile | 2 +- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/Expr.lama b/src/Expr.lama index b758035636..f027dd8a21 100644 --- a/src/Expr.lama +++ b/src/Expr.lama @@ -1,6 +1,7 @@ -- Expression evaluator import List; +import Collection; import State; @@ -13,6 +14,33 @@ import State; -- Const (int) | -- Binop (string, expr, expr) +var m = + foldl (fun (m, [op, fop]) {addMap (m, op, fop)}, + emptyMap (compare), + {["+" , infix + ], + ["-" , infix - ], + ["*" , infix * ], + ["/" , infix / ], + ["%" , infix % ], + ["==", infix ==], + ["!=", infix !=], + ["<" , infix < ], + ["<=", infix <=], + [">" , infix > ], + [">=", infix >=], + ["&&", infix &&], + ["!!", infix !!]} + ); + +fun evalOp (op, x, y) { + case findMap (m, op) of Some (f) -> f (x, y) esac +} + public fun evalExpr (st, expr) { - failure ("evalExpr not implemented\n") + case expr of + Var (x) -> st (x) + | Const (n) -> n + | Binop (op, x, y) -> evalOp (op, evalExpr (st, x), evalExpr (st, y)) + esac } + diff --git a/src/Makefile b/src/Makefile index 894faad910..c28e990d51 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,7 +2,7 @@ SHELL := /bin/bash FILES=$(wildcard *.lama) ALL=$(sort $(FILES:.lama=.o)) -LAMAC=lamac +LAMAC=lamac -g .PHONY: all clean From 6d98fc35e839cb9defa8ebe7c3a36634d2f71b88 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Wed, 3 Mar 2021 14:48:48 +0300 Subject: [PATCH 03/55] Revert "Makefile" This reverts commit 5e6e7ccf2b521fb030cc15494a0ebe3a8e52bfd5. --- src/Expr.lama | 30 +----------------------------- src/Makefile | 2 +- 2 files changed, 2 insertions(+), 30 deletions(-) diff --git a/src/Expr.lama b/src/Expr.lama index f027dd8a21..b758035636 100644 --- a/src/Expr.lama +++ b/src/Expr.lama @@ -1,7 +1,6 @@ -- Expression evaluator import List; -import Collection; import State; @@ -14,33 +13,6 @@ import State; -- Const (int) | -- Binop (string, expr, expr) -var m = - foldl (fun (m, [op, fop]) {addMap (m, op, fop)}, - emptyMap (compare), - {["+" , infix + ], - ["-" , infix - ], - ["*" , infix * ], - ["/" , infix / ], - ["%" , infix % ], - ["==", infix ==], - ["!=", infix !=], - ["<" , infix < ], - ["<=", infix <=], - [">" , infix > ], - [">=", infix >=], - ["&&", infix &&], - ["!!", infix !!]} - ); - -fun evalOp (op, x, y) { - case findMap (m, op) of Some (f) -> f (x, y) esac -} - public fun evalExpr (st, expr) { - case expr of - Var (x) -> st (x) - | Const (n) -> n - | Binop (op, x, y) -> evalOp (op, evalExpr (st, x), evalExpr (st, y)) - esac + failure ("evalExpr not implemented\n") } - diff --git a/src/Makefile b/src/Makefile index c28e990d51..894faad910 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,7 +2,7 @@ SHELL := /bin/bash FILES=$(wildcard *.lama) ALL=$(sort $(FILES:.lama=.o)) -LAMAC=lamac -g +LAMAC=lamac .PHONY: all clean From a6c5b1f1125b8baa6c1ac6014afc3ec9463581e9 Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Thu, 16 Sep 2021 01:31:57 +0300 Subject: [PATCH 04/55] update travis.yml: update docker archive --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 66e6a4ee2f..6140732e2b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: c services: - docker before_install: - - wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1XpZ9YqArvAm_0a67G5K8VjUK7FdOCJLZ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1XpZ9YqArvAm_0a67G5K8VjUK7FdOCJLZ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt + - wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt - docker load < cw-20201.tar.gz - docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 script: From 975dd8e9da223d0771cc535d5edde4f498980e80 Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Thu, 16 Sep 2021 12:24:54 +0300 Subject: [PATCH 05/55] add check.yml --- .github/workflows/check.yml | 115 ++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 .github/workflows/check.yml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000000..5a53956cbe --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,115 @@ +name: Regression + +on: # [push] + # pull_request: + pull_request_target: + types: [opened, reopened, edited] + +jobs: + job1: + runs-on: ubuntu-latest + # Map a step output to a job output + outputs: + output_id: ${{ steps.step1.outputs.id }} + output_result: ${{ steps.step1.outputs.res }} + steps: + - name: Extract branch name + shell: bash + run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" + id: extract_branch + - uses: actions/checkout@v2 +# with: +# ref: refs/pull/${{ github.event.pull_request.number }}/head + - id: step1 +# echo "::set-output name=res::$?" +# echo ${{ steps.extract_branch.outputs.branch }} +# echo ${{ github.base_ref }} +# echo ${{ github.head_ref }} +# head=${{ github.head_ref }} +# echo ${head:0:3} + run: | + login=${{ github.event.pull_request.user.login }} + echo "$login" + echo "::set-output name=id::\"$login\"" + echo "::set-output name=res::0" + if [ "${{ github.base_ref }}" != "${{ github.head_ref }}" ]; then + echo "base and head branch names differs: stop" + exit 1 + fi + wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1XpZ9YqArvAm_0a67G5K8VjUK7FdOCJLZ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1XpZ9YqArvAm_0a67G5K8VjUK7FdOCJLZ" -O cw-20201.tar.gz + rm -rf /tmp/cookies.txt + docker load < cw-20201.tar.gz + docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 + docker exec -t cw-2021 sh test.sh + echo "::set-output name=res::1" + job2: + runs-on: ubuntu-latest + needs: job1 + outputs: + output_id_number: ${{ steps.step1.outputs.id }} + steps: + - id: 'get_worksheet' + uses: jroehl/gsheet.action@v1.0.0 + with: + spreadsheetId: ${{secrets.SPREADSHEET_ID}} + commands: | # list of commands, specified as a valid JSON string + [ + { "command": "getData", "args": { "worksheetTitle": "Sheet1", "minCol": 1, "maxCol": 1 } } + ] + env: + GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} + GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} + - id: step1 + name: dump results + env: + # the output of the action can be found in ${{ steps.update_worksheet.outputs.results }} + RESULTS: ${{ steps.get_worksheet.outputs.results }} + run: | + cmd=$(echo "${RESULTS}" | jq ".results[0].result.rawData") + echo ${{ needs.job1.steps.extract_branch.outputs.branch }} + + branch=${{ github.base_ref }} + assignment=${branch:1:2} + echo "assignment $assignment" + + branch=\"${{needs.job1.outputs.output_branch}}\" + echo $branch + echo ${branch:0:3} + gitid=\"${{needs.job1.outputs.output_id}}\" + result=\"${{needs.job1.outputs.output_result}}\" + j=0 + for i in {1..60} + do + t=$(echo "${cmd}" | jq ".[$i][0]") + echo "$t" + echo "$gitid" + if [ "$t" = "$gitid" ]; then + echo "FOUND" + echo "$i" + j="[{ \"command\": \"updateData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$result", "$result"]], \"minCol\": $((assignment*2)), \"minRow\": $((i+1)) }} ]" + echo "$j" + echo "::set-output name=id::$j" + else + echo "Strings are not equal." + fi + done + if [[ $j -eq 0 ]] + then + j="[{ \"command\": \"appendData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$gitid", "$result", "$result"]], \"minCol\": 1 }} ]" + echo "::set-output name=id::$j" + fi + echo $j + echo "$gitid" +# echo "::set-output name=id::$i" + job3: + runs-on: ubuntu-latest + needs: job2 + steps: + - id: 'update_worksheet' + uses: jroehl/gsheet.action@v1.0.0 + with: + spreadsheetId: ${{secrets.SPREADSHEET_ID}} + commands: ${{needs.job2.outputs.output_id_number}} + env: + GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} + GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} From 99f77104b58a2edd5f211b5ef8b06ca9a60f210f Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 16 Sep 2021 12:35:56 +0300 Subject: [PATCH 06/55] Update check.yml --- .github/workflows/check.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 5a53956cbe..a9bcd974fd 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -31,8 +31,8 @@ jobs: login=${{ github.event.pull_request.user.login }} echo "$login" echo "::set-output name=id::\"$login\"" - echo "::set-output name=res::0" - if [ "${{ github.base_ref }}" != "${{ github.head_ref }}" ]; then + echo "::set-output name=res::0" + if [ "${{ github.base_ref }}" != "${{ github.head_ref }}" ]; then echo "base and head branch names differs: stop" exit 1 fi From 49f97238c366f7128a0d194577ed71a35cb483ab Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 16 Sep 2021 12:38:21 +0300 Subject: [PATCH 07/55] Update check.yml fix link to the docker image --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index a9bcd974fd..b74cd701d2 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -36,7 +36,7 @@ jobs: echo "base and head branch names differs: stop" exit 1 fi - wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1XpZ9YqArvAm_0a67G5K8VjUK7FdOCJLZ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1XpZ9YqArvAm_0a67G5K8VjUK7FdOCJLZ" -O cw-20201.tar.gz + wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt rm -rf /tmp/cookies.txt docker load < cw-20201.tar.gz docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 From bb3dc6cc32f4b935ffce18517a2cf3c1e5899b56 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 16 Sep 2021 12:52:36 +0300 Subject: [PATCH 08/55] Update check.yml --- .github/workflows/check.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index b74cd701d2..ee5a0cdf7c 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -18,8 +18,8 @@ jobs: run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" id: extract_branch - uses: actions/checkout@v2 -# with: -# ref: refs/pull/${{ github.event.pull_request.number }}/head + with: + ref: refs/pull/${{ github.event.pull_request.number }}/head - id: step1 # echo "::set-output name=res::$?" # echo ${{ steps.extract_branch.outputs.branch }} From 13df55ccc2fb466ae274fd1ae669500136781af2 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 16 Sep 2021 12:56:37 +0300 Subject: [PATCH 09/55] Update check.yml quiet `wget` --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index ee5a0cdf7c..7855da13c5 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -36,7 +36,7 @@ jobs: echo "base and head branch names differs: stop" exit 1 fi - wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt + wget -q --show-progress --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt rm -rf /tmp/cookies.txt docker load < cw-20201.tar.gz docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 From d01c6f3a86962299590358ed592ab4144e05cc41 Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Thu, 16 Sep 2021 22:56:56 +0300 Subject: [PATCH 10/55] fix secu --- .github/workflows/check.yml | 161 ++++++++++++++++--------------- .github/workflows/postaction.yml | 102 ++++++++++++++++++++ 2 files changed, 183 insertions(+), 80 deletions(-) create mode 100644 .github/workflows/postaction.yml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 7855da13c5..aa4f62185a 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -9,9 +9,6 @@ jobs: job1: runs-on: ubuntu-latest # Map a step output to a job output - outputs: - output_id: ${{ steps.step1.outputs.id }} - output_result: ${{ steps.step1.outputs.res }} steps: - name: Extract branch name shell: bash @@ -21,17 +18,9 @@ jobs: with: ref: refs/pull/${{ github.event.pull_request.number }}/head - id: step1 -# echo "::set-output name=res::$?" -# echo ${{ steps.extract_branch.outputs.branch }} -# echo ${{ github.base_ref }} -# echo ${{ github.head_ref }} -# head=${{ github.head_ref }} -# echo ${head:0:3} run: | login=${{ github.event.pull_request.user.login }} echo "$login" - echo "::set-output name=id::\"$login\"" - echo "::set-output name=res::0" if [ "${{ github.base_ref }}" != "${{ github.head_ref }}" ]; then echo "base and head branch names differs: stop" exit 1 @@ -41,75 +30,87 @@ jobs: docker load < cw-20201.tar.gz docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 docker exec -t cw-2021 sh test.sh - echo "::set-output name=res::1" - job2: - runs-on: ubuntu-latest - needs: job1 - outputs: - output_id_number: ${{ steps.step1.outputs.id }} - steps: - - id: 'get_worksheet' - uses: jroehl/gsheet.action@v1.0.0 + + echo "$login" > gitid.txt + echo ${{ github.base_ref }} > base.txt + echo ${branch:1:2} > assignment_number.txt + + - uses: actions/upload-artifact@v2 with: - spreadsheetId: ${{secrets.SPREADSHEET_ID}} - commands: | # list of commands, specified as a valid JSON string - [ - { "command": "getData", "args": { "worksheetTitle": "Sheet1", "minCol": 1, "maxCol": 1 } } - ] - env: - GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} - GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} - - id: step1 - name: dump results - env: - # the output of the action can be found in ${{ steps.update_worksheet.outputs.results }} - RESULTS: ${{ steps.get_worksheet.outputs.results }} - run: | - cmd=$(echo "${RESULTS}" | jq ".results[0].result.rawData") - echo ${{ needs.job1.steps.extract_branch.outputs.branch }} + name: share_info + path: | + gitid.txt + base.txt + assignment_number.txt + +# job2: +# runs-on: ubuntu-latest +# needs: job1 +# outputs: +# output_id_number: ${{ steps.step1.outputs.id }} +# steps: +# - id: 'get_worksheet' +# uses: jroehl/gsheet.action@v1.0.0 +# with: +# spreadsheetId: ${{secrets.SPREADSHEET_ID}} +# commands: | # list of commands, specified as a valid JSON string +# [ +# { "command": "getData", "args": { "worksheetTitle": "Sheet1", "minCol": 1, "maxCol": 1 } } +# ] +# env: +# GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} +# GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} +# - id: step1 +# name: dump results +# env: +# # the output of the action can be found in ${{ steps.update_worksheet.outputs.results }} +# RESULTS: ${{ steps.get_worksheet.outputs.results }} +# run: | +# cmd=$(echo "${RESULTS}" | jq ".results[0].result.rawData") +# echo ${{ needs.job1.steps.extract_branch.outputs.branch }} - branch=${{ github.base_ref }} - assignment=${branch:1:2} - echo "assignment $assignment" +# branch=${{ github.base_ref }} +# assignment=${branch:1:2} +# echo "assignment $assignment" - branch=\"${{needs.job1.outputs.output_branch}}\" - echo $branch - echo ${branch:0:3} - gitid=\"${{needs.job1.outputs.output_id}}\" - result=\"${{needs.job1.outputs.output_result}}\" - j=0 - for i in {1..60} - do - t=$(echo "${cmd}" | jq ".[$i][0]") - echo "$t" - echo "$gitid" - if [ "$t" = "$gitid" ]; then - echo "FOUND" - echo "$i" - j="[{ \"command\": \"updateData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$result", "$result"]], \"minCol\": $((assignment*2)), \"minRow\": $((i+1)) }} ]" - echo "$j" - echo "::set-output name=id::$j" - else - echo "Strings are not equal." - fi - done - if [[ $j -eq 0 ]] - then - j="[{ \"command\": \"appendData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$gitid", "$result", "$result"]], \"minCol\": 1 }} ]" - echo "::set-output name=id::$j" - fi - echo $j - echo "$gitid" -# echo "::set-output name=id::$i" - job3: - runs-on: ubuntu-latest - needs: job2 - steps: - - id: 'update_worksheet' - uses: jroehl/gsheet.action@v1.0.0 - with: - spreadsheetId: ${{secrets.SPREADSHEET_ID}} - commands: ${{needs.job2.outputs.output_id_number}} - env: - GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} - GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} +# branch=\"${{needs.job1.outputs.output_branch}}\" +# echo $branch +# echo ${branch:0:3} +# gitid=\"${{needs.job1.outputs.output_id}}\" +# result=\"${{needs.job1.outputs.output_result}}\" +# j=0 +# for i in {1..60} +# do +# t=$(echo "${cmd}" | jq ".[$i][0]") +# echo "$t" +# echo "$gitid" +# if [ "$t" = "$gitid" ]; then +# echo "FOUND" +# echo "$i" +# j="[{ \"command\": \"updateData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$result", "$result"]], \"minCol\": $((assignment*2)), \"minRow\": $((i+1)) }} ]" +# echo "$j" +# echo "::set-output name=id::$j" +# else +# echo "Strings are not equal." +# fi +# done +# if [[ $j -eq 0 ]] +# then +# j="[{ \"command\": \"appendData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$gitid", "$result", "$result"]], \"minCol\": 1 }} ]" +# echo "::set-output name=id::$j" +# fi +# echo $j +# echo "$gitid" +# # echo "::set-output name=id::$i" +# job3: +# runs-on: ubuntu-latest +# needs: job2 +# steps: +# - id: 'update_worksheet' +# uses: jroehl/gsheet.action@v1.0.0 +# with: +# spreadsheetId: ${{secrets.SPREADSHEET_ID}} +# commands: ${{needs.job2.outputs.output_id_number}} +# env: +# GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} +# GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} diff --git a/.github/workflows/postaction.yml b/.github/workflows/postaction.yml new file mode 100644 index 0000000000..0127d73451 --- /dev/null +++ b/.github/workflows/postaction.yml @@ -0,0 +1,102 @@ +name: PostAction + +on: + workflow_run: + workflows: ["Regression"] + types: + - completed + +jobs: + job2: + runs-on: ubuntu-latest + needs: job1 + outputs: + output_id_number: ${{ steps.step1.outputs.id }} + steps: + - name: 'Download artifact' + uses: actions/github-script@v3.1.0 + with: + script: | + console.log(${{ github.event.workflow_run.id }}); + var artifacts = await github.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: ${{ github.event.workflow_run.id }}, + }); + var matchArtifact = artifacts.data.artifacts.filter((artifact) => { + return artifact.name == "share_info"; + })[0]; + var download = await github.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: matchArtifact.id, + archive_format: 'zip', + }); + var fs = require('fs'); + fs.writeFileSync('${{ github.workspace }}/share_info.zip', Buffer.from(download.data)); + + - run: unzip share_info.zip + - run: + echo "assignment=$(cat assignment_number.txt)" >> $GITHUB_ENV + echo "login=$(cat gitid.txt)" >> $GITHUB_ENV + echo "base=$(cat base.txt)" >> $GITHUB_ENV + + - id: 'get_worksheet' + uses: jroehl/gsheet.action@v1.0.0 + with: + spreadsheetId: ${{secrets.SPREADSHEET_ID}} + commands: | # list of commands, specified as a valid JSON string + [ + { "command": "getData", "args": { "worksheetTitle": "Sheet1", "minCol": 1, "maxCol": 1 } } + ] + env: + GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} + GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} + - id: step1 + name: dump results + env: + # the output of the action can be found in ${{ steps.update_worksheet.outputs.results }} + RESULTS: ${{ steps.get_worksheet.outputs.results }} + run: | + cmd=$(echo "${RESULTS}" | jq ".results[0].result.rawData") + + branch=${{ env.base }} + assignment=${{ env.assignment }} + gitid=${{ env.login }} + result=1 + j=0 + for i in {1..60} + do + t=$(echo "${cmd}" | jq ".[$i][0]") + echo "$t" + echo "$gitid" + if [ "$t" = "$gitid" ]; then + echo "FOUND" + echo "$i" + j="[{ \"command\": \"updateData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$result", "$result"]], \"minCol\": $((assignment*2)), \"minRow\": $((i+1)) }} ]" + echo "$j" + echo "::set-output name=id::$j" + else + echo "Strings are not equal." + fi + done + if [[ $j -eq 0 ]] + then + j="[{ \"command\": \"appendData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$gitid", "$result", "$result"]], \"minCol\": 1 }} ]" + echo "::set-output name=id::$j" + fi + echo $j + echo "$gitid" +# echo "::set-output name=id::$i" + job3: + runs-on: ubuntu-latest + needs: job2 + steps: + - id: 'update_worksheet' + uses: jroehl/gsheet.action@v1.0.0 + with: + spreadsheetId: ${{secrets.SPREADSHEET_ID}} + commands: ${{needs.job2.outputs.output_id_number}} + env: + GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} + GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} From b7f94a7442f85708452832d19a64549d19e55ae4 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 16 Sep 2021 22:58:35 +0300 Subject: [PATCH 11/55] Update check.yml fix tabs --- .github/workflows/check.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index aa4f62185a..66f46cc529 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -30,8 +30,8 @@ jobs: docker load < cw-20201.tar.gz docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 docker exec -t cw-2021 sh test.sh - - echo "$login" > gitid.txt + + echo "$login" > gitid.txt echo ${{ github.base_ref }} > base.txt echo ${branch:1:2} > assignment_number.txt @@ -40,8 +40,8 @@ jobs: name: share_info path: | gitid.txt - base.txt - assignment_number.txt + base.txt + assignment_number.txt # job2: # runs-on: ubuntu-latest From 31897431ed8e80144d09894f058f2a4d535e8551 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 16 Sep 2021 23:00:03 +0300 Subject: [PATCH 12/55] Update postaction.yml fix tabs --- .github/workflows/postaction.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/postaction.yml b/.github/workflows/postaction.yml index 0127d73451..5213ba3b05 100644 --- a/.github/workflows/postaction.yml +++ b/.github/workflows/postaction.yml @@ -9,7 +9,6 @@ on: jobs: job2: runs-on: ubuntu-latest - needs: job1 outputs: output_id_number: ${{ steps.step1.outputs.id }} steps: @@ -36,10 +35,10 @@ jobs: fs.writeFileSync('${{ github.workspace }}/share_info.zip', Buffer.from(download.data)); - run: unzip share_info.zip - - run: + - run: | echo "assignment=$(cat assignment_number.txt)" >> $GITHUB_ENV - echo "login=$(cat gitid.txt)" >> $GITHUB_ENV - echo "base=$(cat base.txt)" >> $GITHUB_ENV + echo "login=$(cat gitid.txt)" >> $GITHUB_ENV + echo "base=$(cat base.txt)" >> $GITHUB_ENV - id: 'get_worksheet' uses: jroehl/gsheet.action@v1.0.0 From 7818d31cfb9c19a0d1397e2412531c6612f7bcdc Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 16 Sep 2021 23:02:29 +0300 Subject: [PATCH 13/55] Update check.yml remove --show-progress --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 66f46cc529..bd20fea4cb 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -25,7 +25,7 @@ jobs: echo "base and head branch names differs: stop" exit 1 fi - wget -q --show-progress --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt + wget -q --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt rm -rf /tmp/cookies.txt docker load < cw-20201.tar.gz docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 From 2e41e780a9621b91c6bfc3874063ce5c72822458 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 16 Sep 2021 23:05:22 +0300 Subject: [PATCH 14/55] Update check.yml fix branch var --- .github/workflows/check.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index bd20fea4cb..1ea5812f52 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -33,6 +33,7 @@ jobs: echo "$login" > gitid.txt echo ${{ github.base_ref }} > base.txt + branch=${{ github.base_ref }} echo ${branch:1:2} > assignment_number.txt - uses: actions/upload-artifact@v2 From 81bfb82bc9a32b0ea5c119b014eddfcd1b59857f Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 16 Sep 2021 23:08:10 +0300 Subject: [PATCH 15/55] Update postaction.yml --- .github/workflows/postaction.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/postaction.yml b/.github/workflows/postaction.yml index 5213ba3b05..47241bb538 100644 --- a/.github/workflows/postaction.yml +++ b/.github/workflows/postaction.yml @@ -9,6 +9,9 @@ on: jobs: job2: runs-on: ubuntu-latest + if: > + ${{ github.event.workflow_run.event == 'pull_request_target' && + github.event.workflow_run.conclusion == 'success' }} outputs: output_id_number: ${{ steps.step1.outputs.id }} steps: From b4195c0dcb7017b8dfe0902c261131a4710175ea Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 16 Sep 2021 23:26:09 +0300 Subject: [PATCH 16/55] Update check.yml --- .github/workflows/check.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 1ea5812f52..5cf0b1a318 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -1,8 +1,8 @@ name: Regression on: # [push] - # pull_request: - pull_request_target: + pull_request: + # pull_request_target: types: [opened, reopened, edited] jobs: From a86da05bee8ed4bf1021e773909aa4cd2b460711 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 16 Sep 2021 23:31:18 +0300 Subject: [PATCH 17/55] Update postaction.yml --- .github/workflows/postaction.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/postaction.yml b/.github/workflows/postaction.yml index 47241bb538..189ba99888 100644 --- a/.github/workflows/postaction.yml +++ b/.github/workflows/postaction.yml @@ -10,7 +10,7 @@ jobs: job2: runs-on: ubuntu-latest if: > - ${{ github.event.workflow_run.event == 'pull_request_target' && + ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} outputs: output_id_number: ${{ steps.step1.outputs.id }} From e8d8e5a1fa950aee7072acecd485888a50b0f9cd Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Fri, 17 Sep 2021 00:48:07 +0300 Subject: [PATCH 18/55] rm extra --- .github/workflows/postaction.yml | 104 ------------------------------- 1 file changed, 104 deletions(-) delete mode 100644 .github/workflows/postaction.yml diff --git a/.github/workflows/postaction.yml b/.github/workflows/postaction.yml deleted file mode 100644 index 189ba99888..0000000000 --- a/.github/workflows/postaction.yml +++ /dev/null @@ -1,104 +0,0 @@ -name: PostAction - -on: - workflow_run: - workflows: ["Regression"] - types: - - completed - -jobs: - job2: - runs-on: ubuntu-latest - if: > - ${{ github.event.workflow_run.event == 'pull_request' && - github.event.workflow_run.conclusion == 'success' }} - outputs: - output_id_number: ${{ steps.step1.outputs.id }} - steps: - - name: 'Download artifact' - uses: actions/github-script@v3.1.0 - with: - script: | - console.log(${{ github.event.workflow_run.id }}); - var artifacts = await github.actions.listWorkflowRunArtifacts({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: ${{ github.event.workflow_run.id }}, - }); - var matchArtifact = artifacts.data.artifacts.filter((artifact) => { - return artifact.name == "share_info"; - })[0]; - var download = await github.actions.downloadArtifact({ - owner: context.repo.owner, - repo: context.repo.repo, - artifact_id: matchArtifact.id, - archive_format: 'zip', - }); - var fs = require('fs'); - fs.writeFileSync('${{ github.workspace }}/share_info.zip', Buffer.from(download.data)); - - - run: unzip share_info.zip - - run: | - echo "assignment=$(cat assignment_number.txt)" >> $GITHUB_ENV - echo "login=$(cat gitid.txt)" >> $GITHUB_ENV - echo "base=$(cat base.txt)" >> $GITHUB_ENV - - - id: 'get_worksheet' - uses: jroehl/gsheet.action@v1.0.0 - with: - spreadsheetId: ${{secrets.SPREADSHEET_ID}} - commands: | # list of commands, specified as a valid JSON string - [ - { "command": "getData", "args": { "worksheetTitle": "Sheet1", "minCol": 1, "maxCol": 1 } } - ] - env: - GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} - GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} - - id: step1 - name: dump results - env: - # the output of the action can be found in ${{ steps.update_worksheet.outputs.results }} - RESULTS: ${{ steps.get_worksheet.outputs.results }} - run: | - cmd=$(echo "${RESULTS}" | jq ".results[0].result.rawData") - - branch=${{ env.base }} - assignment=${{ env.assignment }} - gitid=${{ env.login }} - result=1 - j=0 - for i in {1..60} - do - t=$(echo "${cmd}" | jq ".[$i][0]") - echo "$t" - echo "$gitid" - if [ "$t" = "$gitid" ]; then - echo "FOUND" - echo "$i" - j="[{ \"command\": \"updateData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$result", "$result"]], \"minCol\": $((assignment*2)), \"minRow\": $((i+1)) }} ]" - echo "$j" - echo "::set-output name=id::$j" - else - echo "Strings are not equal." - fi - done - if [[ $j -eq 0 ]] - then - j="[{ \"command\": \"appendData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$gitid", "$result", "$result"]], \"minCol\": 1 }} ]" - echo "::set-output name=id::$j" - fi - echo $j - echo "$gitid" -# echo "::set-output name=id::$i" - job3: - runs-on: ubuntu-latest - needs: job2 - steps: - - id: 'update_worksheet' - uses: jroehl/gsheet.action@v1.0.0 - with: - spreadsheetId: ${{secrets.SPREADSHEET_ID}} - commands: ${{needs.job2.outputs.output_id_number}} - env: - GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} - GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} From 6adea446f923c8465dce07ec23a3de00682ce6bc Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 17 Sep 2021 00:49:42 +0300 Subject: [PATCH 19/55] Update check.yml --- .github/workflows/check.yml | 72 ------------------------------------- 1 file changed, 72 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 5cf0b1a318..a53ba21262 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -43,75 +43,3 @@ jobs: gitid.txt base.txt assignment_number.txt - -# job2: -# runs-on: ubuntu-latest -# needs: job1 -# outputs: -# output_id_number: ${{ steps.step1.outputs.id }} -# steps: -# - id: 'get_worksheet' -# uses: jroehl/gsheet.action@v1.0.0 -# with: -# spreadsheetId: ${{secrets.SPREADSHEET_ID}} -# commands: | # list of commands, specified as a valid JSON string -# [ -# { "command": "getData", "args": { "worksheetTitle": "Sheet1", "minCol": 1, "maxCol": 1 } } -# ] -# env: -# GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} -# GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} -# - id: step1 -# name: dump results -# env: -# # the output of the action can be found in ${{ steps.update_worksheet.outputs.results }} -# RESULTS: ${{ steps.get_worksheet.outputs.results }} -# run: | -# cmd=$(echo "${RESULTS}" | jq ".results[0].result.rawData") -# echo ${{ needs.job1.steps.extract_branch.outputs.branch }} - -# branch=${{ github.base_ref }} -# assignment=${branch:1:2} -# echo "assignment $assignment" - -# branch=\"${{needs.job1.outputs.output_branch}}\" -# echo $branch -# echo ${branch:0:3} -# gitid=\"${{needs.job1.outputs.output_id}}\" -# result=\"${{needs.job1.outputs.output_result}}\" -# j=0 -# for i in {1..60} -# do -# t=$(echo "${cmd}" | jq ".[$i][0]") -# echo "$t" -# echo "$gitid" -# if [ "$t" = "$gitid" ]; then -# echo "FOUND" -# echo "$i" -# j="[{ \"command\": \"updateData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$result", "$result"]], \"minCol\": $((assignment*2)), \"minRow\": $((i+1)) }} ]" -# echo "$j" -# echo "::set-output name=id::$j" -# else -# echo "Strings are not equal." -# fi -# done -# if [[ $j -eq 0 ]] -# then -# j="[{ \"command\": \"appendData\", \"args\": {\"worksheetTitle\": \"Sheet1\", \"data\": [["$gitid", "$result", "$result"]], \"minCol\": 1 }} ]" -# echo "::set-output name=id::$j" -# fi -# echo $j -# echo "$gitid" -# # echo "::set-output name=id::$i" -# job3: -# runs-on: ubuntu-latest -# needs: job2 -# steps: -# - id: 'update_worksheet' -# uses: jroehl/gsheet.action@v1.0.0 -# with: -# spreadsheetId: ${{secrets.SPREADSHEET_ID}} -# commands: ${{needs.job2.outputs.output_id_number}} -# env: -# GSHEET_CLIENT_EMAIL: ${{ secrets.SERVICE_EMAIL }} -# GSHEET_PRIVATE_KEY: ${{ secrets.SERVICE_KEY }} From 2bf9fc47fa69cb353b79bfacbb5bdfe6c634ab1b Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 17 Sep 2021 00:56:06 +0300 Subject: [PATCH 20/55] Update check.yml fix wget --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index a53ba21262..c847f49921 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -25,7 +25,7 @@ jobs: echo "base and head branch names differs: stop" exit 1 fi - wget -q --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt + wget -c --retry-connrefused --tries=0 -q --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet -c --retry-connrefused --tries=0 --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt rm -rf /tmp/cookies.txt docker load < cw-20201.tar.gz docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 From eb1aac9a66781253ce191037b69a307e71cb5c43 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Mon, 11 Oct 2021 16:19:20 +0300 Subject: [PATCH 21/55] add synchronize --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index c847f49921..ac44547906 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -3,7 +3,7 @@ name: Regression on: # [push] pull_request: # pull_request_target: - types: [opened, reopened, edited] + types: [synchronize, opened, reopened, edited] jobs: job1: From 942d490c90864c304de571b19d6bdd893f530868 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 11 Feb 2022 08:26:27 +0300 Subject: [PATCH 22/55] Update check.yml --- .github/workflows/check.yml | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index ac44547906..88509fb3ce 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -22,7 +22,7 @@ jobs: login=${{ github.event.pull_request.user.login }} echo "$login" if [ "${{ github.base_ref }}" != "${{ github.head_ref }}" ]; then - echo "base and head branch names differs: stop" + echo "FIASCO: base and head branches differs" exit 1 fi wget -c --retry-connrefused --tries=0 -q --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet -c --retry-connrefused --tries=0 --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt @@ -30,12 +30,25 @@ jobs: docker load < cw-20201.tar.gz docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 docker exec -t cw-2021 sh test.sh + echo "All checks have successfully passed" echo "$login" > gitid.txt echo ${{ github.base_ref }} > base.txt branch=${{ github.base_ref }} - echo ${branch:1:2} > assignment_number.txt - + if [[ ${branch:1:1} -eq 0 ]] + then + echo ${branch:2:1} > assignment_number.txt + else + echo ${branch:1:2} > assignment_number.txt + fi + - name: Check Deadline + run: | + deadline=2022-03-07T23:59 + if [[ $(date +'%Y-%m-%d') > $deadline ]]; + then + echo "FIASCO: The deadline has expired" + exit 1 + fi - uses: actions/upload-artifact@v2 with: name: share_info From be2f29725b64d5f6277ab4bf22d5415989b67c33 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 27 Sep 2022 13:32:21 +0200 Subject: [PATCH 23/55] Update check.yml Remove deadline check --- .github/workflows/check.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 88509fb3ce..d233f58719 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -41,14 +41,14 @@ jobs: else echo ${branch:1:2} > assignment_number.txt fi - - name: Check Deadline - run: | - deadline=2022-03-07T23:59 - if [[ $(date +'%Y-%m-%d') > $deadline ]]; - then - echo "FIASCO: The deadline has expired" - exit 1 - fi +# - name: Check Deadline +# run: | +# deadline=2022-03-07T23:59 +# if [[ $(date +'%Y-%m-%d') > $deadline ]]; +# then +# echo "FIASCO: The deadline has expired" +# exit 1 +# fi - uses: actions/upload-artifact@v2 with: name: share_info From 05d2bd5d0f4600541b16aaf6e19decf888b5afd8 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 31 Jan 2023 17:45:08 +0200 Subject: [PATCH 24/55] update readme --- README.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c4d644d49a..8e38b12818 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,24 @@ -# compilers-2021-spring +# compilers-supplementary A supplementary repository for the course on compilers. + +**Repo structure**: +* [`regression`](regression/) --- tests +* [`lectures`](lectures/) contains lecture notes +* [`src`](src/) contains sources of your compiler +* ['Embedding.meta'](regression/Embedding.meta) contains embedding of the language (since we have no parser yet) + +**How to submit the task**: +* fork the repo +* implement the task +* open pull-request to this repo to the branch with the corresponding task +* NB: your pr has to contain changes to files [`Expr.lama`](src/Expr.lama) and [`State.lama`](src/State.lama) only + +**Task**: + +* Implement function `evalExpr` from [`src/Expr.lama`](src/Expr.lama) +* Implement function `eval` from [`src/State.lama`](src/State.lama) + +**Compile and run tests (from the root folder)**: +```bash +$ make +``` \ No newline at end of file From 18581f3c6123a29b437e55047ed73e38934232b7 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 31 Jan 2023 17:45:27 +0200 Subject: [PATCH 25/55] comment check of SM --- regression/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regression/Makefile b/regression/Makefile index 7494eefd01..57ba7a5a6b 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -14,7 +14,7 @@ $(TESTS): %: %.lama $(LAMAC) -I ../src -o $@ tmp.lama $(RM) tmp.lama cat $@.input | ./$@ -i > $@.log && diff $@.log orig/$@.log - cat $@.input | ./$@ -s > $@.log && diff $@.log orig/$@.log +# cat $@.input | ./$@ -s > $@.log && diff $@.log orig/$@.log clean: $(RM) *.s *.i *~ $(LOGS) $(TESTS) From e51964ad72f28b6193d46115b9fdbf69621088d2 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 31 Jan 2023 17:45:44 +0200 Subject: [PATCH 26/55] update deadline --- .github/workflows/check.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index d233f58719..acf35f49f1 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -41,14 +41,14 @@ jobs: else echo ${branch:1:2} > assignment_number.txt fi -# - name: Check Deadline -# run: | -# deadline=2022-03-07T23:59 -# if [[ $(date +'%Y-%m-%d') > $deadline ]]; -# then -# echo "FIASCO: The deadline has expired" -# exit 1 -# fi + - name: Check Deadline + run: | + deadline=2023-02-02T14:00 + if [[ $(date +'%Y-%m-%d') > $deadline ]]; + then + echo "FIASCO: The deadline has expired" + exit 1 + fi - uses: actions/upload-artifact@v2 with: name: share_info From d22259285aadd01aa01d2952605039546c1030d4 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 31 Jan 2023 17:46:05 +0200 Subject: [PATCH 27/55] add .gitattributes --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..b634d85f01 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.pdf filter=lfs diff=lfs merge=lfs -text From 3b4a7bf455aae9b20388ca1a0662f297cd12964f Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 31 Jan 2023 17:48:09 +0200 Subject: [PATCH 28/55] update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 8e38b12818..5ddf247981 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,9 @@ A supplementary repository for the course on compilers. * implement the task * open pull-request to this repo to the branch with the corresponding task * NB: your pr has to contain changes to files [`Expr.lama`](src/Expr.lama) and [`State.lama`](src/State.lama) only +* NB: be sure that all checks have passed + +**Standard deadline**: next lecture **Task**: From b04f0110ff9b1f68da65c45a12bacfff528fd84a Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 31 Jan 2023 17:48:26 +0200 Subject: [PATCH 29/55] add pdfs --- lectures/01.pdf | Bin 0 -> 130 bytes lectures/02.pdf | Bin 0 -> 130 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 lectures/01.pdf create mode 100644 lectures/02.pdf diff --git a/lectures/01.pdf b/lectures/01.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b90ebee7d77e9869b6f1bac37530c75d9fd03be6 GIT binary patch literal 130 zcmWN?K@x)?3;@78uiyg}6M=}o37Ax7+UhjcLto$SWiNSK-(P+^&%>4w?)|(y)Q11t zrw(m@20NsM3*6pUZyRIEOUX6jJeJClm=p-2rlj0*6hWxdIwMOh1yE)s;;1;bhBR?% NKcaTw+O?(F2wY;HXp|@$PK06e>lxro8g?AQF<#c}FG( MUP=G44%tIcf9K&RkN^Mx literal 0 HcmV?d00001 From c1dade3d60a46d77fdacd0a2ba330de323e9d6d7 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 31 Jan 2023 17:50:15 +0200 Subject: [PATCH 30/55] upd lfs --- .gitattributes | 1 - lectures/01.pdf | Bin 130 -> 0 bytes lectures/02.pdf | Bin 130 -> 0 bytes 3 files changed, 1 deletion(-) delete mode 100644 .gitattributes delete mode 100644 lectures/01.pdf delete mode 100644 lectures/02.pdf diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index b634d85f01..0000000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.pdf filter=lfs diff=lfs merge=lfs -text diff --git a/lectures/01.pdf b/lectures/01.pdf deleted file mode 100644 index b90ebee7d77e9869b6f1bac37530c75d9fd03be6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 zcmWN?K@x)?3;@78uiyg}6M=}o37Ax7+UhjcLto$SWiNSK-(P+^&%>4w?)|(y)Q11t zrw(m@20NsM3*6pUZyRIEOUX6jJeJClm=p-2rlj0*6hWxdIwMOh1yE)s;;1;bhBR?% NKcaTw+O?(F2wY;HXp|@$PK06e>lxro8g?AQF<#c}FG( MUP=G44%tIcf9K&RkN^Mx From aa46d166544e3654410a7f414ab2c644f69f2884 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 31 Jan 2023 17:51:00 +0200 Subject: [PATCH 31/55] add pdfs --- lectures/01.pdf | Bin 0 -> 42191 bytes lectures/02.pdf | Bin 0 -> 47387 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 lectures/01.pdf create mode 100644 lectures/02.pdf diff --git a/lectures/01.pdf b/lectures/01.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a125e00235278813eb553ec4b1b74602eb61888f GIT binary patch literal 42191 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 literal 0 HcmV?d00001 diff --git a/lectures/02.pdf b/lectures/02.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e4aaa1072a4b637e0349cbc10e039a3bc2e25a27 GIT binary patch literal 47387 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 Date: Thu, 2 Feb 2023 23:27:26 +0200 Subject: [PATCH 32/55] fix check.yml --- .github/workflows/check.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index acf35f49f1..e3784c2fb0 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -41,14 +41,14 @@ jobs: else echo ${branch:1:2} > assignment_number.txt fi - - name: Check Deadline - run: | - deadline=2023-02-02T14:00 - if [[ $(date +'%Y-%m-%d') > $deadline ]]; - then - echo "FIASCO: The deadline has expired" - exit 1 - fi + - name: Check Deadline + run: | + deadline=2023-02-02T14:00 + if [[ $(date +'%Y-%m-%d') > $deadline ]]; + then + echo "FIASCO: The deadline has expired" + exit 1 + fi - uses: actions/upload-artifact@v2 with: name: share_info From 2ea5e3f2da9a5b23e8cf2d4c3ade64062f02cada Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 2 Feb 2023 23:27:28 +0200 Subject: [PATCH 33/55] fix check.yml --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index e3784c2fb0..5c3bbe7a3f 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -43,7 +43,7 @@ jobs: fi - name: Check Deadline run: | - deadline=2023-02-02T14:00 + deadline=2023-02-07T12:00 if [[ $(date +'%Y-%m-%d') > $deadline ]]; then echo "FIASCO: The deadline has expired" From 48120c44d83de52d468874c5a0893dd443d5704f Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 2 Feb 2023 23:27:59 +0200 Subject: [PATCH 34/55] restore -s mode check --- regression/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regression/Makefile b/regression/Makefile index 57ba7a5a6b..7494eefd01 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -14,7 +14,7 @@ $(TESTS): %: %.lama $(LAMAC) -I ../src -o $@ tmp.lama $(RM) tmp.lama cat $@.input | ./$@ -i > $@.log && diff $@.log orig/$@.log -# cat $@.input | ./$@ -s > $@.log && diff $@.log orig/$@.log + cat $@.input | ./$@ -s > $@.log && diff $@.log orig/$@.log clean: $(RM) *.s *.i *~ $(LOGS) $(TESTS) From b3d9f79543397fca7555a9514fc2ed8c93c8274e Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Thu, 2 Feb 2023 23:29:30 +0200 Subject: [PATCH 35/55] add gitignore --- .gitignore | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..0aae83b17e --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +* +!/**/ +!*.* +*.aux +*.log +!/regression/orig/*.log +*.out +*.o +*.a +*.sm +*.i +*.s +!Makefile +~/runrime/gc_runtime.s \ No newline at end of file From f8d22188d12813adbaf83e0e37cb96151dd22ae8 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Tue, 21 Feb 2023 16:26:41 +0300 Subject: [PATCH 36/55] Switched off SM regression; set up the deadline to 07.03.2023 --- .github/workflows/check.yml | 2 +- regression/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index d233f58719..362065b461 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -43,7 +43,7 @@ jobs: fi # - name: Check Deadline # run: | -# deadline=2022-03-07T23:59 +# deadline=2023-03-07T23:59 # if [[ $(date +'%Y-%m-%d') > $deadline ]]; # then # echo "FIASCO: The deadline has expired" diff --git a/regression/Makefile b/regression/Makefile index 7494eefd01..57ba7a5a6b 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -14,7 +14,7 @@ $(TESTS): %: %.lama $(LAMAC) -I ../src -o $@ tmp.lama $(RM) tmp.lama cat $@.input | ./$@ -i > $@.log && diff $@.log orig/$@.log - cat $@.input | ./$@ -s > $@.log && diff $@.log orig/$@.log +# cat $@.input | ./$@ -s > $@.log && diff $@.log orig/$@.log clean: $(RM) *.s *.i *~ $(LOGS) $(TESTS) From ccdf22aa8c94557a25eaba67d5b34c2a129947d8 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 28 Feb 2023 09:45:20 +0100 Subject: [PATCH 37/55] disable deadline check --- .github/workflows/check.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index b390972a65..a02f0c2cec 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -41,14 +41,14 @@ jobs: else echo ${branch:1:2} > assignment_number.txt fi - - name: Check Deadline - run: | - deadline=2023-03-07T23:59 - if [[ $(date +'%Y-%m-%d') > $deadline ]]; - then - echo "FIASCO: The deadline has expired" - exit 1 - fi + # - name: Check Deadline + # run: | + # deadline=2023-03-07T23:59 + # if [[ $(date +'%Y-%m-%d') > $deadline ]]; + # then + # echo "FIASCO: The deadline has expired" + # exit 1 + # fi - uses: actions/upload-artifact@v2 with: name: share_info From 3895208ff5e707d1494724d9ee58efd9904dbd9b Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 28 Feb 2023 09:45:45 +0100 Subject: [PATCH 38/55] uncomment SM regression tests --- regression/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regression/Makefile b/regression/Makefile index 57ba7a5a6b..7494eefd01 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -14,7 +14,7 @@ $(TESTS): %: %.lama $(LAMAC) -I ../src -o $@ tmp.lama $(RM) tmp.lama cat $@.input | ./$@ -i > $@.log && diff $@.log orig/$@.log -# cat $@.input | ./$@ -s > $@.log && diff $@.log orig/$@.log + cat $@.input | ./$@ -s > $@.log && diff $@.log orig/$@.log clean: $(RM) *.s *.i *~ $(LOGS) $(TESTS) From 42861f645f41f7e2e1fdbad653dbefd87dbabefa Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Wed, 1 Mar 2023 12:20:09 +0300 Subject: [PATCH 39/55] Assignment --- .github/workflows/check.yml | 2 +- regression/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index b390972a65..01155d15ec 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -43,7 +43,7 @@ jobs: fi - name: Check Deadline run: | - deadline=2023-03-07T23:59 + deadline=2023-03-14T23:59 if [[ $(date +'%Y-%m-%d') > $deadline ]]; then echo "FIASCO: The deadline has expired" diff --git a/regression/Makefile b/regression/Makefile index 57ba7a5a6b..7494eefd01 100644 --- a/regression/Makefile +++ b/regression/Makefile @@ -14,7 +14,7 @@ $(TESTS): %: %.lama $(LAMAC) -I ../src -o $@ tmp.lama $(RM) tmp.lama cat $@.input | ./$@ -i > $@.log && diff $@.log orig/$@.log -# cat $@.input | ./$@ -s > $@.log && diff $@.log orig/$@.log + cat $@.input | ./$@ -s > $@.log && diff $@.log orig/$@.log clean: $(RM) *.s *.i *~ $(LOGS) $(TESTS) From 035b8459987161136a559fabf413d12f42e81d53 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Sat, 4 Mar 2023 22:02:00 +0300 Subject: [PATCH 40/55] Fixed README --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5ddf247981..b9b4532da7 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ A supplementary repository for the course on compilers. * fork the repo * implement the task * open pull-request to this repo to the branch with the corresponding task -* NB: your pr has to contain changes to files [`Expr.lama`](src/Expr.lama) and [`State.lama`](src/State.lama) only +* NB: your pr has to contain changes to files [`Expr.lama`](src/Expr.lama), [`Stmt.lama`](src/Stmt.lama), and [`SM.lama`](src/SM.lama) only * NB: be sure that all checks have passed **Standard deadline**: next lecture @@ -19,7 +19,10 @@ A supplementary repository for the course on compilers. **Task**: * Implement function `evalExpr` from [`src/Expr.lama`](src/Expr.lama) -* Implement function `eval` from [`src/State.lama`](src/State.lama) +* Implement function `eval` from [`src/Stmt.lama`](src/Stmt.lama) +* Implement function `eval` from [`src/SM.lama`](src/SM.lama) +* Implement function `compileExpr` from [`src/SM.lama`](src/SM.lama) +* Implement function `compileStmt` from [`src/SM.lama`](src/SM.lama) **Compile and run tests (from the root folder)**: ```bash From 45880f012ba9530cca6f39abeb5a76e03a1fd010 Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Thu, 6 Apr 2023 15:08:39 +0200 Subject: [PATCH 41/55] move all lectures to main --- README.md | 3 + lectures/01.pdf | Bin 42191 -> 0 bytes lectures/01.tex | 261 ------------------------------------------ lectures/02.pdf | Bin 47387 -> 0 bytes lectures/02.tex | 298 ------------------------------------------------ 5 files changed, 3 insertions(+), 559 deletions(-) delete mode 100644 lectures/01.pdf delete mode 100644 lectures/01.tex delete mode 100644 lectures/02.pdf delete mode 100644 lectures/02.tex diff --git a/README.md b/README.md index b9b4532da7..fa783a91dd 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,9 @@ A supplementary repository for the course on compilers. * [`src`](src/) contains sources of your compiler * ['Embedding.meta'](regression/Embedding.meta) contains embedding of the language (since we have no parser yet) +Corresponding lecture notes: [Expressions Semantics](https://github.com/danyaberezun/compilers-supplementary/tree/main/lectures/01.pdf), +[Statements and AST2SM Semantics](https://github.com/danyaberezun/compilers-supplementary/tree/main/lectures/02.pdf) + **How to submit the task**: * fork the repo * implement the task diff --git a/lectures/01.pdf b/lectures/01.pdf deleted file mode 100644 index a125e00235278813eb553ec4b1b74602eb61888f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42191 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 diff --git a/lectures/01.tex b/lectures/01.tex deleted file mode 100644 index 4329005f32..0000000000 --- a/lectures/01.tex +++ /dev/null @@ -1,261 +0,0 @@ -\documentclass{article} - -\usepackage{amssymb, amsmath} -\usepackage{alltt} -\usepackage{pslatex} -\usepackage{epigraph} -\usepackage{verbatim} -\usepackage{latexsym} -\usepackage{array} -\usepackage{comment} -\usepackage{makeidx} -\usepackage{listings} -\usepackage{indentfirst} -\usepackage{verbatim} -\usepackage{color} -\usepackage{url} -\usepackage{xspace} -\usepackage{hyperref} -\usepackage{stmaryrd} -\usepackage{amsmath, amsthm, amssymb} -\usepackage{graphicx} -\usepackage{euscript} -\usepackage{mathtools} -\usepackage{mathrsfs} -\usepackage{multirow,bigdelim} -\usepackage{subcaption} -\usepackage{placeins} - -\makeatletter - -\makeatother - -\definecolor{shadecolor}{gray}{1.00} -\definecolor{darkgray}{gray}{0.30} - -\def\transarrow{\xrightarrow} -\newcommand{\setarrow}[1]{\def\transarrow{#1}} - -\def\padding{\phantom{X}} -\newcommand{\setpadding}[1]{\def\padding{#1}} - -\def\subarrow{} -\newcommand{\setsubarrow}[1]{\def\subarrow{#1}} - -\newcommand{\trule}[2]{\frac{#1}{#2}} -\newcommand{\crule}[3]{\frac{#1}{#2},\;{#3}} -\newcommand{\withenv}[2]{{#1}\vdash{#2}} -\newcommand{\trans}[3]{{#1}\transarrow{\padding{\textstyle #2}\padding}\subarrow{#3}} -\newcommand{\ctrans}[4]{{#1}\transarrow{\padding#2\padding}\subarrow{#3},\;{#4}} -\newcommand{\llang}[1]{\mbox{\lstinline[mathescape]|#1|}} -\newcommand{\pair}[2]{\inbr{{#1}\mid{#2}}} -\newcommand{\inbr}[1]{\left<{#1}\right>} -\newcommand{\highlight}[1]{\color{red}{#1}} -\newcommand{\ruleno}[1]{\eqno[\scriptsize\textsc{#1}]} -\newcommand{\rulename}[1]{\textsc{#1}} -\newcommand{\inmath}[1]{\mbox{$#1$}} -\newcommand{\lfp}[1]{fix_{#1}} -\newcommand{\gfp}[1]{Fix_{#1}} -\newcommand{\vsep}{\vspace{-2mm}} -\newcommand{\supp}[1]{\scriptsize{#1}} -\newcommand{\sembr}[1]{\llbracket{#1}\rrbracket} -\newcommand{\cd}[1]{\texttt{#1}} -\newcommand{\free}[1]{\boxed{#1}} -\newcommand{\binds}{\;\mapsto\;} -\newcommand{\dbi}[1]{\mbox{\bf{#1}}} -\newcommand{\sv}[1]{\mbox{\textbf{#1}}} -\newcommand{\bnd}[2]{{#1}\mkern-9mu\binds\mkern-9mu{#2}} -\newtheorem{lemma}{Lemma} -\newtheorem{theorem}{Theorem} -\newcommand{\meta}[1]{{\mathcal{#1}}} -\renewcommand{\emptyset}{\varnothing} -\newcommand{\dom}[1]{\mathtt{dom}\;{#1}} -\newcommand{\primi}[2]{\mathbf{#1}\;{#2}} - -\definecolor{light-gray}{gray}{0.90} -\newcommand{\graybox}[1]{\colorbox{light-gray}{#1}} - -\lstdefinelanguage{lama}{ -keywords={skip,if,then,else,elif,fi,while,do,od,repeat,until,for,fun,local,public,return,import,length, -string,case,of,esac,when,boxed,unboxed,string,sexp,array,infix,infixl,infixr,at,before,after,true,false,eta,lazy}, -sensitive=true, -basicstyle=\small, -%commentstyle=\scriptsize\rmfamily, -keywordstyle=\ttfamily\bfseries, -identifierstyle=\ttfamily, -basewidth={0.5em,0.5em}, -columns=fixed, -fontadjust=true, -literate={->}{{$\to$}}3, -morecomment=[s][\ttfamily]{(*}{*)}, -morecomment=[l][\ttfamily]{--} -} - -\lstset{ -mathescape=true, -basicstyle=\small, -identifierstyle=\ttfamily, -keywordstyle=\bfseries, -commentstyle=\scriptsize\rmfamily, -basewidth={0.5em,0.5em}, -fontadjust=true, -escapechar=!, -language=lama -} - -\sloppy - -\newcommand{\lama}{$\lambda\kern -.1667em\lower -.5ex\hbox{$a$}\kern -.1000em\lower .2ex\hbox{$\mathcal M$}\kern -.1000em\lower -.5ex\hbox{$a$}$\xspace} - -\theoremstyle{definition} - -\author{Dmitry Boulytchev} - -\begin{document} - -\section{Language and semantics} - -A language is a collection of programs. A program is an \emph{abstract syntax tree} (AST), which describes the hierarchy of constructs. An abstract -syntax of a programming language describes the format of abstract syntax trees of programs in this language. Thus, a language is a set of -objects, each of which can be constructively manipulated. - -The semantics of a language $\mathscr L$ is a total map - -\[ -\sembr{\bullet}_{\mathscr L} : \mathscr L \to \mathscr D -\] - -where $\mathscr D$ is some \emph{semantic domain}. The choice of the domain is at our command; for example, for Turing-complete languages $\mathscr D$ can -be the set of all partially-recursive (computable) functions. - -\section{Interpreters} - -In reality, the semantics often is described using \emph{interpreters}: - -\[ -eval : \mathscr L \to \mbox{\lstinline|Input|} \to \mbox{\lstinline|Output|} -\] - -where \lstinline|Input| and \lstinline|Output| are sets of (all possible) inputs and outputs for the programs in the language $\mathscr L$. We claim $eval$ to -possess the following property - -\[ -\forall p \in \mathscr L,\, \forall x\in \mbox{\lstinline|Input|} : \sembr{p}_{\mathscr L}\;x = eval\; p\; x -\] - -In other words, an interpreter takes a program and its input as arguments, and returns what the program would return, being run on that -argument. The equality in the definitional property of an interpreter has to be read ``if the right hand side is defined, then the left hand side -is defined, too, and their values coinside'', and vice-versa. - -Why interpreters are so important? Because they can be written as programs in a \emph{meta-lanaguge}, or a \mbox{language of implementation}. For example, -if we take \lama as a language of implementation, then an interpreter of a language $\mathscr L$ is some \lama program $eval$, such that - -\[ -\forall p \in \mathscr L,\, \forall x\in \mbox{\lstinline|Input|} : \sembr{p}_{\mathscr L}\;x = \sembr{eval}_{\mbox{\lama}}\; p\; x -\] - -How to define $\sembr{\bullet}_{\mbox{\lama}}$? We can write an interpreter in some other language. Thus, a \emph{tower} of meta-languages and interpreters -comes into consideration. When to stop? When the meta-language is simple enough for intuitive understanding (in reality: some math-based frameworks like -operational, denotational or game semantics, etc.) - -Pragmatically: if you have a good implementation of a good programming language you trust, you can write interpreters of other languages. - -\section{Compilers} - -A compiler is just a language transformer - -\[ -comp :\mathscr L \to \mathscr M -\] - -for two languages $\mathscr L$ and $\mathscr M$; we expect a compiler to be total and to possess the following property: - -\[ -\forall p\in\mathscr L\;\;\sembr{p}_{\mathscr L}=\sembr{comp\; p}_{\mathscr M} -\] - -Again, the equality in this definition is understood functionally. The property itself is called a \emph{complete} (or full) correctness. In reality -compilers are \emph{partially} correct, which means, that the domain of compiled programs can be wider. - -And, again, we expect compilers to be defined in terms of some implementation language. Thus, a compiler is a program (in, say, \lama), such, that -its semantics in \lama possesses the following property (fill the rest yourself). - - -\section{The first example: the language of expressions} - -Abstract syntax: - -\[ -\begin{array}{rcll} - \mathscr X & = & \{x,\, y,\, z,\, \dots\} & \mbox{(variables)}\\ - \otimes & = & \{+,\, -,\, \times,\, /,\, \%,\, <,\, \le,\, >,\, \ge,\, =,\,\ne,\, \vee,\, \wedge\} & \mbox{(binary operators)}\\ - \mathscr E & = & \mathscr X & \mbox{(expressions)}\\ - & & \mathbb N & \\ - & & \mathscr E \otimes \mathscr E & -\end{array} -\] - -Semantics of expressions: - -\begin{itemize} -\item state $\sigma :\mathscr X \to \mathbb Z$ assigns values to (some) variables; -\item semantics $\sembr{\bullet}_{\mathscr E}$ assigns each to expression a partial map $\Sigma \to \mathbb Z$, where -$\Sigma$ is the set of all states. -\end{itemize} - -Empty state $\Lambda$: undefined for any variable. - -\emph{Big-step operational semantics} is defined via a ternary relation - -\[\Rightarrow_{\mathscr E}\subseteq\Sigma\times{\mathscr E}\times\mathbb Z\] - -An expression "$\sigma\xRightarrow{e}_{\mathscr E}n$" is informally interpreted as "an evaluation of an expression -$e$ in a state $\sigma$ delivers a value $n$". - -\setarrow{\xRightarrow} -\setsubarrow{_{\mathscr E}} -\[\trule{n\in \mathbb N}{\trans{\sigma}{n}{n}}\ruleno{Const}\] -\[\trule{x\in \mathscr X}{\trans{\sigma}{x}{\sigma\;x}}\ruleno{Var}\] -\[\trule{\trans{\sigma}{l}{x},\;\trans{\sigma}{r}{y}}{\trans{\sigma}{l\otimes r}{x\oplus y}}\ruleno{Binop}\] - -\begin{center} -\begin{tabular}{c|cl} - $\otimes$ & $\oplus$ in \lama\\ - \hline - $+$ & \lstinline|+| \\ - $-$ & \lstinline|-| \\ - $\times$ & \lstinline|*| \\ - $/$ & \lstinline|/| \\ - $\%$ & \lstinline|%| \\ - $<$ & \lstinline|<| \\ - $>$ & \lstinline|>| \\ - $\le$ & \lstinline|<=| \\ - $\ge$ & \lstinline|>=| \\ - $=$ & \lstinline|=| \\ - $\ne$ & \lstinline|!=| \\ - $\wedge$ & \lstinline|&&| \\ - $\vee$ & \lstinline/!!/ -\end{tabular} -\end{center} - -Important observations: - -\begin{enumerate} - \item "$\Rightarrow_{\mathscr E}$" is defined \emph{compositionally}: the meaning of an expression is defined in terms of meanings - of its proper subexpressions. - \item "$\Rightarrow_{\mathscr E}$" is total, since it takes into account all possible ways to deconstruct any expression. - \item "$\Rightarrow_{\mathscr E}$" is deterministic: there is no way to assign different meanings to the same expression, since - we deconstruct each expression unambiguously. - \item "$\otimes$" is an element of language \emph{syntax}, while "$\oplus$" is its interpretation in the meta-language of - semanic description (simpler: in the language of interpreter implementation). - \item This concrete semantics is \emph{strict}: for a binary operator both its arguments are evaluated unconditionally; thus, - for example, "\lstinline|1$\,\vee\,$x|" is undefined in empty state. -\end{enumerate} - -Having "$\Rightarrow_{\mathscr E}$", the "$\sembr{\bullet}_{\mathscr E}$" can be defined in obvious way: - -\[ -\trule{\trans{\sigma}{e}{n}}{\sembr{e}_{\mathscr E}\sigma=n} -\] - -\end{document} diff --git a/lectures/02.pdf b/lectures/02.pdf deleted file mode 100644 index e4aaa1072a4b637e0349cbc10e039a3bc2e25a27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47387 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 -\newcommand{\highlight}[1]{\color{red}{#1}} -\newcommand{\ruleno}[1]{\eqno[\scriptsize\textsc{#1}]} -\newcommand{\rulename}[1]{\textsc{#1}} -\newcommand{\inmath}[1]{\mbox{$#1$}} -\newcommand{\lfp}[1]{fix_{#1}} -\newcommand{\gfp}[1]{Fix_{#1}} -\newcommand{\vsep}{\vspace{-2mm}} -\newcommand{\supp}[1]{\scriptsize{#1}} -\newcommand{\sembr}[1]{\llbracket{#1}\rrbracket} -\newcommand{\cd}[1]{\texttt{#1}} -\newcommand{\free}[1]{\boxed{#1}} -\newcommand{\binds}{\;\mapsto\;} -\newcommand{\dbi}[1]{\mbox{\bf{#1}}} -\newcommand{\sv}[1]{\mbox{\textbf{#1}}} -\newcommand{\bnd}[2]{{#1}\mkern-9mu\binds\mkern-9mu{#2}} -\newtheorem{lemma}{Lemma} -\newtheorem{theorem}{Theorem} -\newcommand{\meta}[1]{{\mathcal{#1}}} -\renewcommand{\emptyset}{\varnothing} -\newcommand{\dom}[1]{\mathtt{dom}\;{#1}} -\newcommand{\primi}[2]{\mathbf{#1}\;{#2}} - -\definecolor{light-gray}{gray}{0.90} -\newcommand{\graybox}[1]{\colorbox{light-gray}{#1}} - -\lstdefinelanguage{lama}{ -keywords={read, write, skip,if,then,else,elif,fi,while,do,od,repeat,until,for,fun,local,public,return,import,length, -string,case,of,esac,when,boxed,unboxed,string,sexp,array,infix,infixl,infixr,at,before,after,true,false,eta,lazy}, -sensitive=true, -basicstyle=\small, -%commentstyle=\scriptsize\rmfamily, -keywordstyle=\ttfamily\bfseries, -identifierstyle=\ttfamily, -basewidth={0.5em,0.5em}, -columns=fixed, -fontadjust=true, -literate={->}{{$\to$}}3, -morecomment=[s][\ttfamily]{(*}{*)}, -morecomment=[l][\ttfamily]{--} -} - -\lstset{ -mathescape=true, -basicstyle=\small, -identifierstyle=\ttfamily, -keywordstyle=\bfseries, -commentstyle=\scriptsize\rmfamily, -basewidth={0.5em,0.5em}, -fontadjust=true, -escapechar=!, -language=lama -} - -\sloppy - -\newcommand{\lama}{$\lambda\kern -.1667em\lower -.5ex\hbox{$a$}\kern -.1000em\lower .2ex\hbox{$\mathcal M$}\kern -.1000em\lower -.5ex\hbox{$a$}$\xspace} - -\theoremstyle{definition} - -\author{Dmitry Boulytchev} - -\begin{document} - -\renewcommand{\arraystretch}{1.5} - -\section{Statements} - -More interesting language~--- a language of simple statements: - -\[ -\renewcommand{\arraystretch}{1} -\begin{array}{rcl} - \mathscr S & = & \mbox{\lstinline|skip|} \\ - & & \mathscr X \mbox{\lstinline|:=|} \;\mathscr E \\ - & & \mbox{\lstinline|read (|} \mathscr X \mbox{\lstinline|)|} \\ - & & \mbox{\lstinline|write (|} \mathscr E \mbox{\lstinline|)|} \\ - & & \mathscr S \mbox{\lstinline|;|} \mathscr S -\end{array} -\] - -Here $\mathscr E, \mathscr X$ stand for the sets of expressions and variables, as in the previous lecture. -Informally, the language allows to write a striaght-line programs which transform an input stream of integers into -output stream of integers. - -Again, we define the semantics for this language - -\[ -\sembr{\bullet}_{\mathscr S} : \mathscr S \mapsto \mathbb Z^* \to \mathbb Z^* -\] - -with the semantic domain of partial functions from integer streams to integer streams. Again, we will -use \emph{big-step operational semantics}: we define a ternary relation ``$\Rightarrow_{\mathscr S}$'' - -\[ -\Rightarrow_{\mathscr S} \subseteq \mathscr C \times \mathscr S \times \mathscr C -\] - -where $\mathscr C$~--- a set of possible \emph{configurations} during a program execution. -We will write $c_1\xRightarrow{S}_{\mathscr S}c_2$ instead of $(c_1, S, c_2)\in\Rightarrow_{\mathscr S}$ and informally -interpret the former as ``the execution of a statement $S$ in a configuration $c_1$ completes with the configuration -$c_2$''. - -The set of all configuration is defined as - -\[ -\begin{array}{rcl} - \mathscr C &=& \Sigma \times \mathscr W\\ - \mathscr W &=& \mathbb Z^* \times \mathbb Z^* -\end{array} -\] - -where $\mathscr W$~--- a set of \emph{worlds}, each of which escapsulates some input-output stream pair. For -simplicity, we define the following operations for worlds: - -\[ -\begin{array}{rcl} - \primi{read}{\inbr{xi,\,o}} & = & \inbr{x,\,\inbr{i,\,o}}\\ - \primi{write}{x\,\inbr{i,\,o}} & = & \inbr{i,\,ox}\\ - \primi{out}{\inbr{i,\,o}} & = & o -\end{array} -\] - -The relation ``$\Rightarrow_{\mathscr S}$'' is defined by the following deductive system (see Fig.~\ref{bs_stmt}). The first -three rules are \emph{axioms} as they do not have any premises. Note, according to these rules sometimes a program -cannot do a step in a given configuration: a value of an expression can be undefined in a given state in rules -$\rulename{Assign}$ and $\rulename{Write}$, and there can be no input value in rule $\rulename{Read}$. This style of -a semantics description is called big-step operational semantics, since the results of a computation are -immediately observable at the right hand side of ``$\Rightarrow$'' and, thus, the computation is performed in -a single ``big'' step. And, again, this style of a semantic description can be used to easily implement a -reference interpreter. - -With the relation ``$\Rightarrow_{\mathscr S}$'' defined we can abbreviate the ``surface'' semantics for the language of statements: - -\setarrow{\xRightarrow} -\setsubarrow{_{\mathscr S}} -\[ -\trule{\trans{\inbr{\Lambda,\,\inbr{i,\,\epsilon}}}{S}{\inbr{\sigma,\,\omega}}} - {\sembr{S}_{\mathscr S}i=\primi{out}{\omega}} -\] - - -\begin{figure}[t] -\arraycolsep=10pt -\[\trans{c}{\llang{skip}}{c}\ruleno{Skip}\] -\[\trans{\inbr{\sigma,\, \omega}}{\llang{x := $\;\;e$}}{\inbr{\sigma\,[x\gets\sembr{e}_{\mathscr E}\;\sigma],\,\omega}}\ruleno{Assign}\] -\[\trule{\inbr{z,\,\omega^\prime}=\primi{read}{\omega}} - {\trans{\inbr{\sigma,\, \omega}}{\llang{read ($x$)}}{\inbr{\sigma\,[x\gets z],\,\omega^\prime}}}\ruleno{Read}\] -\[\trans{\inbr{\sigma,\, \omega}}{\llang{write ($e$)}}{\inbr{\sigma,\, \primi{write}{(\sembr{e}_{\mathscr E}\;\sigma)\, \omega}}}\ruleno{Write}\] -\[\trule{\begin{array}{cc} - \trans{c_1}{S_1}{c^\prime} & \trans{c^\prime}{S_2}{c_2} - \end{array}} - {\trans{c_1}{S_1\llang{;}S_2}{c_2}}\ruleno{Seq}\] -\caption{Big-step operational semantics for statements} -\label{bs_stmt} -\end{figure} - -\section{Stack Machine} - -Stack machine is a simple abstract computational device, which can be used as a convenient model to constructively describe -the compilation process. - -In short, stack machine operates on the same configurations, as the language of statements, plus a stack of integers. The -computation, performed by the stack machine, is controlled by a program, which is described as follows: - -\[ -\renewcommand{\arraystretch}{1} -\begin{array}{rcl} - \mathscr I & = & \llang{BINOP $\;\otimes$} \\ - & & \llang{CONST $\;\mathbb N$} \\ - & & \llang{READ} \\ - & & \llang{WRITE} \\ - & & \llang{LD $\;\mathscr X$} \\ - & & \llang{ST $\;\mathscr X$} \\ - \mathscr P & = & \epsilon \\ - & & \mathscr I\mathscr P -\end{array} -\] - -Here the syntax category $\mathscr I$ stands for \emph{instructions}, $\mathscr P$~--- for \emph{programs}; thus, a program is a finite -string of instructions. - -The semantics of stack machine program can be described, again, in the form of big-step operational semantics. This time the set of -stack machine configurations is - -\[ -\mathscr C_{SM} = \mathbb Z^* \times \mathscr C -\] - -where the first component is a stack, and the second~--- a configuration as in the semantics of statement language. The rules are shown on Fig.~\ref{bs_sm}; note, -now we have one axiom and six inference rules (one per instruction). - -\setsubarrow{_{\mathscr{SM}}} - -As for the statement, with the aid of the relation ``$\Rightarrow_{\mathscr{SM}}$'' we can define the surface semantics of stack machine: - -\[ -\trule{\trans{\inbr{\epsilon,\,\inbr{\Lambda,\,\inbr{i,\,\epsilon}}}}{p}{\inbr{s, \inbr{\sigma,\,\omega}}}} - {\sembr{p}_{\mathscr{SM}}\;i=\primi{out}{\omega}} -\] - -\begin{figure}[t] - \[\trans{c}{\epsilon}{c}\ruleno{Stop$_{SM}$}\] - \[\trule{\trans{\inbr{(x\oplus y)s, c}}{p}{c^\prime}}{\trans{\inbr{yxs, c}}{[\llang{BINOP $\;\otimes$}]p}{c^\prime}}\ruleno{Binop$_{SM}$}\] - \[\trule{\trans{\inbr{zs, c}}{p}{c^\prime}}{\trans{\inbr{s, c}}{[\llang{CONST $\;z$}]p}{c^\prime}}\ruleno{Const$_{SM}$}\] - \[\trule{\inbr{z,\,\omega^\prime}=\primi{read}{\omega},\,\trans{\inbr{zs, \inbr{\sigma,\,\omega^\prime}}}{p}{c^\prime}}{\trans{\inbr{s, \inbr{\sigma,\,\omega}}}{\llang{READ}\,p}{c^\prime}}\ruleno{Read$_{SM}$}\] - \[\trule{\trans{\inbr{s,\,\inbr{\sigma,\,\primi{write}{z\,\omega}}}}{p}{c^\prime}}{\trans{\inbr{zs,\, \inbr{\sigma,\,\omega}}}{\llang{WRITE}\,p}{c^\prime}}\ruleno{Write$_{SM}$}\] - \[\trule{\trans{\inbr{(\sigma\;x)s,\, \inbr{\sigma,\,\omega}}}{p}{c^\prime}}{\trans{\inbr{s,\, \inbr{\sigma,\,\omega}}}{[\llang{LD $\;x$}]p}{c^\prime}}\ruleno{LD$_{SM}$}\] - \[\trule{\trans{\inbr{s,\, \inbr{\sigma[x\gets z],\,\omega}}}{p}{c^\prime}}{\trans{\inbr{zs,\, \inbr{\sigma,\,\omega}}}{[\llang{ST $\;x$}]p}{c^\prime}}\ruleno{ST$_{SM}$}\] - \caption{Big-step operational semantics for stack machine} - \label{bs_sm} -\end{figure} - -\section{A Compiler for the Stack Machine} - -A compiler of the statement language into the stack machine is a total mapping - -\[ -\sembr{\bullet}_{comp} : \mathscr S \mapsto \mathscr P -\] - -We can describe the compiler in the form of denotational semantics for the source language. In fact, we can treat the compiler as a \emph{static} semantics, which -maps each program into its stack machine equivalent. - -As the source language consists of two syntactic categories (expressions and statments), the compiler has to be ``bootstrapped'' from the compiler for expressions -$\sembr{\bullet}_{\mathscr E}^{comp}$: - -\[ -\begin{array}{rcl} - \sembr{x}_{\mathscr E}^{comp}&=&\llang{[LD $\;x$]}\\ - \sembr{n}_{\mathscr E}^{comp}&=&\llang{[CONST $\;n$]}\\ - \sembr{A\otimes B}_{\mathscr E}^{comp}&=&\sembr{A}_{\mathscr E}^{comp}\sembr{B}_{\mathscr E}^{comp}[\llang{BINOP $\;\otimes$}] -\end{array} -\] - -And now the main dish: - -\[ -\begin{array}{rcl} - \sembr{\llang{$x$ := $e$}}^{comp}&=&\sembr{e}_{\mathscr E}^{comp}\llang{[ST $\;x$]}\\ - \sembr{\llang{read ($x$)}}^{comp}&=&\llang{[READ][ST $\;x$]}\\ - \sembr{\llang{write ($e$)}}^{comp}&=&\sembr{e}_{\mathscr E}^{comp}\llang{[WRITE]}\\ - \sembr{\llang{$S_1$;$\;S_2$}}^{comp}&=&\sembr{S_1}^{comp}\sembr{S_2}^{comp} -\end{array} -\] - -\end{document} From 97f367dd50a2e17a5674f3f7dab6ec5fc788075e Mon Sep 17 00:00:00 2001 From: Danya Berezun Date: Thu, 6 Apr 2023 15:10:33 +0200 Subject: [PATCH 42/55] move all lectures to main --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index fa783a91dd..83a4ff9708 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ A supplementary repository for the course on compilers. **Repo structure**: * [`regression`](regression/) --- tests -* [`lectures`](lectures/) contains lecture notes * [`src`](src/) contains sources of your compiler * ['Embedding.meta'](regression/Embedding.meta) contains embedding of the language (since we have no parser yet) From f7d02e9ffd5583d1ddb742f0d57b835c88e87195 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Mon, 9 Oct 2023 16:00:45 +0300 Subject: [PATCH 43/55] Set the deadline --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 01155d15ec..2d3963ef96 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -43,7 +43,7 @@ jobs: fi - name: Check Deadline run: | - deadline=2023-03-14T23:59 + deadline=2023-10-12T23:59 if [[ $(date +'%Y-%m-%d') > $deadline ]]; then echo "FIASCO: The deadline has expired" From 70558deecfa3393db0ed660a8aaab15d7295f7b6 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 9 Feb 2024 18:16:28 +0300 Subject: [PATCH 44/55] Update check.yml update docker image wget --- .github/workflows/check.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 2d3963ef96..75362db518 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -25,8 +25,7 @@ jobs: echo "FIASCO: base and head branches differs" exit 1 fi - wget -c --retry-connrefused --tries=0 -q --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet -c --retry-connrefused --tries=0 --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt - rm -rf /tmp/cookies.txt + wget --quiet -c --retry-connrefused --tries=0 https://drive.usercontent.google.com/download\?id\=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ\&export\=download\&authuser\=0\&confirm\=t\&uuid\=34a6d91a-d052-4775-b466-1f8234711b74\&at\=APZUnTXSqc-ZLIRoSD-uYPeQYGfk%3A1707491383232 -O cw-20201.tag.gz docker load < cw-20201.tar.gz docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 docker exec -t cw-2021 sh test.sh From f417f3b942b6e0a85ec993e3fe008352b3325405 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 9 Feb 2024 18:18:55 +0300 Subject: [PATCH 45/55] Update check.yml Update deadline --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 75362db518..52c0849747 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -42,7 +42,7 @@ jobs: fi - name: Check Deadline run: | - deadline=2023-10-12T23:59 + deadline=2024-02-12T23:59 if [[ $(date +'%Y-%m-%d') > $deadline ]]; then echo "FIASCO: The deadline has expired" From 3bf024bebddaa1aeba78d8395dcb6fd1b688da25 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 9 Feb 2024 20:46:30 +0300 Subject: [PATCH 46/55] Update check.yml fix typo: tag->tar --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 52c0849747..e65773e15e 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -25,7 +25,7 @@ jobs: echo "FIASCO: base and head branches differs" exit 1 fi - wget --quiet -c --retry-connrefused --tries=0 https://drive.usercontent.google.com/download\?id\=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ\&export\=download\&authuser\=0\&confirm\=t\&uuid\=34a6d91a-d052-4775-b466-1f8234711b74\&at\=APZUnTXSqc-ZLIRoSD-uYPeQYGfk%3A1707491383232 -O cw-20201.tag.gz + wget --quiet -c --retry-connrefused --tries=0 https://drive.usercontent.google.com/download\?id\=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ\&export\=download\&authuser\=0\&confirm\=t\&uuid\=34a6d91a-d052-4775-b466-1f8234711b74\&at\=APZUnTXSqc-ZLIRoSD-uYPeQYGfk%3A1707491383232 -O cw-20201.tar.gz docker load < cw-20201.tar.gz docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 docker exec -t cw-2021 sh test.sh From cb36dfd1362663ef07d21c1a6c2b73e9d37c127d Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Mon, 26 Feb 2024 10:34:26 +0100 Subject: [PATCH 47/55] update workflow --- .github/workflows/Dockerfile | 12 +++++++ .github/workflows/check.yml | 69 +++++++++++++++++++++++------------- 2 files changed, 56 insertions(+), 25 deletions(-) create mode 100644 .github/workflows/Dockerfile diff --git a/.github/workflows/Dockerfile b/.github/workflows/Dockerfile new file mode 100644 index 0000000000..c0eccce9b7 --- /dev/null +++ b/.github/workflows/Dockerfile @@ -0,0 +1,12 @@ +FROM ocaml/opam:ubuntu-lts-ocaml-4.14 + +USER root +RUN dpkg --add-architecture i386 && \ + apt-get update --fix-missing -y && \ + apt-get install -y software-properties-common gcc-multilib make m4 && \ + rm -rf /var/lib/apt/lists/* + +USER opam +RUN opam init --disable-sandboxing -y && \ + opam pin add -y ostap 0.5 && \ + opam pin add -y Lama https://github.com/JetBrains-Research/Lama.git\#1.20 diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index e65773e15e..564f852cfa 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -1,36 +1,62 @@ name: Regression -on: # [push] +on: pull_request: - # pull_request_target: types: [synchronize, opened, reopened, edited] jobs: job1: runs-on: ubuntu-latest - # Map a step output to a job output steps: - - name: Extract branch name - shell: bash - run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" - id: extract_branch - uses: actions/checkout@v2 with: ref: refs/pull/${{ github.event.pull_request.number }}/head - - id: step1 + - name: Check branches compatibility run: | - login=${{ github.event.pull_request.user.login }} - echo "$login" if [ "${{ github.base_ref }}" != "${{ github.head_ref }}" ]; then echo "FIASCO: base and head branches differs" exit 1 fi - wget --quiet -c --retry-connrefused --tries=0 https://drive.usercontent.google.com/download\?id\=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ\&export\=download\&authuser\=0\&confirm\=t\&uuid\=34a6d91a-d052-4775-b466-1f8234711b74\&at\=APZUnTXSqc-ZLIRoSD-uYPeQYGfk%3A1707491383232 -O cw-20201.tar.gz - docker load < cw-20201.tar.gz - docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 - docker exec -t cw-2021 sh test.sh - echo "All checks have successfully passed" - + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Set up Docker cache + uses: actions/cache@v4 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + - name: Build Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: ./.github/workflows/Dockerfile + tags: berezun/lama-image:latest + load: true + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + - name: Store Docker cache + run: | + rm -rf /tmp/.buildx-cache + mv /tmp/.buildx-cache-new /tmp/.buildx-cache + - name: Run tests + run: | + docker run -d -it --name lama-testing-image berezun/lama-image + docker cp . lama-testing-image:/home/opam/lama + docker exec -u root -t lama-testing-image chown -R opam:opam /home/opam/lama + docker exec -u opam -w /home/opam/lama -t lama-testing-image sh -c 'eval $(opam config env) && make' + echo "Regression: All checks have successfully passed" + - name: Check Deadline + run: | + deadline=2025-03-04T23:59 + if [[ $(date +'%Y-%m-%d') > $deadline ]]; + then + echo "FIASCO: The deadline has expired" + exit 1 + fi + - name: Prepare results + run: | + login=${{ github.event.pull_request.user.login }} echo "$login" > gitid.txt echo ${{ github.base_ref }} > base.txt branch=${{ github.base_ref }} @@ -40,15 +66,8 @@ jobs: else echo ${branch:1:2} > assignment_number.txt fi - - name: Check Deadline - run: | - deadline=2024-02-12T23:59 - if [[ $(date +'%Y-%m-%d') > $deadline ]]; - then - echo "FIASCO: The deadline has expired" - exit 1 - fi - - uses: actions/upload-artifact@v2 + - name: Upload results + uses: actions/upload-artifact@v2 with: name: share_info path: | From a996a1147d229f61d86bcf50327dbdf7be8dccbc Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Mon, 26 Feb 2024 10:34:41 +0100 Subject: [PATCH 48/55] rm outdated file --- .travis.yml | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 6140732e2b..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: c -services: - - docker -before_install: - - wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt - - docker load < cw-20201.tar.gz - - docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 -script: - docker exec -it cw-2021 sh test.sh \ No newline at end of file From 5264dade823217e0467b1ea91b6486996327566c Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 27 Feb 2024 14:09:43 +0200 Subject: [PATCH 49/55] Revert "rm outdated file" This reverts commit a996a1147d229f61d86bcf50327dbdf7be8dccbc. --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..6140732e2b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,9 @@ +language: c +services: + - docker +before_install: + - wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt + - docker load < cw-20201.tar.gz + - docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 +script: + docker exec -it cw-2021 sh test.sh \ No newline at end of file From daa8b80c96a8c843f00573f30a5f9768090a2cec Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 27 Feb 2024 15:17:33 +0200 Subject: [PATCH 50/55] update workflow: add university check; move deadline check to main workdflow --- .github/workflows/check.yml | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 564f852cfa..f4c1c0f9f7 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -11,6 +11,18 @@ jobs: - uses: actions/checkout@v2 with: ref: refs/pull/${{ github.event.pull_request.number }}/head + - name: Check pull request's name + run: | + prName="${{ github.event.pull_request.title }}" + university=`echo $prName | awk '{ sub(/.*\[/, ""); sub(/\].*/, ""); print }'` + universities=("SPBGU" "NUP" "CUB") + if [[ ! $(echo ${universities[@]} | grep -F -w $university) ]]; + then + echo "FIASCO: Wrong university name or format in pull request title: $university " + exit 1 + fi + echo "your university $university " + echo $university > university.txt - name: Check branches compatibility run: | if [ "${{ github.base_ref }}" != "${{ github.head_ref }}" ]; then @@ -46,14 +58,14 @@ jobs: docker exec -u root -t lama-testing-image chown -R opam:opam /home/opam/lama docker exec -u opam -w /home/opam/lama -t lama-testing-image sh -c 'eval $(opam config env) && make' echo "Regression: All checks have successfully passed" - - name: Check Deadline - run: | - deadline=2025-03-04T23:59 - if [[ $(date +'%Y-%m-%d') > $deadline ]]; - then - echo "FIASCO: The deadline has expired" - exit 1 - fi + # - name: Check Deadline + # run: | + # deadline=2025-03-04T23:59 + # if [[ $(date +'%Y-%m-%d') > $deadline ]]; + # then + # echo "FIASCO: The deadline has expired" + # exit 1 + # fi - name: Prepare results run: | login=${{ github.event.pull_request.user.login }} @@ -74,3 +86,4 @@ jobs: gitid.txt base.txt assignment_number.txt + university.txt From d5de43b07553cfee9f0260a48f3d651cc4f47b3f Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Tue, 27 Feb 2024 17:00:37 +0200 Subject: [PATCH 51/55] rm outdated file --- .travis.yml | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 6140732e2b..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: c -services: - - docker -before_install: - - wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=1grnb60AaZBCwhBqETeKOGh3tW7ggEWDJ" -O cw-20201.tar.gz && rm -rf /tmp/cookies.txt - - docker load < cw-20201.tar.gz - - docker run -d -it --name cw-2021 -v $(pwd):/usr/share/compiler-workout berezun/cw-2021 -script: - docker exec -it cw-2021 sh test.sh \ No newline at end of file From 8d2438360975abcfa4e62e540b2e3a1bdccfd067 Mon Sep 17 00:00:00 2001 From: danyaberezun Date: Fri, 13 Sep 2024 11:39:01 +0300 Subject: [PATCH 52/55] Update check.yml --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index f4c1c0f9f7..e764af9bdf 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -79,7 +79,7 @@ jobs: echo ${branch:1:2} > assignment_number.txt fi - name: Upload results - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: share_info path: | From f9ac79203fa17189f215ab35b1d680f092448328 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Mon, 28 Oct 2024 12:11:08 +0300 Subject: [PATCH 53/55] Added universities --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index e764af9bdf..38a3e4eca1 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -15,7 +15,7 @@ jobs: run: | prName="${{ github.event.pull_request.title }}" university=`echo $prName | awk '{ sub(/.*\[/, ""); sub(/\].*/, ""); print }'` - universities=("SPBGU" "NUP" "CUB") + universities=("SPBGU" "NUP" "CUB" "HSE" "ITMO") if [[ ! $(echo ${universities[@]} | grep -F -w $university) ]]; then echo "FIASCO: Wrong university name or format in pull request title: $university " From c96c6bf8d151279575bf8bd022ccebae64e2782b Mon Sep 17 00:00:00 2001 From: dshindov Date: Sat, 2 Nov 2024 19:26:06 +0000 Subject: [PATCH 54/55] done A01 --- src/Expr.lama | 26 +++++++++++++++++---- src/SM.lama | 62 ++++++++++++++++++++++++++++++++++----------------- src/Stmt.lama | 17 ++++++++------ 3 files changed, 74 insertions(+), 31 deletions(-) diff --git a/src/Expr.lama b/src/Expr.lama index b758035636..9b2dac9d7e 100644 --- a/src/Expr.lama +++ b/src/Expr.lama @@ -1,9 +1,7 @@ -- Expression evaluator - import List; import State; - -- The evaluator itself: takes a state and an expression, -- returns integer value -- @@ -12,7 +10,27 @@ import State; -- expr = Var (string) | -- Const (int) | -- Binop (string, expr, expr) - public fun evalExpr (st, expr) { - failure ("evalExpr not implemented\n") + case expr of + Var(name) -> st(name) + | Const(value) -> value + | Binop(op, lhs, rhs) -> getOp(op)(evalExpr(st, lhs), evalExpr(st, rhs)) + esac } +public fun getOp (op) { + case op of + "+" -> fun (x, y) {x + y} + | "-" -> fun (x, y) {x - y} + | "*" -> fun (x, y) {x * y} + | "/" -> fun (x, y) {x / y} + | "%" -> fun (x, y) {x % y} + | "==" -> fun (x, y) {x == y} + | "!=" -> fun (x, y) {x != y} + | "<" -> fun (x, y) {x < y} + | "<=" -> fun (x, y) {x <= y} + | ">" -> fun (x, y) {x > y} + | ">=" -> fun (x, y) {x >= y} + | "&&" -> fun (x, y) {x && y} + | "!!" -> fun (x, y) {x !! y} + esac +} \ No newline at end of file diff --git a/src/SM.lama b/src/SM.lama index 5e9e82bd9e..3aa915ee5b 100644 --- a/src/SM.lama +++ b/src/SM.lama @@ -1,5 +1,4 @@ -- Stack machine. - import List; import World; import State; @@ -10,40 +9,63 @@ import Fun; -- Stack code printer. Takes a list of SM instructions, return its -- string representation. public fun showSMInsn (i) { - case i of - READ -> sprintf ("READ") - | WRITE -> sprintf ("WRITE") - | BINOP (s) -> sprintf ("BINOP %s", s) - | LD (x) -> sprintf ("LD %s", x) - | ST (x) -> sprintf ("ST %s", x) - | CONST (n) -> sprintf ("CONST %d", n) - esac + case i of + READ -> sprintf("READ") + | WRITE -> sprintf("WRITE") + | BINOP(s) -> sprintf("BINOP %s", s) + | LD(x) -> sprintf("LD %s", x) + | ST(x) -> sprintf("ST %s", x) + | CONST(n) -> sprintf("CONST %d", n) + esac } - public fun showSM (prg) { - map (fun (i) {showSMInsn (i) ++ "\n"}, prg).stringcat + map(fun (i) {showSMInsn(i) ++ "\n"}, prg).stringcat } - -- Stack machine interpreter. Takes an SM-configuration and a program, -- returns a final configuration fun eval (c, insns) { - failure ("SM eval not implemented\n") + -- printf("stack:"); + -- iter(fun (x) {printf("%d ", x)}, c[0]); + -- printf("\n"); + -- printf("output:"); + -- iter(fun (x) {printf("%d ", x)}, c[2][1]); + -- printf("\n"); + case [c, insns] of + [c, {}] -> c + | [[stack, state, world], READ: rest] -> ( + var res = readWorld(world); + + eval([res[0] : stack, state, res[1]], rest) + ) + | [[value: stack, state, world], WRITE: rest] -> eval([stack, state, writeWorld(value, world)], rest) + | [[stack, state, world], CONST(value): rest] -> eval([value : stack, state, world], rest) + | [[stack, state, world], LD(name): rest] -> eval([state(name) : stack, state, world], rest) + | [[value: stack, state, world], ST(name): rest] -> eval([stack, state <- [name, value], world], rest) + | [[b: a: stack, state, world], BINOP(op): rest] -> eval([getOp(op)(a, b) : stack, state, world], rest) + esac } - -- Runs a stack machine for a given input and a given program, returns an output public fun evalSM (input, insns) { - eval ([{}, emptyState, createWorld (input)], insns)[2].getOutput + eval([{}, emptyState, createWorld(input)], insns)[2].getOutput } - -- Compiles an expression into a stack machine code. -- Takes an expression, returns a list of stack machine instructions fun compileExpr (expr) { - failure ("compileExpr not implemented\n") + case expr of + Var(name) -> {LD(name)} + | Const(value) -> {CONST(value)} + | Binop(op, lhs, rhs) -> compileExpr(lhs) +++ compileExpr(rhs) +++ {BINOP(op)} + esac } - -- Compiles a statement into a stack machine code. -- Takes a statement, returns a list of stack machine -- instructions. public fun compileSM (stmt) { - failure ("compileSM not implemented\n") -} + case stmt of + Skip -> {} + | Seq(stmt, rest) -> compileSM(stmt) +++ compileSM(rest) + | Assn(name, expr) -> compileExpr(expr) +++ {ST(name)} + | Read(name) -> {READ, ST(name)} + | Write(expr) -> compileExpr(expr) +++ {WRITE} + esac +} \ No newline at end of file diff --git a/src/Stmt.lama b/src/Stmt.lama index 67ec6db9e6..fa614b2d71 100644 --- a/src/Stmt.lama +++ b/src/Stmt.lama @@ -1,5 +1,4 @@ -- Statement evaluator. - import State; import Expr; import World; @@ -15,12 +14,16 @@ import World; -- Skip | -- Read (string) | -- Write (expr) | - -fun eval (c, stmt) { - failure ("Stmt eval not implemented\n") +fun eval (c@[state, world], stmt) { + case stmt of + Skip -> c + | Seq(stmt, rest) -> eval(eval(c, stmt), rest) + | Assn(name, expr) -> [state <- [name, evalExpr(state, expr)], world] + | Read(name) -> (var res = readWorld(world); [state <- [name, res[0]], res[1]]) + | Write(expr) -> [state, writeWorld(evalExpr(state, expr), world)] + esac } - -- Evaluates a program with a given input and returns an output public fun evalStmt (input, stmt) { - eval ([emptyState, createWorld (input)], stmt).snd.getOutput -} + eval([emptyState, createWorld(input)], stmt).snd.getOutput +} \ No newline at end of file From e2fa92e54dad8aaafb5e65da008d368789ebb1bb Mon Sep 17 00:00:00 2001 From: dshindov Date: Sat, 9 Nov 2024 20:50:31 +0000 Subject: [PATCH 55/55] done AO2 --- src/X86.lama | 53 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/src/X86.lama b/src/X86.lama index 5bf082e898..95b9ce8df7 100644 --- a/src/X86.lama +++ b/src/X86.lama @@ -225,21 +225,48 @@ fun suffix (op) { fun compile (env, code) { foldl(fun ([env, scode], i) { var code = scode <+ Meta("# " ++ showSMInsn(i) ++ "\n"); + fun genOp (op, x, y) { + var buf = singletonBuffer(Mov(x, eax)); + + case op of + "+" -> buf <+ Binop("+", y, eax) + | "-" -> buf <+ Binop("-", y, eax) + | "*" -> buf <+ Binop("*", y, eax) + | "&&" -> buf <+ Binop("^", edx, edx) <+ Binop("cmp", L(0), eax) <+ Set("ne", + "%al") <+ Binop("cmp", L(0), y) <+ Set("ne", "%dl") <+ Binop("&&", edx, eax) + | "!!" -> buf <+ Binop("^", edx, edx) <+ Binop("cmp", L(0), eax) <+ Set("ne", + "%al") <+ Binop("cmp", L(0), y) <+ Set("ne", "%dl") <+ Binop("!!", edx, eax) + | "<" -> buf <+ Binop("^", edx, edx) <+ Binop("cmp", y, eax) <+ Set(suffix(op), "%dl") <+ Mov(edx, eax) + | "==" -> buf <+ Binop("^", edx, edx) <+ Binop("cmp", y, eax) <+ Set(suffix(op), "%dl") <+ Mov(edx, eax) + | "<=" -> buf <+ Binop("^", edx, edx) <+ Binop("cmp", y, eax) <+ Set(suffix(op), "%dl") <+ Mov(edx, eax) + | "!=" -> buf <+ Binop("^", edx, edx) <+ Binop("cmp", y, eax) <+ Set(suffix(op), "%dl") <+ Mov(edx, eax) + | ">=" -> buf <+ Binop("^", edx, edx) <+ Binop("cmp", y, eax) <+ Set(suffix(op), "%dl") <+ Mov(edx, eax) + | ">" -> buf <+ Binop("^", edx, edx) <+ Binop("cmp", y, eax) <+ Set(suffix(op), "%dl") <+ Mov(edx, eax) + | "/" -> buf <+ Cltd <+ IDiv(y) + | "%" -> buf <+ Cltd <+ IDiv(y) <+ Mov(edx, eax) + esac + } case i of - READ -> case env.allocate of - [s, env] -> [env, code <+ Call("Lread") <+ Mov(eax, s)] - esac - | WRITE -> case env.pop of - [s, env] -> [env, code <+ Push(s) <+ Call("Lwrite") <+ Pop(eax)] - esac - | LD(x) -> case env.addGlobal(x).allocate of - [s, env] -> [env, code <+> move(env.loc(x), s)] - esac - | ST(x) -> case env.addGlobal(x).pop of - [s, env] -> [env, code <+> move(s, env.loc(x))] - esac - | _ -> failure("codegeneration for instruction %s is not yet implemented\n", i.string) + READ -> case env.allocate of + [s, env] -> [env, code <+ Call("Lread") <+ Mov(eax, s)] + esac + | WRITE -> case env.pop of + [s, env] -> [env, code <+ Push(s) <+ Call("Lwrite") <+ Pop(eax)] + esac + | LD(x) -> case env.addGlobal(x).allocate of + [s, env] -> [env, code <+> move(env.loc(x), s)] + esac + | ST(x) -> case env.addGlobal(x).pop of + [s, env] -> [env, code <+> move(s, env.loc(x))] + esac + | CONST(x) -> case env.allocate of + [s, env] -> [env, code <+> move(L(x), s)] + esac + | BINOP(op) -> case env.pop2 of + [x, y, env] -> [env.push(y), code <+> genOp(op, y, x) <+ Mov(eax, y)] + esac + | _ -> failure("codegeneration for instruction %s is not yet implemented\n", i.string) esac }, [env, emptyBuffer()], code) }