我正在写一个简单的解析器是Scala。
我有一个基本特征,它代表文件中的一个元素。
trait Token[T] {
def stringValue: String
def value: T
}
这就是我需要的 - 字符串(文本)值和解析值(有时会是相同的字符串)。现在我想要一组子类:
- 保留符号/关键字,例如
class
等void
。 - 特殊符号,例如
+
等/
。 - 整数字面量,例如 123
- 真正的文字,例如 1.23
- 字符串文字,例如'123'
你将如何实现这样的层次结构?由于这是有限的,因此使用案例类会很好。我认为。但是枚举也很棒..如何组合?
换句话说,在 Scala 中以更 Scal-ish 的方式编写这个(下)的最佳方法是什么?
public interface Token<T> {
String stringValue();
T value();
}
public enum ReservedSymbol implements Token<ReservedSymbol> {
CLASS('class'), VOID('void');
private String val;
private ReservedSymbol(String val) { this.val = val; }
public String stringValue() { return val; }
public ReservedSymbol value() { return this; }
}
public class IntegerLiteral implements Token<Integer> {
private Integer val;
public IntegerLiteral(String val) { this.val = Integer.valueOf(val); }
public String stringValue() { return val.toString(); }
public Integer value() { return val; }
}
等等