scala - Scala 中多个正则表达式的模式匹配

标签 scala

我正在尝试在 Scala 中制作词法分析器。 我正在尝试做这样的事情

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)
}

其中 num、mul、div、add、sub 定义如下:

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

当尝试对任何表达式 (lex("1 + 2")) 进行词法分析时,结果总是 Number(0.0) 而不是预期的 Add(数字(1), 数字(2)) 我不确定哪里出了问题...

最佳答案

您需要指定要提取的组。

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

每个提取的变量都需要一对括号。

关于scala - Scala 中多个正则表达式的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52895883/

相关文章:

scala - Kotlin VS Scala : Implement methods with primary constructor parameters

java - 如何使用分类器访问 jar?

sockets - 每个套接字连接使用一个 actor 的 Scala 方法

scala - scala 2.8 中的隐式转换问题

java - IntelliJ Idea (scala) 更改语法错误的颜色设置

java - 如何在 Scala 中将案例类转换为 Json-LD?

scala - 如果 Scala 中的对象名称为 "main method should be static",为什么会出现 "Statistic"

scala - 开源精心设计的 play-scala-slick 应用程序

scala - 将 Spark Dataframes 的每一行转换为一个字符串,在 scala 中的每个列值之间有一个分隔符

python - scala:将元组引用传递给函数