Vatsman
Vatsman

Reputation: 33

Pattern Matching with Multiple Regex in Scala

I am attempting to make a lexer in Scala. I am attempting to do something like this

def lex(s: String): Expr = s match {
  case num(a)    => Number(a.toDouble)
  case mul(a, b) => Mul(Number(a.toDouble), Number(b.toDouble))
  case div(a, b) => Div(Number(a.toDouble), Number(b.toDouble))
  case add(a, b) => Add(Number(a.toDouble), Number(b.toDouble))
  case sub(a, b) => Sub(Number(a.toDouble), Number(b.toDouble))
  case   _       => Number(0)
}

where num, mul, div, add, sub are defined as so:

val num: Regex = "[0-9]+".r
val add: Regex = "[0-9]+\\s*\\+\\s*[0-9]+".r
val sub: Regex = "[0-9]+\\s*\\-\\s*[0-9]+".r
val div: Regex = "[0-9]+\\s*\\/\\s*[0-9]+".r
val mul: Regex = "[0-9]+\\s*\\*\\s*[0-9]+".r

When attempting to lex any expression (lex("1 + 2")) the result is always Number(0.0) instead of the expected Add(Number(1), Number(2)) Im not sure where it's going wrong...

Upvotes: 3

Views: 1621

Answers (1)

Sebastian Celestino
Sebastian Celestino

Reputation: 1428

You need to specify which groups you want to extract.

val num = "([0-9]+)".r
val add = "([0-9]+)\\s*\\+\\s*([0-9]+)".r
val sub = "([0-9]+)\\s*\\-\\s*([0-9]+)".r
val div = "([0-9]+)\\s*\\/\\s*([0-9]+)".r
val mul = "([0-9]+)\\s*\\*\\s*([0-9]+)".r

You need one pair of parentheses per variable you extract.

Upvotes: 4

Related Questions