token.go 2.7 KB

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