token.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. func (p Position) String() string {
  12. return fmt.Sprintf("%s:%d:%d", p.FileName, p.Line, p.Column)
  13. }
  14. /* Token Kind. Uses a rune to easily handle single character tokens. */
  15. type TokenKind rune
  16. const (
  17. TokenKindNone = TokenKind(0)
  18. TokenKindInteger = TokenKind('i')
  19. TokenKindFloat = TokenKind('f')
  20. TokenKindString = TokenKind('s')
  21. TokenKindSymbol = TokenKind('S')
  22. TokenKindBoolean = TokenKind('b')
  23. TokenKindNil = TokenKind('N')
  24. TokenKindWord = TokenKind('w')
  25. TokenKindType = TokenKind('t')
  26. TokenKindOperator = TokenKind('+')
  27. TokenKindSelector = TokenKind(',')
  28. TokenKindGet = TokenKind('$')
  29. TokenKindSet = TokenKind('=')
  30. TokenKindOpenBlock = TokenKind('{')
  31. TokenKindCloseBlock = TokenKind('}')
  32. TokenKindOpenList = TokenKind('[')
  33. TokenKindCloseList = TokenKind(']')
  34. TokenKindOpenParen = TokenKind('(')
  35. TokenKindCloseParen = TokenKind(')')
  36. TokenKindError = TokenKind('!')
  37. TokenKindEOX = TokenKind('\n')
  38. TokenKindEOF = TokenKind(0x255)
  39. )
  40. /* Names of the different token types. */
  41. var TokenKindNames map[TokenKind]string = map[TokenKind]string{
  42. TokenKindNone: "None",
  43. TokenKindInteger: "Integer",
  44. TokenKindFloat: "Float",
  45. TokenKindSymbol: "Symbol",
  46. TokenKindString: "String",
  47. TokenKindBoolean: "Boolean",
  48. TokenKindNil: "Nil",
  49. TokenKindWord: "Word",
  50. TokenKindType: "Type",
  51. TokenKindOperator: "Operator",
  52. TokenKindSelector: "Selector",
  53. TokenKindGet: "Get",
  54. TokenKindSet: "Set",
  55. TokenKindOpenBlock: "OpenBlock",
  56. TokenKindCloseBlock: "CloseBlock",
  57. TokenKindOpenList: "OpenList",
  58. TokenKindCloseList: "CloseList",
  59. TokenKindOpenParen: "OpenParen",
  60. TokenKindCloseParen: "CloseParen",
  61. TokenKindError: "Error",
  62. TokenKindEOX: "EOX",
  63. TokenKindEOF: "EOF",
  64. }
  65. /* Reverse map of the names of the different token types. */
  66. var NamesTokenKind map[string] TokenKind = map[string]TokenKind{}
  67. func init () {
  68. for k, v := range TokenKindNames {
  69. NamesTokenKind[v] = k
  70. }
  71. }
  72. /* Transforms a token kind to a String */
  73. func (kind TokenKind) String() string {
  74. name, ok := TokenKindNames[kind]
  75. if !ok {
  76. return "Unknown TokenKind!"
  77. }
  78. return name
  79. }
  80. type Token struct {
  81. TokenKind
  82. Value
  83. Position
  84. }
  85. func (token Token) String() string {
  86. if token.Value == nil {
  87. return fmt.Sprintf("%s:%s:nil", token.Position.String(), token.TokenKind.String())
  88. }
  89. return fmt.Sprintf("%s:%s:%v", token.Position.String(), token.TokenKind.String(), token.Value)
  90. }
  91. func (token Token) Error() string {
  92. if token.TokenKind == TokenKindError {
  93. return token.Value.String()
  94. }
  95. return "No error"
  96. }
  97. /* Returns whether or not the token is the last to be expected,
  98. * that is either an error or EOF. */
  99. func (token Token) IsLast() bool {
  100. switch token.TokenKind {
  101. case TokenKindError, TokenKindEOF, TokenKindNone:
  102. return true
  103. default:
  104. return false
  105. }
  106. }
  107. /* Creates a new token. */
  108. func NewToken(kind TokenKind, val Value, pos Position) Token {
  109. return Token{kind, val, pos}
  110. }
  111. /* Creates a token with type TokenTypeNone */
  112. func NoToken() Token {
  113. return NewToken(TokenKindNone, NilValue, Position{})
  114. }
  115. func (token Token) IsNone() bool {
  116. return token.TokenKind == TokenKindNone
  117. }
  118. func (token Token) IsError() bool {
  119. return token.TokenKind == TokenKindError
  120. }