refactor: format AST to follow BNF order

This commit is contained in:
Gleb Koval 2025-01-31 20:01:44 +00:00
parent 1c0907f610
commit 292551aca0
Signed by: cyclane
GPG Key ID: 15E168A8B332382C

View File

@ -2,15 +2,7 @@ package wacc
import parsley.generic._
// TODO - Note that I have opted for object Add extends ParserBridge2[Expr5, Expr6, Add] instead of object Add extends ParserBridge2[Expr5, Expr6, Expr5]
// Reason: Better type safety / pattern matching ? We can change this at any time.
// For consistency in case objects you may see I extended the parser bridge pattern with ".type"
// Personally I am not a fan
// TODO - Obviously layout issues, could follow Haskell interlude style
object ast {
// Expressions
sealed trait Expr extends RValue
sealed trait Expr1 extends Expr
@ -20,42 +12,24 @@ object ast {
sealed trait Expr5 extends Expr4
sealed trait Expr6 extends Expr5
case class Parens(expr: Expr) extends Expr6
object Parens extends ParserBridge1[Expr, Parens]
// Atoms
case class IntLiter(v: Int) extends Expr6
object IntLiter extends ParserBridge1[Int, IntLiter]
case class BoolLiter(v: Boolean) extends Expr6
object BoolLiter extends ParserBridge1[Boolean, BoolLiter]
case class CharLiter(v: Char) extends Expr6
object CharLiter extends ParserBridge1[Char, CharLiter]
case class StrLiter(v: String) extends Expr6
object StrLiter extends ParserBridge1[String, StrLiter]
case object PairLiter extends Expr6 with ParserBridge0[PairLiter.type]
case class Ident(v: String) extends Expr6 with LValue
object Ident extends ParserBridge1[String, Ident]
case class ArrayElem(name: Ident, indices: List[Expr])
extends Expr6
with LValue
object ArrayElem extends ParserBridge2[Ident, List[Expr], ArrayElem]
// R values
sealed trait RValue
case class ArrayLiter(elems: List[Expr]) extends RValue
object ArrayLiter extends ParserBridge1[List[Expr], ArrayLiter]
case class NewPair(fst: Expr, snd: Expr) extends RValue
object NewPair extends ParserBridge2[Expr, Expr, NewPair]
case class Call(name: Ident, args: List[Expr]) extends RValue
object Call extends ParserBridge2[Ident, List[Expr], Call]
case class Parens(expr: Expr) extends Expr6
object Parens extends ParserBridge1[Expr, Parens]
// Unary operators
case class Negate(x: Expr6) extends Expr6
@ -97,6 +71,40 @@ object ast {
case class Or(x: Expr1, y: Expr1) extends Expr
object Or extends ParserBridge2[Expr1, Expr1, Or]
// Types
sealed trait Type
sealed trait BaseType extends Type with PairElemType
case object IntType extends BaseType with ParserBridge0[IntType.type]
case object BoolType extends BaseType with ParserBridge0[BoolType.type]
case object CharType extends BaseType with ParserBridge0[CharType.type]
case object StringType extends BaseType with ParserBridge0[StringType.type]
case class ArrayType(elemType: Type) extends Type with PairElemType
object ArrayType extends ParserBridge1[Type, ArrayType]
case class PairType(fst: PairElemType, snd: PairElemType) extends Type
object PairType extends ParserBridge2[PairElemType, PairElemType, PairType]
sealed trait PairElemType
case object UntypedPairType
extends PairElemType
with ParserBridge0[UntypedPairType.type]
// waccadoodledo
case class Program(funcs: List[FuncDecl], main: Stmt)
object Program extends ParserBridge2[List[FuncDecl], Stmt, Program]
// Function Definitions
case class FuncDecl(
returnType: Type,
name: Ident,
params: List[Param],
body: Stmt
)
object FuncDecl
extends ParserBridge4[Type, Ident, List[Param], Stmt, FuncDecl]
case class Param(paramType: Type, name: Ident)
object Param extends ParserBridge2[Type, Ident, Param]
// Statements
sealed trait Stmt
case object Skip extends Stmt with ParserBridge0[Skip.type]
@ -121,47 +129,19 @@ object ast {
case class SeqStmt(stmt1: Stmt, stmt2: Stmt) extends Stmt
object SeqStmt extends ParserBridge2[Stmt, Stmt, SeqStmt]
// LValues
sealed trait LValue
// Pair Elements
sealed trait RValue
case class ArrayLiter(elems: List[Expr]) extends RValue
object ArrayLiter extends ParserBridge1[List[Expr], ArrayLiter]
case class NewPair(fst: Expr, snd: Expr) extends RValue
object NewPair extends ParserBridge2[Expr, Expr, NewPair]
case class Call(name: Ident, args: List[Expr]) extends RValue
object Call extends ParserBridge2[Ident, List[Expr], Call]
sealed trait PairElem extends LValue with RValue
case class Fst(elem: LValue) extends PairElem
object Fst extends ParserBridge1[LValue, Fst]
case class Snd(elem: LValue) extends PairElem
object Snd extends ParserBridge1[LValue, Snd]
// Function Defns
case class FuncDecl(
returnType: Type,
name: Ident,
params: List[Param],
body: Stmt
)
object FuncDecl
extends ParserBridge4[Type, Ident, List[Param], Stmt, FuncDecl]
case class Param(paramType: Type, name: Ident)
object Param extends ParserBridge2[Type, Ident, Param]
// waccadoodledo
case class Program(funcs: List[FuncDecl], main: Stmt)
object Program extends ParserBridge2[List[FuncDecl], Stmt, Program]
// Types
sealed trait Type
sealed trait BaseType extends Type with PairElemType
case object IntType extends BaseType with ParserBridge0[IntType.type]
case object BoolType extends BaseType with ParserBridge0[BoolType.type]
case object CharType extends BaseType with ParserBridge0[CharType.type]
case object StringType extends BaseType with ParserBridge0[StringType.type]
case class ArrayType(elemType: Type) extends Type with PairElemType
object ArrayType extends ParserBridge1[Type, ArrayType]
case class PairType(fst: PairElemType, snd: PairElemType) extends Type
object PairType extends ParserBridge2[PairElemType, PairElemType, PairType]
sealed trait PairElemType
case object UntypedPairType
extends PairElemType
with ParserBridge0[UntypedPairType.type]
}