Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package amyc
package parsing
import amyc.utils.Positioned
sealed trait Token extends Positioned with Product {
override def toString = {
productPrefix + productIterator.mkString("(", ",", ")") + "(" + position.withoutFile + ")"
}
}
object Tokens {
final case class KeywordToken(value: String) extends Token // e.g. keyword "if"
final case class IdentifierToken(name: String) extends Token // e.g. variable name "x"
final case class PrimTypeToken(value: String) extends Token // e.g. primitive type "Int"
final case class IntLitToken(value: Int) extends Token // e.g. integer literal "123"
final case class StringLitToken(value: String) extends Token
final case class BoolLitToken(value: Boolean) extends Token
final case class DelimiterToken(value: String) extends Token // .,:;(){}[]= and =>
final case class OperatorToken(name: String) extends Token // e.g. "+"
final case class CommentToken(text: String) extends Token // e.g. "// this is a comment"
final case class SpaceToken() extends Token // e.g. "\n "
final case class ErrorToken(content: String) extends Token
final case class EOFToken() extends Token // special token at the end of file
}
sealed abstract class TokenKind(representation: String) {
override def toString: String = representation
}
object TokenKinds {
final case class KeywordKind(value: String) extends TokenKind(value)
case object IdentifierKind extends TokenKind("<Identifier>")
case object PrimTypeKind extends TokenKind("<Primitive Type>")
case object LiteralKind extends TokenKind("<Literal>")
final case class DelimiterKind(value: String) extends TokenKind(value)
final case class OperatorKind(value: String) extends TokenKind(value)
case object EOFKind extends TokenKind("<EOF>")
case object NoKind extends TokenKind("<???>")
}
object TokenKind {
import Tokens._
import TokenKinds._
def of(token: Token): TokenKind = token match {
case KeywordToken(value) => KeywordKind(value)
case IdentifierToken(_) => IdentifierKind
case PrimTypeToken(_) => PrimTypeKind
case BoolLitToken(_) => LiteralKind
case IntLitToken(_) => LiteralKind
case StringLitToken(_) => LiteralKind
case DelimiterToken(value) => DelimiterKind(value)
case OperatorToken(value) => OperatorKind(value)
case EOFToken() => EOFKind
case _ => NoKind
}
}