From: <fwi...@us...> - 2008-08-20 20:59:47
|
Revision: 5226 http://jython.svn.sourceforge.net/jython/?rev=5226&view=rev Author: fwierzbicki Date: 2008-08-20 20:59:44 +0000 (Wed, 20 Aug 2008) Log Message: ----------- gen expressions and list comps now actually work... Modified Paths: -------------- branches/nowalker/grammar/Python.g Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-20 20:57:09 UTC (rev 5225) +++ branches/nowalker/grammar/Python.g 2008-08-20 20:59:44 UTC (rev 5226) @@ -78,7 +78,6 @@ PYNODE; Interactive; Expression; - GeneratorExp; } @header { @@ -116,6 +115,7 @@ import org.python.antlr.ast.ExtSlice; import org.python.antlr.ast.For; import org.python.antlr.ast.FunctionDef; +import org.python.antlr.ast.GeneratorExp; import org.python.antlr.ast.Global; import org.python.antlr.ast.If; import org.python.antlr.ast.IfExp; @@ -1026,14 +1026,24 @@ //testlist_gexp: test ( gen_for | (',' test)* [','] ) testlist_gexp @init { + exprType etype = null; List gens = new ArrayList(); } +@after { + if (etype != null) { + $testlist_gexp.tree = etype; + } +} : t+=test[expr_contextType.Load] ( ((options {k=2;}: c1=COMMA t+=test[expr_contextType.Load])* (c2=COMMA)? -> { $c1 != null || $c2 != null }? ^(PYNODE<Tuple>[$testlist_gexp.start, actions.makeExprs($t), $expr::ctype]) -> test ) - | ( gen_for[gens] -> ^(GeneratorExp test gen_for) + | ( gen_for[gens] { + Collections.reverse(gens); + comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); + etype = new GeneratorExp($gen_for.start, (exprType)$t.get(0), c); + } ) ) ; @@ -1219,7 +1229,7 @@ //list_for: 'for' exprlist 'in' testlist_safe [list_iter] list_for [List gens] - : FOR exprlist[expr_contextType.Load] IN testlist[expr_contextType.Load] (list_iter[gens])? { + : FOR exprlist[expr_contextType.Store] IN testlist[expr_contextType.Load] (list_iter[gens])? { exprType[] e; if ($list_iter.etype != null) { e = new exprType[]{$list_iter.etype}; @@ -1247,7 +1257,7 @@ //gen_for: 'for' exprlist 'in' or_test [gen_iter] gen_for [List gens] - :FOR exprlist[expr_contextType.Load] IN or_test[expr_contextType.Load] gen_iter[gens]? { + :FOR exprlist[expr_contextType.Store] IN or_test[expr_contextType.Load] gen_iter[gens]? { exprType[] e; if ($gen_iter.etype != null) { e = new exprType[]{$gen_iter.etype}; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |