| 300 | } |
| 301 | |
| 302 | func parseSeq(tokens *tokenList, options *patternList) (patternList, error) { |
| 303 | // seq ::= ( atom [ '...' ] )* ; |
| 304 | result := patternList{} |
| 305 | for !tokens.current().match(true, "]", ")", "|") { |
| 306 | atom, err := parseAtom(tokens, options) |
| 307 | if err != nil { |
| 308 | return nil, err |
| 309 | } |
| 310 | if tokens.current().eq("...") { |
| 311 | atom = patternList{newOneOrMore(atom...)} |
| 312 | tokens.move() |
| 313 | } |
| 314 | result = append(result, atom...) |
| 315 | } |
| 316 | return result, nil |
| 317 | } |
| 318 | |
| 319 | func parseAtom(tokens *tokenList, options *patternList) (patternList, error) { |
| 320 | // atom ::= '(' expr ')' | '[' expr ']' | 'options' | long | shorts | argument | command ; |