handleEscapeSequence handles escape sequences in string literals
(buf *bytes.Buffer)
| 1134 | |
| 1135 | // handleEscapeSequence handles escape sequences in string literals |
| 1136 | func (t *Tokenizer) handleEscapeSequence(buf *bytes.Buffer) error { |
| 1137 | t.pos.Index++ |
| 1138 | t.pos.Column++ |
| 1139 | |
| 1140 | if t.pos.Index >= len(t.input) { |
| 1141 | return errors.IncompleteStatementError(t.getCurrentPosition(), string(t.input)) |
| 1142 | } |
| 1143 | |
| 1144 | r, size := utf8.DecodeRune(t.input[t.pos.Index:]) |
| 1145 | switch r { |
| 1146 | case '\\', '"', '\'', '`': |
| 1147 | buf.WriteRune(r) |
| 1148 | case 'n': |
| 1149 | buf.WriteRune('\n') |
| 1150 | case 'r': |
| 1151 | buf.WriteRune('\r') |
| 1152 | case 't': |
| 1153 | buf.WriteRune('\t') |
| 1154 | default: |
| 1155 | return errors.InvalidSyntaxError( |
| 1156 | fmt.Sprintf("invalid escape sequence '\\%c'", r), |
| 1157 | t.getCurrentPosition(), |
| 1158 | string(t.input), |
| 1159 | ) |
| 1160 | } |
| 1161 | |
| 1162 | t.pos.Index += size |
| 1163 | t.pos.Column++ |
| 1164 | return nil |
| 1165 | } |
| 1166 | |
| 1167 | // readNumber reads an integer/float |
| 1168 | func (t *Tokenizer) readNumber(buf []byte) (models.Token, error) { |
no test coverage detected