From e23ef8da4810e803bf057a688eee19dbbcaa46a7 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Thu, 13 Feb 2025 17:19:15 +0000 Subject: [PATCH 1/5] feat: initial microWacc definition --- src/main/wacc/Frontend/microWacc.scala | 67 ++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/main/wacc/Frontend/microWacc.scala diff --git a/src/main/wacc/Frontend/microWacc.scala b/src/main/wacc/Frontend/microWacc.scala new file mode 100644 index 0000000..1faf3a8 --- /dev/null +++ b/src/main/wacc/Frontend/microWacc.scala @@ -0,0 +1,67 @@ +package wacc + +import cats.data.NonEmptyList + +object microWacc { + import wacc.types._ + + sealed trait CallTarget + sealed trait Expr(val ty: SemType) + sealed trait LValue + + // Atomic expressions + case class IntLiter(v: Int) extends Expr(KnownType.Int) + case class BoolLiter(v: Boolean) extends Expr(KnownType.Bool) + case class CharLiter(v: Char) extends Expr(KnownType.Char) + case class ArrayLiter(elems: List[Expr])(ty: SemType) extends Expr(ty) + case class Ident(name: String)(identTy: SemType) extends Expr(identTy) with CallTarget with LValue + case class ArrayElem(name: Ident, indices: NonEmptyList[Expr])(ty: SemType) + extends Expr(ty) + with LValue + + // Operators + case class UnaryOp(x: Expr, op: UnaryOperator)(ty: SemType) extends Expr(ty) + enum UnaryOperator { + case Negate + case Not + case Len + case Ord + case Chr + } + case class BinaryOp(x: Expr, y: Expr, op: BinaryOperator)(ty: SemType) extends Expr(ty) + enum BinaryOperator { + case Add + case Sub + case Mul + case Div + case Mod + case Greater + case GreaterEq + case Less + case LessEq + case Eq + case Neq + case And + case Or + } + + // Statements + sealed trait Stmt + + enum Builtin extends CallTarget { + case Read + case Free + case Exit + case Print + } + + case class Assign(lhs: LValue, rhs: Expr) extends Stmt + case class If(cond: Expr, thenBranch: List[Stmt], elseBranch: List[Stmt]) extends Stmt + case class While(cond: Expr, body: List[Stmt]) extends Stmt + case class Call(target: CallTarget, args: List[Expr]) extends Stmt + case class Return(expr: Expr) extends Stmt + + // Program + case class FuncDecl(name: Ident, params: List[Ident], body: List[Stmt]) + case class Program(funcs: List[FuncDecl], stmts: List[Stmt]) +} From d6aa83a2eab3c9f9d370baf689ac97f34b7fa693 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Thu, 13 Feb 2025 23:54:46 +0000 Subject: [PATCH 2/5] fix: add support for return types in micro wacc calls --- src/main/wacc/Frontend/microWacc.scala | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/wacc/Frontend/microWacc.scala b/src/main/wacc/Frontend/microWacc.scala index 1faf3a8..88e43f2 100644 --- a/src/main/wacc/Frontend/microWacc.scala +++ b/src/main/wacc/Frontend/microWacc.scala @@ -5,16 +5,19 @@ import cats.data.NonEmptyList object microWacc { import wacc.types._ - sealed trait CallTarget + sealed trait CallTarget(val retTy: SemType) sealed trait Expr(val ty: SemType) - sealed trait LValue + sealed trait LValue extends Expr // Atomic expressions case class IntLiter(v: Int) extends Expr(KnownType.Int) case class BoolLiter(v: Boolean) extends Expr(KnownType.Bool) case class CharLiter(v: Char) extends Expr(KnownType.Char) case class ArrayLiter(elems: List[Expr])(ty: SemType) extends Expr(ty) - case class Ident(name: String)(identTy: SemType) extends Expr(identTy) with CallTarget with LValue + case class Ident(name: String)(identTy: SemType) + extends Expr(identTy) + with CallTarget(identTy) + with LValue case class ArrayElem(name: Ident, indices: NonEmptyList[Expr])(ty: SemType) extends Expr(ty) with LValue @@ -48,17 +51,18 @@ object microWacc { // Statements sealed trait Stmt - enum Builtin extends CallTarget { - case Read - case Free - case Exit - case Print + object Builtin { + case object ReadInt extends CallTarget(KnownType.Int) + case object ReadChar extends CallTarget(KnownType.Char) + case object Print extends CallTarget(?) + case object Exit extends CallTarget(?) + case object Free extends CallTarget(?) } case class Assign(lhs: LValue, rhs: Expr) extends Stmt case class If(cond: Expr, thenBranch: List[Stmt], elseBranch: List[Stmt]) extends Stmt case class While(cond: Expr, body: List[Stmt]) extends Stmt - case class Call(target: CallTarget, args: List[Expr]) extends Stmt + case class Call(target: CallTarget, args: List[Expr]) extends Stmt with Expr(target.retTy) case class Return(expr: Expr) extends Stmt // Program From 03999e00ef31c4c6081ba0db03d25bc5c1e85ccc Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Fri, 14 Feb 2025 00:07:43 +0000 Subject: [PATCH 3/5] fix: add support for println in micro wacc --- src/main/wacc/Frontend/microWacc.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/wacc/Frontend/microWacc.scala b/src/main/wacc/Frontend/microWacc.scala index 88e43f2..a19567e 100644 --- a/src/main/wacc/Frontend/microWacc.scala +++ b/src/main/wacc/Frontend/microWacc.scala @@ -55,6 +55,7 @@ object microWacc { case object ReadInt extends CallTarget(KnownType.Int) case object ReadChar extends CallTarget(KnownType.Char) case object Print extends CallTarget(?) + case object Println extends CallTarget(?) case object Exit extends CallTarget(?) case object Free extends CallTarget(?) } From 6a6aadbbeb0528f13bd84f71e9e5d2f1d0f11994 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Fri, 14 Feb 2025 00:21:10 +0000 Subject: [PATCH 4/5] fix: add nulliter to micro wacc --- src/main/wacc/Frontend/microWacc.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/wacc/Frontend/microWacc.scala b/src/main/wacc/Frontend/microWacc.scala index a19567e..d0b6f9d 100644 --- a/src/main/wacc/Frontend/microWacc.scala +++ b/src/main/wacc/Frontend/microWacc.scala @@ -14,6 +14,7 @@ object microWacc { case class BoolLiter(v: Boolean) extends Expr(KnownType.Bool) case class CharLiter(v: Char) extends Expr(KnownType.Char) case class ArrayLiter(elems: List[Expr])(ty: SemType) extends Expr(ty) + case class NullLiter()(ty: SemType) extends Expr(ty) case class Ident(name: String)(identTy: SemType) extends Expr(identTy) with CallTarget(identTy) From bc25f914ad83c3d1c5584cef6f28f16019f0ab03 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Fri, 14 Feb 2025 00:35:48 +0000 Subject: [PATCH 5/5] fix: add uid to microWacc Ident --- src/main/wacc/Frontend/microWacc.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/wacc/Frontend/microWacc.scala b/src/main/wacc/Frontend/microWacc.scala index d0b6f9d..04b9035 100644 --- a/src/main/wacc/Frontend/microWacc.scala +++ b/src/main/wacc/Frontend/microWacc.scala @@ -15,7 +15,7 @@ object microWacc { case class CharLiter(v: Char) extends Expr(KnownType.Char) case class ArrayLiter(elems: List[Expr])(ty: SemType) extends Expr(ty) case class NullLiter()(ty: SemType) extends Expr(ty) - case class Ident(name: String)(identTy: SemType) + case class Ident(name: String, uid: Int)(identTy: SemType) extends Expr(identTy) with CallTarget(identTy) with LValue