fix: unary and binary operators AST - consistent style, precedence and associativity

This commit is contained in:
Gleb Koval 2025-01-31 19:27:22 +00:00
parent 49ebf2f7d0
commit c0cf3692fd
Signed by: cyclane
GPG Key ID: 15E168A8B332382C

View File

@ -43,9 +43,6 @@ object ast {
with LValue with LValue
object ArrayElem extends ParserBridge2[String, List[Expr], ArrayElem] object ArrayElem extends ParserBridge2[String, List[Expr], ArrayElem]
case class UnaryOper(op: UnaryOperator, expr: Expr6) extends Expr6
object UnaryOper extends ParserBridge2[UnaryOperator, Expr6, UnaryOper]
// R values // R values
sealed trait RValue sealed trait RValue
@ -58,24 +55,28 @@ object ast {
case class Call(name: String, args: List[Expr]) extends Expr6 with RValue case class Call(name: String, args: List[Expr]) extends Expr6 with RValue
object Call extends ParserBridge2[String, List[Expr], Call] object Call extends ParserBridge2[String, List[Expr], Call]
// Operators // Unary operators
sealed trait UnaryOperator case class Negate(x: Expr6) extends Expr6
case object Negate extends UnaryOperator with ParserBridge0[Negate.type] object Negate extends ParserBridge1[Expr6, Negate]
case object Not extends UnaryOperator with ParserBridge0[Not.type] case class Not(x: Expr6) extends Expr6
case object Len extends UnaryOperator with ParserBridge0[Len.type] object Not extends ParserBridge1[Expr6, Not]
case object Ord extends UnaryOperator with ParserBridge0[Ord.type] case class Len(x: Expr6) extends Expr6
case object Chr extends UnaryOperator with ParserBridge0[Chr.type] object Len extends ParserBridge1[Expr6, Len]
case class Ord(x: Expr6) extends Expr6
object Ord extends ParserBridge1[Expr6, Ord]
case class Chr(x: Expr6) extends Expr6
object Chr extends ParserBridge1[Expr6, Chr]
sealed trait BinaryOperator // Binary operators
case class Add(x: Expr5, y: Expr6) extends Expr5 case class Add(x: Expr5, y: Expr6) extends Expr4
object Add extends ParserBridge2[Expr5, Expr6, Add] object Add extends ParserBridge2[Expr5, Expr6, Add]
case class Sub(x: Expr5, y: Expr6) extends Expr5 case class Sub(x: Expr5, y: Expr6) extends Expr4
object Sub extends ParserBridge2[Expr5, Expr6, Sub] object Sub extends ParserBridge2[Expr5, Expr6, Sub]
case class Mul(x: Expr6, y: Expr6) extends Expr6 case class Mul(x: Expr6, y: Expr6) extends Expr5
object Mul extends ParserBridge2[Expr6, Expr6, Mul] object Mul extends ParserBridge2[Expr6, Expr6, Mul]
case class Div(x: Expr6, y: Expr6) extends Expr6 case class Div(x: Expr6, y: Expr6) extends Expr5
object Div extends ParserBridge2[Expr6, Expr6, Div] object Div extends ParserBridge2[Expr6, Expr6, Div]
case class Mod(x: Expr6, y: Expr6) extends Expr6 case class Mod(x: Expr6, y: Expr6) extends Expr5
object Mod extends ParserBridge2[Expr6, Expr6, Mod] object Mod extends ParserBridge2[Expr6, Expr6, Mod]
case class Greater(x: Expr4, y: Expr4) extends Expr3 case class Greater(x: Expr4, y: Expr4) extends Expr3
object Greater extends ParserBridge2[Expr4, Expr4, Greater] object Greater extends ParserBridge2[Expr4, Expr4, Greater]
@ -85,13 +86,13 @@ object ast {
object Less extends ParserBridge2[Expr4, Expr4, Less] object Less extends ParserBridge2[Expr4, Expr4, Less]
case class LessEq(x: Expr4, y: Expr4) extends Expr3 case class LessEq(x: Expr4, y: Expr4) extends Expr3
object LessEq extends ParserBridge2[Expr4, Expr4, LessEq] object LessEq extends ParserBridge2[Expr4, Expr4, LessEq]
case class Eq(x: Expr4, y: Expr4) extends Expr3 case class Eq(x: Expr3, y: Expr3) extends Expr2
object Eq extends ParserBridge2[Expr4, Expr4, Eq] object Eq extends ParserBridge2[Expr3, Expr3, Eq]
case class Neq(x: Expr4, y: Expr4) extends Expr3 case class Neq(x: Expr3, y: Expr3) extends Expr2
object Neq extends ParserBridge2[Expr4, Expr4, Neq] object Neq extends ParserBridge2[Expr3, Expr3, Neq]
case class And(x: Expr2, y: Expr2) extends Expr2 case class And(x: Expr2, y: Expr2) extends Expr1
object And extends ParserBridge2[Expr2, Expr2, And] object And extends ParserBridge2[Expr2, Expr2, And]
case class Or(x: Expr1, y: Expr1) extends Expr1 case class Or(x: Expr1, y: Expr1) extends Expr
object Or extends ParserBridge2[Expr1, Expr1, Or] object Or extends ParserBridge2[Expr1, Expr1, Or]
// Statements // Statements