diff options
author | Jakob Odersky <jodersky@gmail.com> | 2012-10-30 20:51:53 +0100 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2012-10-30 20:51:53 +0100 |
commit | e45d9919537fbe196817b7fe13a50e4de3f09611 (patch) | |
tree | 204f043e48fb313dc60c676f268210db09e7ffab /src | |
parent | 264197f0cb354aefcc8b5458bb4d2ab0300cb77f (diff) | |
download | scalam-e45d9919537fbe196817b7fe13a50e4de3f09611.tar.gz scalam-e45d9919537fbe196817b7fe13a50e4de3f09611.tar.bz2 scalam-e45d9919537fbe196817b7fe13a50e4de3f09611.zip |
refactor abstract syntax trees:
*abstract sytax trees are now backed by pattern matching
*add support for comments
Diffstat (limited to 'src')
-rw-r--r-- | src/main/scala/scalam/m/ast/Identifier.scala | 15 | ||||
-rw-r--r-- | src/main/scala/scalam/m/ast/expressions.scala | 30 | ||||
-rw-r--r-- | src/main/scala/scalam/m/ast/package.scala | 64 | ||||
-rw-r--r-- | src/main/scala/scalam/m/ast/statements.scala | 14 |
4 files changed, 78 insertions, 45 deletions
diff --git a/src/main/scala/scalam/m/ast/Identifier.scala b/src/main/scala/scalam/m/ast/Identifier.scala new file mode 100644 index 0000000..87bfa43 --- /dev/null +++ b/src/main/scala/scalam/m/ast/Identifier.scala @@ -0,0 +1,15 @@ +package scalam.m.ast + +case class Identifier(name: String) extends Mable{ + + def m = 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) + } +}
\ No newline at end of file diff --git a/src/main/scala/scalam/m/ast/expressions.scala b/src/main/scala/scalam/m/ast/expressions.scala new file mode 100644 index 0000000..db99ae6 --- /dev/null +++ b/src/main/scala/scalam/m/ast/expressions.scala @@ -0,0 +1,30 @@ +package scalam.m.ast + +trait Expression extends Mable with Root{ + def m: String = this match { + case IntLiteral(x) => x.toString + case DoubleLiteral(x) => x.toString + case StringLiteral(x) => "'" + x + "'" + case SliceLiteral => ":" + case ArrayLiteral(elements @ _*) => elements.map(_.m).mkString("[", ",", "]") + case MatrixLiteral(rows @ _*) => rows.map(_.m).mkString("[", ";", "]") + + case Variable(id) => id.m + case IndexMatrix(id, indices @ _*) => id.m + indices.map(_.m).mkString("(", ",", ")") + case IndexStructure(id, indices @ _*) => id.m + indices.map(_.m).mkString("{", ",", "}") + case Function(id, params @ _*) => id.m + params.map(_.m).mkString("(", ",", ")") + + case _ => throw new IllegalArgumentException("unkown expression: " + this) + } +} + +case class IntLiteral(x: Int) extends Expression +case class DoubleLiteral(x: Double) extends Expression +case class StringLiteral(x: String) extends Expression +case object SliceLiteral extends Expression +case class ArrayLiteral(elements: Expression*) extends Expression +case class MatrixLiteral(rows: Expression*) extends Expression +case class Variable(id: Identifier) extends Expression +case class IndexMatrix(id: Identifier, indices: Expression*) extends Expression +case class IndexStructure(id: Identifier, indices: Expression*) extends Expression +case class Function(function: Identifier, params: Expression*) extends Expression
\ No newline at end of file diff --git a/src/main/scala/scalam/m/ast/package.scala b/src/main/scala/scalam/m/ast/package.scala index f3a3736..245c6c4 100644 --- a/src/main/scala/scalam/m/ast/package.scala +++ b/src/main/scala/scalam/m/ast/package.scala @@ -1,54 +1,28 @@ package scalam.m.ast -trait Mable { def m: String } - -//top level m constructs -case class Identifier(name: String) extends Mable { - def m: String = name +/** Trait common to all objects having a representation in the matlab programming language. */ +trait Mable { + def m: String +} - 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 Root { + final def line: String = this match { + case statement: Statement => statement.m + ";" + case expression: Expression => expression.m + ";" + case comment: Comment => comment.m } } -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("(", ",", ")") +trait Comment extends Mable with Root { + def m = this match { + case SimpleComment(text) => "% " + text + case DoubleComment(text) => "%% " + text + case EOLComment(root, comment) => root.line + " " + comment.m + } } -//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 SimpleComment(text: String) extends Comment +case class DoubleComment(text: String) extends Comment +case class EOLComment(root: Root, comment: Comment) extends Comment + -case class Evaluate(expression: Expression) extends Statement { - def m = expression.m + ";" -}
\ No newline at end of file diff --git a/src/main/scala/scalam/m/ast/statements.scala b/src/main/scala/scalam/m/ast/statements.scala new file mode 100644 index 0000000..97b9821 --- /dev/null +++ b/src/main/scala/scalam/m/ast/statements.scala @@ -0,0 +1,14 @@ +package scalam.m.ast + +trait Statement extends Mable with Root{ + def m: String = this match { + case Assign(id, value) => id.m + " = " + value.m + case AssignMatrixIndex(id, indices, value) => + id.m + indices.map(_.m).mkString("(", ",", ")") + " = " + value.m + + case _ => throw new IllegalArgumentException("unkown statement: " + this) + } +} + +case class Assign(variable: Identifier, value: Expression) extends Statement +case class AssignMatrixIndex(variable: Identifier, indices: Seq[Expression], value: Expression) extends Statement |