atom ::= '(' expr ')' | '[' expr ']' | 'options' | long | shorts | argument | command ;
(tokens, options)
| 402 | |
| 403 | |
| 404 | def parse_atom(tokens, options): |
| 405 | """atom ::= '(' expr ')' | '[' expr ']' | 'options' |
| 406 | | long | shorts | argument | command ; |
| 407 | """ |
| 408 | token = tokens.current() |
| 409 | result = [] |
| 410 | if token in '([': |
| 411 | tokens.move() |
| 412 | matching, pattern = {'(': [')', Required], '[': [']', Optional]}[token] |
| 413 | result = pattern(*parse_expr(tokens, options)) |
| 414 | if tokens.move() != matching: |
| 415 | raise tokens.error("unmatched '%s'" % token) |
| 416 | return [result] |
| 417 | elif token == 'options': |
| 418 | tokens.move() |
| 419 | return [AnyOptions()] |
| 420 | elif token.startswith('--') and token != '--': |
| 421 | return parse_long(tokens, options) |
| 422 | elif token.startswith('-') and token not in ('-', '--'): |
| 423 | return parse_shorts(tokens, options) |
| 424 | elif token.startswith('<') and token.endswith('>') or token.isupper(): |
| 425 | return [Argument(tokens.move())] |
| 426 | else: |
| 427 | return [Command(tokens.move())] |
| 428 | |
| 429 | |
| 430 | def parse_argv(tokens, options, options_first=False): |
no test coverage detected
searching dependent graphs…