Skip to content

Instantly share code, notes, and snippets.

@kiritsuku
Created October 3, 2012 09:26
Show Gist options
  • Save kiritsuku/3826030 to your computer and use it in GitHub Desktop.
Save kiritsuku/3826030 to your computer and use it in GitHub Desktop.
object X extends App {
val s = StatementParser("x = (x + 1)")
println(s)
}
trait Expression
case class Plus(a: Expression, b: Expression) extends Expression
case class Var(name: String) extends Expression
case class Num(n: Int) extends Expression
trait Statement
case class Assign(v: String, ex: Expression) extends Statement
import scala.util.parsing.combinator.RegexParsers
object StatementParser extends RegexParsers {
private lazy val num: Parser[Num] =
"""(\d+)""".r ^^ (n => Num(n.toInt))
private lazy val identifier: Parser[String] =
"""([A-Za-z][A-Za-z0-9]*)""".r
private lazy val variable: Parser[Var] =
identifier ^^ Var
private lazy val expression: Parser[Expression] =
plus | variable | num
private lazy val plus: Parser[Plus] =
("(" ~> expression <~ "+") ~ expression <~ ")" ^^ { case l ~ r => Plus(l, r) }
private lazy val assign: Parser[Assign] =
(identifier <~ "=") ~ expression ^^ { case v ~ ex => Assign(v, ex) }
def apply(str: String): Statement = parseAll(assign, str) match {
case Success(result, _) => result
case NoSuccess(msg, _) => sys.error("Could not parse the input string: "+msg)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment