这是我在我的小型解析器应用程序中使用的基本特征:
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/