()
| 51 | } |
| 52 | |
| 53 | func (s *Scanner) scan() (tok Token, pos Pos, lit string) { |
| 54 | // Read next code point. |
| 55 | ch0, pos := s.r.read() |
| 56 | |
| 57 | // If we see whitespace then consume all contiguous whitespace. |
| 58 | // If we see a letter, or certain acceptable special characters, then consume |
| 59 | // as an ident or reserved word. |
| 60 | if isWhitespace(ch0) { |
| 61 | return s.scanWhitespace() |
| 62 | } else if isLetter(ch0) || ch0 == '_' { |
| 63 | s.r.unread() |
| 64 | return s.scanIdent() |
| 65 | } else if isDigit(ch0) { |
| 66 | return s.scanNumber() |
| 67 | } |
| 68 | |
| 69 | // Otherwise parse individual characters. |
| 70 | switch ch0 { |
| 71 | case eof: |
| 72 | return EOF, pos, "" |
| 73 | case '`': |
| 74 | s.r.unread() |
| 75 | return s.scanIdent() |
| 76 | case '"': |
| 77 | return s.scanString() |
| 78 | case '\'': |
| 79 | return s.scanString() |
| 80 | case '.': |
| 81 | ch1, _ := s.r.read() |
| 82 | s.r.unread() |
| 83 | if isDigit(ch1) { |
| 84 | return s.scanNumber() |
| 85 | } |
| 86 | return DOT, pos, "" |
| 87 | case '+', '-': |
| 88 | if (s.lastNonWSToken > literal_beg && s.lastNonWSToken < literal_end) || s.lastNonWSToken == RPAREN { |
| 89 | if ch0 == '+' { |
| 90 | return ADD, pos, "" |
| 91 | } |
| 92 | return SUB, pos, "" |
| 93 | } |
| 94 | return s.scanNumber() |
| 95 | case '*': |
| 96 | return MUL, pos, "" |
| 97 | case '/': |
| 98 | return DIV, pos, "" |
| 99 | case '%': |
| 100 | return MOD, pos, "" |
| 101 | case '=': |
| 102 | return EQ, pos, "" |
| 103 | case '~': |
| 104 | return BITWISE_NOT, pos, "" |
| 105 | case '|': |
| 106 | return BITWISE_OR, pos, "" |
| 107 | case '&': |
| 108 | return BITWISE_AND, pos, "" |
| 109 | case '^': |
| 110 | return BITWISE_XOR, pos, "" |
no test coverage detected