私は簡単なパーサーを書いていますが、Scala です。
ファイル内の要素を表す基本特性があります。
trait Token[T] {
def stringValue: String
def value: T
}
これが私が必要とするものです - 文字列 (テキスト) 値と解析された値 (同じ文字列になることがあります)。ここで、次のサブクラスのセットが必要です。
- 予約済みの記号/キーワード
class
などvoid
- など
+
の特殊記号/
- 123 などの整数リテラル
- 1.23 などの実数リテラル
- '123'などの文字列リテラル
このような階層をどのように実装しますか? これは有限なので、ケースクラスを使用するといいでしょう..と思います。しかし、列挙も素晴らしいでしょう..どのように組み合わせるのですか?
言い換えれば、これ (以下) を Scala でもっと Scal っぽい方法で書くにはどうすればよいでしょうか?
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; }
}
等