parsing - 通用匹配Token的有效实现

标签 parsing scala case-class traits

这是我在我的小型解析器应用程序中使用的基本特征:

trait Token[ValueType] {
    def value: ValueType
}

这就是我所需要的。我还想将 Java 的良好特性与 Scala 的良好特性结合起来,即:

  • Java 枚举方法(它们是具有方法的普通对象,可以进行迭代等)
  • Scala 支持匹配(可读代码)

扩展 Token 的类示例如下:

// this to emulate Java enums; ProperEnumeration just adds some simple methods like fromChars etc.
object Keywords extends ProperEnumeration {
    val AND, ARRAY, BEGIN, CASE, CONST, ... = Value
}

// this to enable matching
final case class Keyword(keyword: Keywords.Value) extends Token[Keywords.Value] {
    def this(string: String) = this(Keywords.fromString(string))   
    def value = keyword
}

object SpecialSymbols extends ProperEnumeration {
    val LEFT_BRACE = Value("{")
    val RIGHT_BRACE = Value("}")
    ...
}

final case class SpecialSymbol(symbol: SpecialSymbols.Value) extends Token[SpecialSymbols.Value]     {
    def this(symbol: String) = this(SpecialSymbols.fromString(symbol))
    def value = symbol
}

// there are also non-enum subclasses of Token
case class Identifier(identifier: String) extends Token[String] {
    override def value: String = identifier
}

这是我想到的最好的。我可以这样使用它:

token match {
    case Keyword(Keywords.BEGIN) => ...
    case SpecialSymbol(SpecialSymbols.LEFT_BRACE) => ...
    case Identifier(name) => ...
}

我想修改它以使其更加简洁,我想要这样的内容:

token match {
        case Keyword.BEGIN => ... // or Keyword(BEGIN)
        case SpecialSymbol.LEFT_BRACE => ...
        case Identifier(name) => ...
    }

还支持名为 consume 的方法,该方法可以与任何类型的 Token 子类一起使用(如果下一个 token ,consume 应该抛出异常from source 不是提供的参数)。

consume(Keyword.BEGIN);
consume(SpecialSymbol.LEFT_BRACE);
consume(Identifier(name));

我希望代码干净,这就是我首先使用 Scala 的原因。因此,我希望没有函数重载来允许轻松添加 Trait 子类。

那么,亲爱的Scalists,该怎么办?

最佳答案

最简单的方法

case Keyword(BEGIN) => ...

只是简单地导入关键字:

import Keywords._

它不需要对您的代码进行任何其他更改。

关于parsing - 通用匹配Token的有效实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19912565/

相关文章:

python - 解析具有间隔的整数集字符串以列出

java - 如何获取A时间和B时间之间的差距?

scala - Gatling - 根据请求更改馈线中使用的 SSL 证书?

scala - Play Framework 路由中的非捕获通配符

scala - 如何在案例类同伴中覆盖 apply

node.js - 如何在 nodejs/express 中上传和解析大型 csv 文件?

python - 如何导入预定义的决策树并将其用于分类

scala - 后续/嵌套模式匹配

scala - 抽象案例类

scala - 如何在 Scala 中获取与类参数同名的字段?