Я пишу простой парсер Scala.Scala enum extend trait
У меня есть базовый признак, который представляет элемент в файле.
trait Token[T] {
def stringValue: String
def value: T
}
Это то, что мне нужно - строковое значение (текст) и разобранное значение (которое иногда выйдет той же строки). Теперь я хочу иметь набор подклассов для:
- зарезервированные символы/ключевые слова, например.
class
,void
и т.д. - специальные символы, например.
+
,/
и т.д. - целые литералы, например. 123
- настоящие литералы, например. 1.23
- строковые литералы, например. '123'
Как реализовать такую иерархию? Поскольку это конечно, было бы неплохо использовать класс case. Думаю. Но перечисление тоже было бы здорово. Как совместить?
Другими словами, что это лучший способ, чтобы написать это (ниже) в 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; }
}
т.д.
Спасибо. Но подумайте о моей ситуации - что бы вы сделали, пытаясь смоделировать иерархию токенов? Будет ок. 50 ключевых слов и т. Д. Я бы также хотел, чтобы под иерархии, такие как Int extends Number, Number, расширяет токены и т. Д. –
См. Вышеизложенное. Под иерархии являются внутренними узлами в дереве типов, и поэтому вы должны моделировать их как признаки. –
Это хорошо. Что вы думаете об этом коде: http://ideone.com/uIdHxj, что я работал над тем временем? –