Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package it.vigtig.dm509.linearalgebra.dsl
- import scala.util.parsing.combinator._
- case class Coefficient(factor: Double, id: String)
- case class Line(lhs: List[Coefficient], rhs: Double)
- trait LinearSystemDSL extends JavaTokenParsers with RegexParsers {
- def num: Parser[Double] = floatingPointNumber ^^ (_.toDouble)
- def char: Parser[String] = """[a-zA-Z]""".r
- def id: Parser[String] = char ~ rep(char | floatingPointNumber) ^^ (x => x._1 + x._2.mkString)
- def op: Parser[String] = "+" | "-"
- def factor: Parser[Coefficient] = ((num ~ id) | id) ^^ {
- case (num: Double) ~ (id: String) => Coefficient(num, id)
- case id: String => Coefficient(1d, id)
- }
- def lhs: Parser[List[Coefficient]] = factor ~ rep(op ~ factor) ^^ (x => x._1 :: x._2.map {
- case "+" ~ f => f
- case "-" ~ Coefficient(f, id) => Coefficient(-f, id)
- })
- def line: Parser[Line] = lhs ~ "=" ~ num ^^ {
- case lhs ~ _ ~ rhs => Line(lhs, rhs)
- }
- def system: Parser[List[Line]] = rep(line)
- }
- object LinearSystemDSLTest extends App with LinearSystemDSL {
- val program =
- """
- 2X + Y - Z = 8
- -3X - Y + 2Z = -11
- -2X + Y + 2Z = -3
- """
- val pr = parseAll(system, program).get.mkString("\n")
- println(parseAll(factor, "10.7X"))
- println(pr)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement