Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pattern Matching with Multiple Regex in Scala

Tags:

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...

like image 664
Vatsman Avatar asked Mar 01 '26 23:03

Vatsman


1 Answers

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.

like image 127
Sebastian Celestino Avatar answered Mar 04 '26 22:03

Sebastian Celestino



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!