aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/scalam/m/ast/package.scala
blob: f3a3736ee97ffde8af318c978419eac5439cfd9d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package scalam.m.ast

trait Mable { def m: String }

//top level m constructs
case class Identifier(name: String) extends Mable {
  def m: String = name

  def toValid = {
    val word = name.filter(c => c.isLetterOrDigit || c == '_')
    val id = word.headOption match {
      case None => sys.error("")
      case Some(c) => if (!c.isLetter) 'x' + word else word
    }
    Identifier(id)
  }
}
trait Expression extends Mable
trait Statement extends Mable
case class Comment(text: String) extends Mable {def m = "% " + text}

//expressions
case class IntLiteral(x: Int) extends Expression { def m = x.toString }
case class DoubleLiteral(x: Double) extends Expression { def m = x.toString }
case class StringLiteral(x: String) extends Expression { def m = "'" + x.toString + "'" }
case object SliceLiteral extends Expression { def m = ":" }
case class ArrayLiteral(elements: Expression*) extends Expression {
  def m = elements.map(_.m).mkString("[", ",", "]")
}
case class MatrixLiteral(rows: Expression*) extends Expression {
  def m = rows.map(_.m).mkString("[", ";", "]")
}
case class Variable(id: Identifier) extends Expression { def m = id.m }
case class IndexMatrix(id: Identifier, indices: Expression*) extends Expression {
  def m = id.m + indices.map(_.m).mkString("(", ",", ")")
}
case class IndexStructure(id: Identifier, indices: Expression*) extends Expression {
  def m = id.m + indices.map(_.m).mkString("{", ",", "}")
}
case class Function(function: Identifier, params: Expression*) extends Expression {
  def m = function.m + params.map(_.m).mkString("(", ",", ")")
}

//statements
case class Assign(variable: Identifier, value: Expression) extends Statement {
  def m = variable.m + " = " + value.m + ";"
}
case class AssignMatrixIndex(variable: Identifier, indices: Seq[Expression], value: Expression) extends Statement {
  def m = variable.m + indices.map(_.m).mkString("(", ",", ")") + " = " + value.m + ";"
}

case class Evaluate(expression: Expression) extends Statement {
  def m = expression.m + ";"
}