这是我在我的小型解析器应用程序中使用的基本特征:
trait Token[ValueType] {
def value: ValueType
}
这就是我的要求。我还想将 Java 的一个很好的特性与 Scala 的一个很好的特性结合起来,即:
- 枚举的 Java 方法(它们是带有方法的普通对象,可以 ihnerit 等)
- 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
子类一起使用的方法(consume
如果来自源的下一个标记不是提供的参数,则应该抛出异常)。
consume(Keyword.BEGIN);
consume(SpecialSymbol.LEFT_BRACE);
consume(Identifier(name));
我希望代码干净,这就是我首先使用 Scala 的原因。所以我希望没有函数重载可以轻松添加Trait
子类。
那么,亲爱的 Scalaists,该怎么办?