token.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. TokenKindInteger = TokenKind('i')
  15. TokenKindFloat = TokenKind('f')
  16. TokenKindString = TokenKind('s')
  17. TokenKindSymbol = TokenKind('S')
  18. TokenKindBoolean = TokenKind('b')
  19. TokenKindWord = TokenKind('w')
  20. TokenKindType = TokenKind('t')
  21. TokenKindGet = TokenKind('$')
  22. TokenKindSet = TokenKind('=')
  23. TokenKindOpenBlock = TokenKind('{')
  24. TokenKindCloseBlock = TokenKind('}')
  25. TokenKindOpenList = TokenKind('[')
  26. TokenKindCloseList = TokenKind(']')
  27. TokenKindOpenParen = TokenKind('(')
  28. TokenKindCloseParen = TokenKind(')')
  29. TokenKindError = TokenKind('!')
  30. TokenKindEOX = TokenKind('\n')
  31. TokenKindEOF = TokenKind(0x255)
  32. )
  33. /* Names of the different token types. */
  34. var TokenKindNames map[TokenKind]string = map[TokenKind]string{
  35. TokenKindInteger: "Integer",
  36. TokenKindFloat: "Float",
  37. TokenKindSymbol: "Symbol",
  38. TokenKindString: "String",
  39. TokenKindBoolean: "Boolean",
  40. TokenKindWord: "Word",
  41. TokenKindType: "Type",
  42. TokenKindGet: "Get",
  43. TokenKindSet: "Set",
  44. TokenKindOpenBlock: "OpenBlock",
  45. TokenKindCloseBlock: "CloseBlock",
  46. TokenKindOpenList: "OpenList",
  47. TokenKindCloseList: "CloseList",
  48. TokenKindOpenParen: "OpenParen",
  49. TokenKindCloseParen: "CloseParen",
  50. TokenKindError: "Error",
  51. TokenKindEOX: "EOX",
  52. TokenKindEOF: "EOF",
  53. }
  54. /* Transforms a token kid to a String */
  55. func (kind TokenKind) String() string {
  56. name, ok := TokenKindNames[kind]
  57. if !ok {
  58. return "Unknown TokenKind!"
  59. }
  60. return name
  61. }
  62. type Token struct {
  63. TokenKind
  64. Value
  65. Position
  66. }
  67. func (token Token) String() string {
  68. if token.Value == nil {
  69. return fmt.Sprintf("<%s:nil:%v>", token.TokenKind.String(), token.Position)
  70. }
  71. return fmt.Sprintf("<%s:%q:%v>", token.TokenKind.String(),
  72. token.Value.String(), token.Position)
  73. }
  74. func (token Token) Error() string {
  75. if token.TokenKind == TokenKindError {
  76. return token.Value.String()
  77. }
  78. return "No error"
  79. }
  80. /* Returns whether or not the token is the last to be expected,
  81. * that is either an error or EOF. */
  82. func (token Token) IsLast() bool {
  83. switch token.TokenKind {
  84. case TokenKindError:
  85. return true
  86. case TokenKindEOF:
  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. }