On Tue, Nov 12, 2013 at 5:08 PM, Benjamin Peterson <benja...@python.org> wrote: > 2013/11/12 anatoly techtonik <techto...@gmail.com>: >> On Sun, Nov 10, 2013 at 8:34 AM, Benjamin Peterson <benja...@python.org> >> wrote: >>> 2013/11/10 anatoly techtonik <techto...@gmail.com>: >>>> http://hg.python.org/cpython/file/1ee45eb6aab9/Parser/Python.asdl >>>> >>>> In Assign(expr* targets, expr value), why the first argument is a list? >>> >>> x = y = 42 >> >> Thanks. >> >> Speaking of this ASDL. `expr* targets` means that multiple entities of >> `expr` under the name 'targets' can be passed to Assign statement. >> Assign uses them as left value. But `expr` definition contains things >> that can not be used as left side assignment targets: >> >> expr = BoolOp(boolop op, expr* values) >> | BinOp(expr left, operator op, expr right) >> ... >> | Str(string s) -- need to specify raw, unicode, etc? >> | Bytes(bytes s) >> | NameConstant(singleton value) >> | Ellipsis >> >> -- the following expression can appear in assignment context >> | Attribute(expr value, identifier attr, expr_context ctx) >> | Subscript(expr value, slice slice, expr_context ctx) >> | Starred(expr value, expr_context ctx) >> | Name(identifier id, expr_context ctx) >> | List(expr* elts, expr_context ctx) >> | Tuple(expr* elts, expr_context ctx) >> >> If I understand correctly, this is compiled into C struct definitions >> (Python-ast.c), and there is a code to traverse the structure, but >> where is code that validates that the structure is correct? Is it done >> on the first level - text file parsing, before ASDL is built? If so, >> then what is the role of this ADSL exactly that the first step is >> unable to solve? > > Only valid expression targets are allowed during AST construction. See > set_expr_context in ast.c.
Oh my. Now there is also CST in addition to AST. This stuff - http://docs.python.org/devguide/ - badly needs diagrams about data transformation toolchain from Python source code to machine execution instructions. I'd like some pretty stuff, but raw blogdiag hack will do the job http://blockdiag.com/en/blockdiag/index.html There is no set_expr_context in my copy of CPython code, which seems to be some alpha of Python 3.4 >> Is it possible to fix ADSL to move `expr` that are allowed in Assign >> into `expr` subset? What effect will it achieve? I mean - will ADSL >> compiler complain about wrong stuff on the left side, or it will still >> be a role of some other component. Which one? > > I'm not sure what you mean by an `expr` subset. Transform this: expr = BoolOp(boolop op, expr* values) | BinOp(expr left, operator op, expr right) ... | Str(string s) -- need to specify raw, unicode, etc? | Bytes(bytes s) | NameConstant(singleton value) | Ellipsis -- the following expression can appear in assignment context | Attribute(expr value, identifier attr, expr_context ctx) | Subscript(expr value, slice slice, expr_context ctx) | Starred(expr value, expr_context ctx) | Name(identifier id, expr_context ctx) | List(expr* elts, expr_context ctx) | Tuple(expr* elts, expr_context ctx) to this: expr = BoolOp(boolop op, expr* values) | BinOp(expr left, operator op, expr right) ... | Str(string s) -- need to specify raw, unicode, etc? | Bytes(bytes s) | NameConstant(singleton value) | Ellipsis -- the following expression can appear in assignment context | expr_asgn expr_asgn = Attribute(expr value, identifier attr, expr_context ctx) | Subscript(expr value, slice slice, expr_context ctx) | Starred(expr value, expr_context ctx) | Name(identifier id, expr_context ctx) | List(expr* elts, expr_context ctx) | Tuple(expr* elts, expr_context ctx) _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com