---- parser ---- Parse parses the input string as an arithmetic expression. expr = num a literal number, e.g., 3.14159 | id a variable name, e.g., x | id '(' expr ',' ... ')' a function call | '-' expr a unary operator (+-) | e
(input string)
| 57 | // | expr '+' expr a binary operator (+-*/) |
| 58 | // |
| 59 | func Parse(input string) (_ Expr, err error) { |
| 60 | defer func() { |
| 61 | switch x := recover().(type) { |
| 62 | case nil: |
| 63 | // no panic |
| 64 | case lexPanic: |
| 65 | err = fmt.Errorf("%s", x) |
| 66 | default: |
| 67 | // unexpected panic: resume state of panic. |
| 68 | panic(x) |
| 69 | } |
| 70 | }() |
| 71 | lex := new(lexer) |
| 72 | lex.scan.Init(strings.NewReader(input)) |
| 73 | lex.scan.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanFloats |
| 74 | lex.next() // initial lookahead |
| 75 | e := parseExpr(lex) |
| 76 | if lex.token != scanner.EOF { |
| 77 | return nil, fmt.Errorf("unexpected %s", lex.describe()) |
| 78 | } |
| 79 | return e, nil |
| 80 | } |
| 81 | |
| 82 | func parseExpr(lex *lexer) Expr { return parseBinary(lex, 1) } |
| 83 |