From a5f595b9f8f9f9f538e22403ef47ced915bb1fca Mon Sep 17 00:00:00 2001 From: lascar pacagi Date: Tue, 1 Mar 2022 23:52:51 +0100 Subject: [PATCH 1/6] update README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d31f1ab..f68d36c 100644 --- a/README.md +++ b/README.md @@ -81,3 +81,5 @@ to go back to the version with a garbage collector do the following. git checkout master make ``` + +The branch `ast_typed` has an abstract syntax tree decorated with type information. This tree is produced by the typechecker and it can be useful if you want to augment `MiniJava`. From c5a19f2a5d8e6d91f5a40f6a1e804097b5792c3b Mon Sep 17 00:00:00 2001 From: tracy040401 Date: Tue, 2 Apr 2024 11:56:12 +0200 Subject: [PATCH 2/6] equals works --- LMJ.mli | 3 ++- TMJ.mli | 1 + lexer.mll | 1 + mj2c.ml | 1 + parser.mly | 3 ++- printTMJ.ml | 4 +++- print_ast.ml | 2 ++ print_tokens.ml | 2 ++ test/good/TestEq | Bin 0 -> 45008 bytes test/good/TestEq.c | 23 +++++++++++++++++++++++ test/good/TestEq.java | 6 ++++++ typechecking.ml | 1 + 12 files changed, 44 insertions(+), 3 deletions(-) create mode 100755 test/good/TestEq create mode 100644 test/good/TestEq.c create mode 100644 test/good/TestEq.java diff --git a/LMJ.mli b/LMJ.mli index 4142cf3..d30edef 100644 --- a/LMJ.mli +++ b/LMJ.mli @@ -30,7 +30,8 @@ and binop = | OpAdd (** Binary operator [+]. *) | OpSub (** Binary operator [-]. *) | OpMul (** Binary operator [*]. *) - | OpLt (** Binary operator [<]. *) + | OpLt (** Binary operator [<]. *) + | OpEq (** Binary operator [==]. *) | OpAnd (** Binary operator [&&]. *) and unop = UOpNot (** Unary operator [!]. *) diff --git a/TMJ.mli b/TMJ.mli index 65182e1..7f90b77 100644 --- a/TMJ.mli +++ b/TMJ.mli @@ -26,6 +26,7 @@ and binop = LMJ.binop = | OpSub | OpMul | OpLt + | OpEq | OpAnd and unop = LMJ.unop = UOpNot diff --git a/lexer.mll b/lexer.mll index 3735afa..38b3226 100644 --- a/lexer.mll +++ b/lexer.mll @@ -30,6 +30,7 @@ rule get_token = parse | '*' { TIMES } | "&&" { AND } | "<" { LT } + | "==" { EQ } | '(' { LPAREN } | ')' { RPAREN } | '[' { LBRACKET } diff --git a/mj2c.ml b/mj2c.ml index 3202acb..287dc1c 100644 --- a/mj2c.ml +++ b/mj2c.ml @@ -300,6 +300,7 @@ let binop2c | OpSub -> fprintf out "-" | OpMul -> fprintf out "*" | OpLt -> fprintf out "<" + | OpEq -> fprintf out "==" | OpAnd -> fprintf out "&&" (** [type2c out typ] transpiles the type [typ] to C on the output channel [out]. *) diff --git a/parser.mly b/parser.mly index 468d755..abf0a82 100644 --- a/parser.mly +++ b/parser.mly @@ -8,7 +8,7 @@ %token INTEGER BOOLEAN %token IDENT %token CLASS PUBLIC STATIC VOID MAIN STRING EXTENDS RETURN -%token PLUS MINUS TIMES NOT LT AND +%token PLUS MINUS TIMES NOT LT AND EQ %token COMMA SEMICOLON %token ASSIGN %token LPAREN RPAREN LBRACKET RBRACKET LBRACE RBRACE @@ -146,6 +146,7 @@ raw_expression: | MINUS { OpSub } | TIMES { OpMul } | LT { OpLt } +| EQ { OpEq } | AND { OpAnd } instruction: diff --git a/printTMJ.ml b/printTMJ.ml index 6710309..8c6eebd 100644 --- a/printTMJ.ml +++ b/printTMJ.ml @@ -23,6 +23,8 @@ let binop out = function fprintf out "*" | OpLt -> fprintf out "<" + | OpEq -> + fprintf out "==" | OpAnd -> fprintf out "&&" @@ -103,7 +105,7 @@ and expr5 out e = match e.raw_expression with expr4 out e and expr6 out e = match e.raw_expression with - | EBinOp ((OpLt | OpAnd) as op, e1, e2) -> + | EBinOp ((OpLt | OpAnd | OpEq) as op, e1, e2) -> fprintf out "%a %a %a" expr6 e1 binop op diff --git a/print_ast.ml b/print_ast.ml index b1beb17..0472caa 100644 --- a/print_ast.ml +++ b/print_ast.ml @@ -79,6 +79,8 @@ let print_binop out = function fprintf out "OpMul" | OpLt -> fprintf out "OpLt" + | OpEq -> + fprintf out "OpEq" | OpAnd -> fprintf out "OpAnd" diff --git a/print_tokens.ml b/print_tokens.ml index 5ed84f4..4a899a4 100644 --- a/print_tokens.ml +++ b/print_tokens.ml @@ -52,6 +52,8 @@ let print_token show_loc out = function fprintf out "NOT" | LT -> fprintf out "LT" + | EQ -> + fprintf out "EQ" | AND -> fprintf out "AND" | COMMA -> diff --git a/test/good/TestEq b/test/good/TestEq new file mode 100755 index 0000000000000000000000000000000000000000..6b1777f784bc0184b02c9fff9e3d97d8687cb3d9 GIT binary patch literal 45008 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 literal 0 HcmV?d00001 diff --git a/test/good/TestEq.c b/test/good/TestEq.c new file mode 100644 index 0000000..a1e50a9 --- /dev/null +++ b/test/good/TestEq.c @@ -0,0 +1,23 @@ +/* +class TestEq { + public static void main(String[] args) { + if (1 == 1) System.out.println(42); + else System.out.println(0); + } +} +*/ +#include +#include +#include "tgc.h" +#pragma GCC diagnostic ignored "-Wpointer-to-int-cast" +#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" +struct array { int* array; int length; }; +tgc_t gc; +int main(int argc, char *argv[]) { + tgc_start(&gc, &argc); + if ((1 == 1)) printf("%d\n", 42); + else printf("%d\n", 0); + tgc_stop(&gc); + + return 0; +} diff --git a/test/good/TestEq.java b/test/good/TestEq.java new file mode 100644 index 0000000..d6fa137 --- /dev/null +++ b/test/good/TestEq.java @@ -0,0 +1,6 @@ +class TestEq { + public static void main(String[] args){ + if(1==1) System.out.println(42); + else System.out.println(0); + } +} \ No newline at end of file diff --git a/typechecking.ml b/typechecking.ml index 452bcd5..3c5cee8 100644 --- a/typechecking.ml +++ b/typechecking.ml @@ -173,6 +173,7 @@ and typecheck_expression (cenv : class_env) (venv : variable_env) (vinit : S.t) | OpSub | OpMul -> TypInt, TypInt | OpLt -> TypInt, TypBool + | OpEq -> TypInt, TypBool | OpAnd -> TypBool, TypBool in let e1' = typecheck_expression_expecting cenv venv vinit instanceof expected e1 in From 6e2a42ade5d75549a04907f0222f57516f9b28ee Mon Sep 17 00:00:00 2001 From: "Jeanne.Le-Gall-Botte" Date: Tue, 2 Apr 2024 12:00:20 +0200 Subject: [PATCH 3/6] or et gt --- LMJ.mli | 2 ++ TMJ.mli | 2 ++ lexer.mll | 2 ++ mj2c.ml | 2 ++ parser.mly | 7 +++++-- printTMJ.ml | 6 +++++- print_ast.ml | 4 ++++ print_tokens.ml | 4 ++++ test/good/TestGt.java | 6 ++++++ test/good/TestOr.java | 6 ++++++ typechecking.ml | 2 ++ 11 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 test/good/TestGt.java create mode 100644 test/good/TestOr.java diff --git a/LMJ.mli b/LMJ.mli index 4142cf3..ece6885 100644 --- a/LMJ.mli +++ b/LMJ.mli @@ -31,7 +31,9 @@ and binop = | OpSub (** Binary operator [-]. *) | OpMul (** Binary operator [*]. *) | OpLt (** Binary operator [<]. *) + | OpGt (** Binary operator [>]. *) | OpAnd (** Binary operator [&&]. *) + | OpOr (** BInary operator [||]. *) and unop = UOpNot (** Unary operator [!]. *) diff --git a/TMJ.mli b/TMJ.mli index 65182e1..cf1a71b 100644 --- a/TMJ.mli +++ b/TMJ.mli @@ -26,7 +26,9 @@ and binop = LMJ.binop = | OpSub | OpMul | OpLt + | OpGt | OpAnd + | OpOr and unop = LMJ.unop = UOpNot diff --git a/lexer.mll b/lexer.mll index 3735afa..fc180bb 100644 --- a/lexer.mll +++ b/lexer.mll @@ -29,7 +29,9 @@ rule get_token = parse | '-' { MINUS } | '*' { TIMES } | "&&" { AND } + | "||" { OR } | "<" { LT } + | ">" { GT } | '(' { LPAREN } | ')' { RPAREN } | '[' { LBRACKET } diff --git a/mj2c.ml b/mj2c.ml index 3202acb..921f0fe 100644 --- a/mj2c.ml +++ b/mj2c.ml @@ -300,7 +300,9 @@ let binop2c | OpSub -> fprintf out "-" | OpMul -> fprintf out "*" | OpLt -> fprintf out "<" + | OpGt -> fprintf out ">" | OpAnd -> fprintf out "&&" + | OpOr -> fprintf out "||" (** [type2c out typ] transpiles the type [typ] to C on the output channel [out]. *) let type2c diff --git a/parser.mly b/parser.mly index 468d755..ebf17b3 100644 --- a/parser.mly +++ b/parser.mly @@ -8,7 +8,7 @@ %token INTEGER BOOLEAN %token IDENT %token CLASS PUBLIC STATIC VOID MAIN STRING EXTENDS RETURN -%token PLUS MINUS TIMES NOT LT AND +%token PLUS MINUS TIMES NOT LT GT AND OR %token COMMA SEMICOLON %token ASSIGN %token LPAREN RPAREN LBRACKET RBRACKET LBRACE RBRACE @@ -17,8 +17,9 @@ %token IF ELSE WHILE %token EOF +%left OR %left AND -%nonassoc LT +%nonassoc LT GT %left PLUS MINUS %left TIMES %nonassoc NOT @@ -146,7 +147,9 @@ raw_expression: | MINUS { OpSub } | TIMES { OpMul } | LT { OpLt } +| GT { OpGt } | AND { OpAnd } +| OR { OpOr } instruction: | b = block diff --git a/printTMJ.ml b/printTMJ.ml index 6710309..78334c8 100644 --- a/printTMJ.ml +++ b/printTMJ.ml @@ -23,8 +23,12 @@ let binop out = function fprintf out "*" | OpLt -> fprintf out "<" + | OpGt -> + fprintf out ">" | OpAnd -> fprintf out "&&" + | OpOr -> + fprintf out "||" (** [expr out e], [expr0 out e], ..., [expr6 out e] print the expression [e] on the output channel [out]. [expr] is a synonym for [expr6]. @@ -103,7 +107,7 @@ and expr5 out e = match e.raw_expression with expr4 out e and expr6 out e = match e.raw_expression with - | EBinOp ((OpLt | OpAnd) as op, e1, e2) -> + | EBinOp ((OpLt | OpGt | OpAnd | OpOr) as op, e1, e2) -> fprintf out "%a %a %a" expr6 e1 binop op diff --git a/print_ast.ml b/print_ast.ml index b1beb17..f1260fe 100644 --- a/print_ast.ml +++ b/print_ast.ml @@ -79,8 +79,12 @@ let print_binop out = function fprintf out "OpMul" | OpLt -> fprintf out "OpLt" + | OpGt -> + fprintf out "OpGt" | OpAnd -> fprintf out "OpAnd" + | OpOr -> + fprintf out "OpOr" (** [print_expression prefix out e] prints the expression [e] on the output channel [out]. [prefix] is the string already printed just before [e]. *) diff --git a/print_tokens.ml b/print_tokens.ml index 5ed84f4..f3da4e0 100644 --- a/print_tokens.ml +++ b/print_tokens.ml @@ -52,8 +52,12 @@ let print_token show_loc out = function fprintf out "NOT" | LT -> fprintf out "LT" + | GT -> + fprintf out "GT" | AND -> fprintf out "AND" + | OR -> + fprintf out "OR" | COMMA -> fprintf out "COMMA" | SEMICOLON -> diff --git a/test/good/TestGt.java b/test/good/TestGt.java new file mode 100644 index 0000000..d22168f --- /dev/null +++ b/test/good/TestGt.java @@ -0,0 +1,6 @@ +class TestGt { + public static void main(String[] args){ + if(2>1) System.out.println(42); + else System.out.println(0); + } +} \ No newline at end of file diff --git a/test/good/TestOr.java b/test/good/TestOr.java new file mode 100644 index 0000000..acb7145 --- /dev/null +++ b/test/good/TestOr.java @@ -0,0 +1,6 @@ +class TestOr { + public static void main(String[] args) { + if(true || false) System.out.println(42); + else System.out.println(0); + } +} \ No newline at end of file diff --git a/typechecking.ml b/typechecking.ml index 452bcd5..644aac9 100644 --- a/typechecking.ml +++ b/typechecking.ml @@ -173,7 +173,9 @@ and typecheck_expression (cenv : class_env) (venv : variable_env) (vinit : S.t) | OpSub | OpMul -> TypInt, TypInt | OpLt -> TypInt, TypBool + | OpGt -> TypInt, TypBool | OpAnd -> TypBool, TypBool + | OpOr -> TypBool, TypBool in let e1' = typecheck_expression_expecting cenv venv vinit instanceof expected e1 in let e2' = typecheck_expression_expecting cenv venv vinit instanceof expected e2 in From d7978f621a6f868c7758d2a7b9857ee771a56fc3 Mon Sep 17 00:00:00 2001 From: tracy040401 Date: Mon, 8 Apr 2024 16:06:08 +0200 Subject: [PATCH 4/6] updated --- parser.mly | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/parser.mly b/parser.mly index abf0a82..8e53a81 100644 --- a/parser.mly +++ b/parser.mly @@ -165,6 +165,10 @@ instruction: | IF LPAREN c = expression RPAREN i1 = instruction ELSE i2 = instruction { IIf (c, i1, i2) } +// if sans else +| IF LPAREN c = expression RPAREN i1 = instruction // ce qu'on lit + { IIf (c, i1, IBlock([])) } // ce qu'on reconnait + | WHILE LPAREN c = expression RPAREN i = instruction { IWhile (c, i) } From f7dbe8aa16cd7be113797c348868e2eaa1fda9b1 Mon Sep 17 00:00:00 2001 From: tracy040401 Date: Mon, 8 Apr 2024 16:15:09 +0200 Subject: [PATCH 5/6] updated --- LMJ.mli | 3 +++ TMJ.mli | 2 ++ lexer.mll | 2 ++ mj2c.ml | 2 ++ parser.mly | 9 ++++++++- printTMJ.ml | 8 ++++++++ print_ast.ml | 4 ++++ print_tokens.ml | 4 ++++ test/good/TestGt.java | 6 ++++++ test/good/TestOr.java | 6 ++++++ typechecking.ml | 2 ++ 11 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 test/good/TestGt.java create mode 100644 test/good/TestOr.java diff --git a/LMJ.mli b/LMJ.mli index d30edef..98e951c 100644 --- a/LMJ.mli +++ b/LMJ.mli @@ -32,7 +32,10 @@ and binop = | OpMul (** Binary operator [*]. *) | OpLt (** Binary operator [<]. *) | OpEq (** Binary operator [==]. *) + | OpLt (** Binary operator [<]. *) + | OpGt (** Binary operator [>]. *) | OpAnd (** Binary operator [&&]. *) + | OpOr (** BInary operator [||]. *) and unop = UOpNot (** Unary operator [!]. *) diff --git a/TMJ.mli b/TMJ.mli index 7f90b77..3f01e64 100644 --- a/TMJ.mli +++ b/TMJ.mli @@ -27,7 +27,9 @@ and binop = LMJ.binop = | OpMul | OpLt | OpEq + | OpGt | OpAnd + | OpOr and unop = LMJ.unop = UOpNot diff --git a/lexer.mll b/lexer.mll index 38b3226..3a04c52 100644 --- a/lexer.mll +++ b/lexer.mll @@ -29,8 +29,10 @@ rule get_token = parse | '-' { MINUS } | '*' { TIMES } | "&&" { AND } + | "||" { OR } | "<" { LT } | "==" { EQ } + | ">" { GT } | '(' { LPAREN } | ')' { RPAREN } | '[' { LBRACKET } diff --git a/mj2c.ml b/mj2c.ml index 287dc1c..eca0885 100644 --- a/mj2c.ml +++ b/mj2c.ml @@ -301,7 +301,9 @@ let binop2c | OpMul -> fprintf out "*" | OpLt -> fprintf out "<" | OpEq -> fprintf out "==" + | OpGt -> fprintf out ">" | OpAnd -> fprintf out "&&" + | OpOr -> fprintf out "||" (** [type2c out typ] transpiles the type [typ] to C on the output channel [out]. *) let type2c diff --git a/parser.mly b/parser.mly index 8e53a81..96dd74d 100644 --- a/parser.mly +++ b/parser.mly @@ -8,7 +8,11 @@ %token INTEGER BOOLEAN %token IDENT %token CLASS PUBLIC STATIC VOID MAIN STRING EXTENDS RETURN +<<<<<<< HEAD %token PLUS MINUS TIMES NOT LT AND EQ +======= +%token PLUS MINUS TIMES NOT LT GT AND OR +>>>>>>> 6e2a42ade5d75549a04907f0222f57516f9b28ee %token COMMA SEMICOLON %token ASSIGN %token LPAREN RPAREN LBRACKET RBRACKET LBRACE RBRACE @@ -17,8 +21,9 @@ %token IF ELSE WHILE %token EOF +%left OR %left AND -%nonassoc LT +%nonassoc LT GT %left PLUS MINUS %left TIMES %nonassoc NOT @@ -147,7 +152,9 @@ raw_expression: | TIMES { OpMul } | LT { OpLt } | EQ { OpEq } +| GT { OpGt } | AND { OpAnd } +| OR { OpOr } instruction: | b = block diff --git a/printTMJ.ml b/printTMJ.ml index 8c6eebd..19145ce 100644 --- a/printTMJ.ml +++ b/printTMJ.ml @@ -23,10 +23,17 @@ let binop out = function fprintf out "*" | OpLt -> fprintf out "<" +<<<<<<< HEAD | OpEq -> fprintf out "==" +======= + | OpGt -> + fprintf out ">" +>>>>>>> 6e2a42ade5d75549a04907f0222f57516f9b28ee | OpAnd -> fprintf out "&&" + | OpOr -> + fprintf out "||" (** [expr out e], [expr0 out e], ..., [expr6 out e] print the expression [e] on the output channel [out]. [expr] is a synonym for [expr6]. @@ -106,6 +113,7 @@ and expr5 out e = match e.raw_expression with and expr6 out e = match e.raw_expression with | EBinOp ((OpLt | OpAnd | OpEq) as op, e1, e2) -> + | EBinOp ((OpLt | OpGt | OpAnd | OpOr) as op, e1, e2) -> fprintf out "%a %a %a" expr6 e1 binop op diff --git a/print_ast.ml b/print_ast.ml index 0472caa..e33cb1c 100644 --- a/print_ast.ml +++ b/print_ast.ml @@ -81,8 +81,12 @@ let print_binop out = function fprintf out "OpLt" | OpEq -> fprintf out "OpEq" + | OpGt -> + fprintf out "OpGt" | OpAnd -> fprintf out "OpAnd" + | OpOr -> + fprintf out "OpOr" (** [print_expression prefix out e] prints the expression [e] on the output channel [out]. [prefix] is the string already printed just before [e]. *) diff --git a/print_tokens.ml b/print_tokens.ml index 4a899a4..e4b3e2d 100644 --- a/print_tokens.ml +++ b/print_tokens.ml @@ -54,8 +54,12 @@ let print_token show_loc out = function fprintf out "LT" | EQ -> fprintf out "EQ" + | GT -> + fprintf out "GT" | AND -> fprintf out "AND" + | OR -> + fprintf out "OR" | COMMA -> fprintf out "COMMA" | SEMICOLON -> diff --git a/test/good/TestGt.java b/test/good/TestGt.java new file mode 100644 index 0000000..d22168f --- /dev/null +++ b/test/good/TestGt.java @@ -0,0 +1,6 @@ +class TestGt { + public static void main(String[] args){ + if(2>1) System.out.println(42); + else System.out.println(0); + } +} \ No newline at end of file diff --git a/test/good/TestOr.java b/test/good/TestOr.java new file mode 100644 index 0000000..acb7145 --- /dev/null +++ b/test/good/TestOr.java @@ -0,0 +1,6 @@ +class TestOr { + public static void main(String[] args) { + if(true || false) System.out.println(42); + else System.out.println(0); + } +} \ No newline at end of file diff --git a/typechecking.ml b/typechecking.ml index 3c5cee8..f167cb0 100644 --- a/typechecking.ml +++ b/typechecking.ml @@ -174,7 +174,9 @@ and typecheck_expression (cenv : class_env) (venv : variable_env) (vinit : S.t) | OpMul -> TypInt, TypInt | OpLt -> TypInt, TypBool | OpEq -> TypInt, TypBool + | OpGt -> TypInt, TypBool | OpAnd -> TypBool, TypBool + | OpOr -> TypBool, TypBool in let e1' = typecheck_expression_expecting cenv venv vinit instanceof expected e1 in let e2' = typecheck_expression_expecting cenv venv vinit instanceof expected e2 in From 8a447778528d422df043ecc21f091cb3d68e9f9f Mon Sep 17 00:00:00 2001 From: tracy040401 Date: Mon, 8 Apr 2024 16:17:54 +0200 Subject: [PATCH 6/6] Revert "updated" This reverts commit f7dbe8aa16cd7be113797c348868e2eaa1fda9b1. modified: LMJ.mli modified: TMJ.mli modified: lexer.mll modified: mj2c.ml modified: parser.mly modified: printTMJ.ml modified: print_ast.ml modified: print_tokens.ml deleted: test/good/TestGt.java deleted: test/good/TestOr.java modified: typechecking.ml --- LMJ.mli | 3 --- TMJ.mli | 2 -- lexer.mll | 2 -- mj2c.ml | 2 -- parser.mly | 9 +-------- printTMJ.ml | 8 -------- print_ast.ml | 4 ---- print_tokens.ml | 4 ---- test/good/TestGt.java | 6 ------ test/good/TestOr.java | 6 ------ typechecking.ml | 2 -- 11 files changed, 1 insertion(+), 47 deletions(-) delete mode 100644 test/good/TestGt.java delete mode 100644 test/good/TestOr.java diff --git a/LMJ.mli b/LMJ.mli index 98e951c..d30edef 100644 --- a/LMJ.mli +++ b/LMJ.mli @@ -32,10 +32,7 @@ and binop = | OpMul (** Binary operator [*]. *) | OpLt (** Binary operator [<]. *) | OpEq (** Binary operator [==]. *) - | OpLt (** Binary operator [<]. *) - | OpGt (** Binary operator [>]. *) | OpAnd (** Binary operator [&&]. *) - | OpOr (** BInary operator [||]. *) and unop = UOpNot (** Unary operator [!]. *) diff --git a/TMJ.mli b/TMJ.mli index 3f01e64..7f90b77 100644 --- a/TMJ.mli +++ b/TMJ.mli @@ -27,9 +27,7 @@ and binop = LMJ.binop = | OpMul | OpLt | OpEq - | OpGt | OpAnd - | OpOr and unop = LMJ.unop = UOpNot diff --git a/lexer.mll b/lexer.mll index 3a04c52..38b3226 100644 --- a/lexer.mll +++ b/lexer.mll @@ -29,10 +29,8 @@ rule get_token = parse | '-' { MINUS } | '*' { TIMES } | "&&" { AND } - | "||" { OR } | "<" { LT } | "==" { EQ } - | ">" { GT } | '(' { LPAREN } | ')' { RPAREN } | '[' { LBRACKET } diff --git a/mj2c.ml b/mj2c.ml index eca0885..287dc1c 100644 --- a/mj2c.ml +++ b/mj2c.ml @@ -301,9 +301,7 @@ let binop2c | OpMul -> fprintf out "*" | OpLt -> fprintf out "<" | OpEq -> fprintf out "==" - | OpGt -> fprintf out ">" | OpAnd -> fprintf out "&&" - | OpOr -> fprintf out "||" (** [type2c out typ] transpiles the type [typ] to C on the output channel [out]. *) let type2c diff --git a/parser.mly b/parser.mly index 96dd74d..8e53a81 100644 --- a/parser.mly +++ b/parser.mly @@ -8,11 +8,7 @@ %token INTEGER BOOLEAN %token IDENT %token CLASS PUBLIC STATIC VOID MAIN STRING EXTENDS RETURN -<<<<<<< HEAD %token PLUS MINUS TIMES NOT LT AND EQ -======= -%token PLUS MINUS TIMES NOT LT GT AND OR ->>>>>>> 6e2a42ade5d75549a04907f0222f57516f9b28ee %token COMMA SEMICOLON %token ASSIGN %token LPAREN RPAREN LBRACKET RBRACKET LBRACE RBRACE @@ -21,9 +17,8 @@ %token IF ELSE WHILE %token EOF -%left OR %left AND -%nonassoc LT GT +%nonassoc LT %left PLUS MINUS %left TIMES %nonassoc NOT @@ -152,9 +147,7 @@ raw_expression: | TIMES { OpMul } | LT { OpLt } | EQ { OpEq } -| GT { OpGt } | AND { OpAnd } -| OR { OpOr } instruction: | b = block diff --git a/printTMJ.ml b/printTMJ.ml index 19145ce..8c6eebd 100644 --- a/printTMJ.ml +++ b/printTMJ.ml @@ -23,17 +23,10 @@ let binop out = function fprintf out "*" | OpLt -> fprintf out "<" -<<<<<<< HEAD | OpEq -> fprintf out "==" -======= - | OpGt -> - fprintf out ">" ->>>>>>> 6e2a42ade5d75549a04907f0222f57516f9b28ee | OpAnd -> fprintf out "&&" - | OpOr -> - fprintf out "||" (** [expr out e], [expr0 out e], ..., [expr6 out e] print the expression [e] on the output channel [out]. [expr] is a synonym for [expr6]. @@ -113,7 +106,6 @@ and expr5 out e = match e.raw_expression with and expr6 out e = match e.raw_expression with | EBinOp ((OpLt | OpAnd | OpEq) as op, e1, e2) -> - | EBinOp ((OpLt | OpGt | OpAnd | OpOr) as op, e1, e2) -> fprintf out "%a %a %a" expr6 e1 binop op diff --git a/print_ast.ml b/print_ast.ml index e33cb1c..0472caa 100644 --- a/print_ast.ml +++ b/print_ast.ml @@ -81,12 +81,8 @@ let print_binop out = function fprintf out "OpLt" | OpEq -> fprintf out "OpEq" - | OpGt -> - fprintf out "OpGt" | OpAnd -> fprintf out "OpAnd" - | OpOr -> - fprintf out "OpOr" (** [print_expression prefix out e] prints the expression [e] on the output channel [out]. [prefix] is the string already printed just before [e]. *) diff --git a/print_tokens.ml b/print_tokens.ml index e4b3e2d..4a899a4 100644 --- a/print_tokens.ml +++ b/print_tokens.ml @@ -54,12 +54,8 @@ let print_token show_loc out = function fprintf out "LT" | EQ -> fprintf out "EQ" - | GT -> - fprintf out "GT" | AND -> fprintf out "AND" - | OR -> - fprintf out "OR" | COMMA -> fprintf out "COMMA" | SEMICOLON -> diff --git a/test/good/TestGt.java b/test/good/TestGt.java deleted file mode 100644 index d22168f..0000000 --- a/test/good/TestGt.java +++ /dev/null @@ -1,6 +0,0 @@ -class TestGt { - public static void main(String[] args){ - if(2>1) System.out.println(42); - else System.out.println(0); - } -} \ No newline at end of file diff --git a/test/good/TestOr.java b/test/good/TestOr.java deleted file mode 100644 index acb7145..0000000 --- a/test/good/TestOr.java +++ /dev/null @@ -1,6 +0,0 @@ -class TestOr { - public static void main(String[] args) { - if(true || false) System.out.println(42); - else System.out.println(0); - } -} \ No newline at end of file diff --git a/typechecking.ml b/typechecking.ml index f167cb0..3c5cee8 100644 --- a/typechecking.ml +++ b/typechecking.ml @@ -174,9 +174,7 @@ and typecheck_expression (cenv : class_env) (venv : variable_env) (vinit : S.t) | OpMul -> TypInt, TypInt | OpLt -> TypInt, TypBool | OpEq -> TypInt, TypBool - | OpGt -> TypInt, TypBool | OpAnd -> TypBool, TypBool - | OpOr -> TypBool, TypBool in let e1' = typecheck_expression_expecting cenv venv vinit instanceof expected e1 in let e2' = typecheck_expression_expecting cenv venv vinit instanceof expected e2 in