| 267 | } |
| 268 | |
| 269 | func parseExpr(tokens *tokenList, options *patternList) (patternList, error) { |
| 270 | // expr ::= seq ( '|' seq )* ; |
| 271 | seq, err := parseSeq(tokens, options) |
| 272 | if err != nil { |
| 273 | return nil, err |
| 274 | } |
| 275 | if !tokens.current().eq("|") { |
| 276 | return seq, nil |
| 277 | } |
| 278 | var result patternList |
| 279 | if len(seq) > 1 { |
| 280 | result = patternList{newRequired(seq...)} |
| 281 | } else { |
| 282 | result = seq |
| 283 | } |
| 284 | for tokens.current().eq("|") { |
| 285 | tokens.move() |
| 286 | seq, err = parseSeq(tokens, options) |
| 287 | if err != nil { |
| 288 | return nil, err |
| 289 | } |
| 290 | if len(seq) > 1 { |
| 291 | result = append(result, newRequired(seq...)) |
| 292 | } else { |
| 293 | result = append(result, seq...) |
| 294 | } |
| 295 | } |
| 296 | if len(result) > 1 { |
| 297 | return patternList{newEither(result...)}, nil |
| 298 | } |
| 299 | return result, nil |
| 300 | } |
| 301 | |
| 302 | func parseSeq(tokens *tokenList, options *patternList) (patternList, error) { |
| 303 | // seq ::= ( atom [ '...' ] )* ; |