[Python-Dev] Python Grammar Ambiguity (original) (raw)

Michael Foord fuzzyman at voidspace.org.uk
Mon Apr 24 19:23:50 CEST 2006


skip at pobox.com wrote:

Michael> I've hit on what looks like a fundamental ambiguity in the Michael> Python grammar which is difficult to get round with PLY; and Michael> I'm wondering why the grammar is defined in this way.

Michael, You refer to the ref manual documentation: Michael> List displays (list comprehensions) are defined as (from Michael> http://docs.python.org/ref/lists.html ) Note that the BNF there is mostly designed for human consumption. Have you verified that the ambiguity is also present in the Grammar file? From :

http://svn.python.org/view/python/tags/r243/Grammar/Grammar?rev=43414&view=auto

list_for: 'for' exprlist 'in' testlist_safe [list_iter]

So in the Python grammar list_for is defined as an expression list. That follows, because using the parser module I can create an ast for a list comprehension like the following :

import parser expr = '[1 for 1 in n]\n' ast = parser.expr(expr) print parser.compileast(ast)

Traceback (most recent call last): File "ast_example.py", line 6, in ? print parser.compileast(ast) SyntaxError: can't assign to literal

The syntax error is thrown at the compile stage, not the parse stage. Having list_for being defined in terms of something like varlist makes more sense, but isn't how the grammar is done currently.

Michael Foord

Skip



More information about the Python-Dev mailing list