token.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package muesli
  2. import (
  3. "fmt"
  4. )
  5. /* Position of a token in an input stream */
  6. type Position struct {
  7. FileName string
  8. Line int
  9. Column int
  10. }
  11. /* Token Kind. Uses a rune to easily handle single character tokens. */
  12. type TokenKind rune
  13. const (
  14. TokenKindNone = TokenKind(0)
  15. TokenKindInteger = TokenKind('i')
  16. TokenKindFloat = TokenKind('f')
  17. TokenKindString = TokenKind('s')
  18. TokenKindSymbol = TokenKind('S')
  19. TokenKindBoolean = TokenKind('b')
  20. TokenKindWord = TokenKind('w')
  21. TokenKindType = TokenKind('t')
  22. TokenKindGet = TokenKind('$')
  23. TokenKindSet = TokenKind('=')
  24. TokenKindOpenBlock = TokenKind('{')
  25. TokenKindCloseBlock = TokenKind('}')
  26. TokenKindOpenList = TokenKind('[')
  27. TokenKindCloseList = TokenKind(']')
  28. TokenKindOpenParen = TokenKind('(')
  29. TokenKindCloseParen = TokenKind(')')
  30. TokenKindError = TokenKind('!')
  31. TokenKindEOX = TokenKind('\n')
  32. TokenKindEOF = TokenKind(0x255)
  33. )
  34. /* Names of the different token types. */
  35. var TokenKindNames map[TokenKind]string = map[TokenKind]string{
  36. TokenKindNone: "None",
  37. TokenKindInteger: "Integer",
  38. TokenKindFloat: "Float",
  39. TokenKindSymbol: "Symbol",
  40. TokenKindString: "String",
  41. TokenKindBoolean: "Boolean",
  42. TokenKindWord: "Word",
  43. TokenKindType: "Type",
  44. TokenKindGet: "Get",
  45. TokenKindSet: "Set",
  46. TokenKindOpenBlock: "OpenBlock",
  47. TokenKindCloseBlock: "CloseBlock",
  48. TokenKindOpenList: "OpenList",
  49. TokenKindCloseList: "CloseList",
  50. TokenKindOpenParen: "OpenParen",
  51. TokenKindCloseParen: "CloseParen",
  52. TokenKindError: "Error",
  53. TokenKindEOX: "EOX",
  54. TokenKindEOF: "EOF",
  55. }
  56. /* Transforms a token kid to a String */
  57. func (kind TokenKind) String() string {
  58. name, ok := TokenKindNames[kind]
  59. if !ok {
  60. return "Unknown TokenKind!"
  61. }
  62. return name
  63. }
  64. type Token struct {
  65. TokenKind
  66. Value
  67. Position
  68. }
  69. func (token Token) String() string {
  70. if token.Value == nil {
  71. return fmt.Sprintf("<%s:nil:%v>", token.TokenKind.String(), token.Position)
  72. }
  73. return fmt.Sprintf("<%s:%q:%v>", token.TokenKind.String(),
  74. token.Value.String(), token.Position)
  75. }
  76. func (token Token) Error() string {
  77. if token.TokenKind == TokenKindError {
  78. return token.Value.String()
  79. }
  80. return "No error"
  81. }
  82. /* Returns whether or not the token is the last to be expected,
  83. * that is either an error or EOF. */
  84. func (token Token) IsLast() bool {
  85. switch token.TokenKind {
  86. case TokenKindError, TokenKindEOF, TokenKindNone:
  87. return true
  88. default:
  89. return false
  90. }
  91. }
  92. /* Creates a new token. */
  93. func NewToken(kind TokenKind, val Value, pos Position) Token {
  94. return Token{kind, val, pos}
  95. }
  96. /* Creates a token with type TokenTypeNone */
  97. func NoToken() Token {
  98. return NewToken(TokenKindNone, NilValue, Position{})
  99. }
  100. func (token Token) IsNone() bool {
  101. return token.TokenKind == TokenKindNone
  102. }