(err error)
| 367 | } |
| 368 | |
| 369 | func (p *Parser) wrapError(err error) error { |
| 370 | if err == nil { |
| 371 | return nil |
| 372 | } |
| 373 | |
| 374 | lineNo := 0 |
| 375 | column := 0 |
| 376 | |
| 377 | for i := 0; i < int(p.Pos()); i++ { |
| 378 | if p.lexer.input[i] == '\n' { |
| 379 | lineNo++ |
| 380 | column = 0 |
| 381 | } else { |
| 382 | column++ |
| 383 | } |
| 384 | } |
| 385 | |
| 386 | lines := strings.Split(p.lexer.input, "\n") |
| 387 | var buf strings.Builder |
| 388 | buf.WriteString(fmt.Sprintf("line %d:%d %s\n", lineNo, column, err.Error())) |
| 389 | for i, line := range lines { |
| 390 | if i == lineNo { |
| 391 | buf.WriteString(line) |
| 392 | buf.WriteByte('\n') |
| 393 | for j := 0; j < column; j++ { |
| 394 | buf.WriteByte(' ') |
| 395 | } |
| 396 | if p.last() != nil { |
| 397 | buf.WriteString(strings.Repeat("^", len(p.last().String))) |
| 398 | } else { |
| 399 | buf.WriteString("^") |
| 400 | } |
| 401 | buf.WriteByte('\n') |
| 402 | } |
| 403 | } |
| 404 | return errors.New(buf.String()) |
| 405 | } |
| 406 | |
| 407 | func (p *Parser) parseRatioExpr(pos Pos) (*RatioExpr, error) { |
| 408 | numerator, err := p.parseNumber(pos) |
no test coverage detected