diff options
author | Georg Brandl <georg@python.org> | 2007-03-19 18:56:50 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2007-03-19 18:56:50 (GMT) |
commit | e66c8c7c127370ab7d0055f98053caad48cbc135 (patch) | |
tree | f1b0cd053c45a78dc652c833815ea47a4bc94e7d | |
parent | d16e81aabe5448a90640694d57cdaefddf3a1a9f (diff) | |
download | cpython-e66c8c7c127370ab7d0055f98053caad48cbc135.zip cpython-e66c8c7c127370ab7d0055f98053caad48cbc135.tar.gz cpython-e66c8c7c127370ab7d0055f98053caad48cbc135.tar.bz2 |
"from ... import x" should not be a syntax error... make
import_stmt accept ELLIPSes and DOTs.
-rw-r--r-- | Grammar/Grammar | 3 | ||||
-rw-r--r-- | Python/ast.c | 8 |
2 files changed, 8 insertions, 3 deletions
diff --git a/Grammar/Grammar b/Grammar/Grammar index e4cd3e0..41d8be8 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -55,7 +55,8 @@ yield_stmt: yield_expr raise_stmt: 'raise' [test [',' test [',' test]]] import_stmt: import_name | import_from import_name: 'import' dotted_as_names -import_from: ('from' ('.'* dotted_name | '.'+) +# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS +import_from: ('from' (('.' | '...')* dotted_name | ('.' | '...')+) 'import' ('*' | '(' import_as_names ')' | import_as_names)) import_as_name: NAME ['as' NAME] dotted_as_name: dotted_name ['as' NAME] diff --git a/Python/ast.c b/Python/ast.c index 8180b42..777c00e 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -2406,8 +2406,8 @@ ast_for_import_stmt(struct compiling *c, const node *n) /* import_stmt: import_name | import_from import_name: 'import' dotted_as_names - import_from: 'from' ('.'* dotted_name | '.') 'import' - ('*' | '(' import_as_names ')' | import_as_names) + import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+) + 'import' ('*' | '(' import_as_names ')' | import_as_names) */ int lineno; int col_offset; @@ -2445,6 +2445,10 @@ ast_for_import_stmt(struct compiling *c, const node *n) mod = alias_for_import_name(c, CHILD(n, idx)); idx++; break; + } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) { + /* three consecutive dots are tokenized as one ELLIPSIS */ + ndots += 3; + continue; } else if (TYPE(CHILD(n, idx)) != DOT) { break; } |