| 25105 | } |
| 25106 | |
| 25107 | func (p *parser) parse(g *grammar) (val any, err error) { |
| 25108 | if len(g.rules) == 0 { |
| 25109 | p.addErr(errNoRule) |
| 25110 | return nil, p.errs.err() |
| 25111 | } |
| 25112 | |
| 25113 | // TODO : not super critical but this could be generated |
| 25114 | p.buildRulesTable(g) |
| 25115 | |
| 25116 | if p.recover { |
| 25117 | // panic can be used in action code to stop parsing immediately |
| 25118 | // and return the panic as an error. |
| 25119 | defer func() { |
| 25120 | if e := recover(); e != nil { |
| 25121 | if p.debug { |
| 25122 | defer p.out(p.in("panic handler")) |
| 25123 | } |
| 25124 | val = nil |
| 25125 | switch e := e.(type) { |
| 25126 | case error: |
| 25127 | p.addErr(e) |
| 25128 | default: |
| 25129 | p.addErr(fmt.Errorf("%v", e)) |
| 25130 | } |
| 25131 | err = p.errs.err() |
| 25132 | } |
| 25133 | }() |
| 25134 | } |
| 25135 | |
| 25136 | startRule, ok := p.rules[p.entrypoint] |
| 25137 | if !ok { |
| 25138 | p.addErr(errInvalidEntrypoint) |
| 25139 | return nil, p.errs.err() |
| 25140 | } |
| 25141 | |
| 25142 | p.read() // advance to first rune |
| 25143 | val, ok = p.parseRuleWrap(startRule) |
| 25144 | if !ok { |
| 25145 | if len(*p.errs) == 0 { |
| 25146 | // If parsing fails, but no errors have been recorded, the expected values |
| 25147 | // for the farthest parser position are returned as error. |
| 25148 | maxFailExpectedMap := make(map[string]struct{}, len(p.maxFailExpected)) |
| 25149 | for _, v := range p.maxFailExpected { |
| 25150 | maxFailExpectedMap[v] = struct{}{} |
| 25151 | } |
| 25152 | expected := make([]string, 0, len(maxFailExpectedMap)) |
| 25153 | eof := false |
| 25154 | if _, ok := maxFailExpectedMap["!."]; ok { |
| 25155 | delete(maxFailExpectedMap, "!.") |
| 25156 | eof = true |
| 25157 | } |
| 25158 | for k := range maxFailExpectedMap { |
| 25159 | expected = append(expected, k) |
| 25160 | } |
| 25161 | sort.Strings(expected) |
| 25162 | if eof { |
| 25163 | expected = append(expected, "EOF") |
| 25164 | } |