aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2012-10-30 20:51:53 +0100
committerJakob Odersky <jodersky@gmail.com>2012-10-30 20:51:53 +0100
commite45d9919537fbe196817b7fe13a50e4de3f09611 (patch)
tree204f043e48fb313dc60c676f268210db09e7ffab /src
parent264197f0cb354aefcc8b5458bb4d2ab0300cb77f (diff)
downloadscalam-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.scala15
-rw-r--r--src/main/scala/scalam/m/ast/expressions.scala30
-rw-r--r--src/main/scala/scalam/m/ast/package.scala64
-rw-r--r--src/main/scala/scalam/m/ast/statements.scala14
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