Я не знаю о существующем CAS для Scala.
При выполнении языковой обработки мне обычно гораздо приятнее использовать сопоставление с образцом по запечатанной иерархии, чем по полиморфизму в стиле OO.Поскольку добавление новых типов терминов встречается редко (это означает смену языка) и добавление новых общих операций, эта сторона проблемы выражения, кажется, подходит лучше.
sealed trait Term
case class Const(c : Double) extends Term
case class Var(x : String) extends Term
case class Negate(x : Term) extends Term
case class Multiply(xs : List[Term]) extends Term
// etc
object CAS {
// I assume that the assignment map may be incomplete, thus
// evaluation is really a partial substitution and then simplification
def evaluate(t : Term, assignment : Var => Option[Double]) : Term = t match {
case _ : Const => t
case v : Var => assignment(v) map Const getOrElse v
case Negate(x) => evaluate(Multiply(Const(-1) :: evaluate(x, assignment) :: Nil), assignment)
case Multiply(ts) => {
val evalTs = ts map { t => evaluate(t, assignment) }
val flattened = evalTs flatMap {
case Multiply(subs) => subs
case t => List(t)
}
val constTotal = Const((flattened collect { case Const(c) => c }).product)
val otherTerms = flattened filter { case t : Const => false; case _ => true }
(constTotal, otherTerms) match {
case (Const(0), _) => Const(0)
case (Const(1), Nil) => Const(1)
case (Const(1), _) => Multiply(otherTerms)
case _ => Multiply(constTotal +: otherTerms)
}
}
// etc
}
private val emptyAssignment : (Var => Option[Double]) = { x : Var => None }
// simplfication is just evaluation with an empty assignment
def simplify(t : Term) : Term = evaluate(t, emptyAssignment)
}
Один бит технологии, которую я имел в видуузнать о, но не является атрибутом грамматики.Предполагается, что они снимают большую часть скуки с такого рода обработки AST.См. Kiama http://code.google.com/p/kiama/ для реализации Scala
Кстати, хотя я и использую здесь удваивания для вашего домена, вам может быть лучше использовать «большой рациональный» - пару BigIntegers.Они медленные, но очень точные.