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")
)进行 lex 时,结果总是Number(0.0)
而不是预期的Add(Number(1), Number(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
您提取的每个变量都需要一对括号。
推荐阅读
- c# - 内存泄漏:幕后究竟发生了什么?
- python - 如何使用包含城市或地区名称的文本找出国家代码?我需要此信息将电话号码格式化为 E.164 格式
- python - 读取不正确的json,解析示例
- terraform - 如何在terraform的另一个文件中引用在一个文件中创建的资源
- docker - 从 docker 容器中获取 runc config.json
- python - 如何在odoo 10中使用qweb报告调用不同模型的字段?
- angular - 角度 6 选择下拉菜单中的数据绑定问题
- php - 使用 {if} 表示性别的代码 - 需要添加更多
- python - 在 Python 中的函数内部调用时,函数可以定义实例变量吗?
- python - KeyError: tf.Tensor 'Placeholder_6:0' shape=
dtype=字符串