(pos Pos)
| 261 | } |
| 262 | |
| 263 | func (p *Parser) parseNumber(pos Pos) (*NumberLiteral, error) { |
| 264 | var err error |
| 265 | |
| 266 | lastToken := p.last() |
| 267 | switch { |
| 268 | case p.matchTokenKind(TokenKindInt): |
| 269 | err = p.expectTokenKind(TokenKindInt) |
| 270 | case p.matchTokenKind(TokenKindFloat): |
| 271 | err = p.expectTokenKind(TokenKindFloat) |
| 272 | case p.matchTokenKind(TokenKindDot): |
| 273 | _ = p.lexer.consumeToken() |
| 274 | lastToken = p.last() |
| 275 | if err := p.expectTokenKind(TokenKindInt); err != nil { |
| 276 | return nil, err |
| 277 | } |
| 278 | if lastToken.Base != 10 { |
| 279 | return nil, fmt.Errorf("invalid decimal literal: %q", lastToken.String) |
| 280 | } |
| 281 | lastToken.String = "." + lastToken.String |
| 282 | lastToken.Kind = TokenKindFloat |
| 283 | default: |
| 284 | return nil, fmt.Errorf("expected <int> or <float>, but got %q", p.lastTokenKind()) |
| 285 | } |
| 286 | if err != nil { |
| 287 | return nil, err |
| 288 | } |
| 289 | number := &NumberLiteral{ |
| 290 | NumPos: pos, |
| 291 | NumEnd: lastToken.End, |
| 292 | Literal: lastToken.String, |
| 293 | Base: lastToken.Base, |
| 294 | } |
| 295 | return number, nil |
| 296 | } |
| 297 | |
| 298 | func (p *Parser) parseString(pos Pos) (*StringLiteral, error) { |
| 299 | lastToken := p.last() |
no test coverage detected