From: <fwi...@us...> - 2009-01-10 03:53:42
|
Revision: 5907 http://jython.svn.sourceforge.net/jython/?rev=5907&view=rev Author: fwierzbicki Date: 2009-01-10 03:53:36 +0000 (Sat, 10 Jan 2009) Log Message: ----------- Improved parsing of expanded 3.0 argument lists. Modified Paths: -------------- branches/jy3k/grammar/Python.g branches/jy3k/src/org/python/antlr/GrammarActions.java Modified: branches/jy3k/grammar/Python.g =================================================================== --- branches/jy3k/grammar/Python.g 2009-01-10 00:49:02 UTC (rev 5906) +++ branches/jy3k/grammar/Python.g 2009-01-10 03:53:36 UTC (rev 5907) @@ -482,23 +482,46 @@ typedargslist returns [arguments args] @init { List defaults = new ArrayList(); + List kw_defaults = new ArrayList(); } : d+=tdefparameter[defaults] (options {greedy=true;}:COMMA d+=tdefparameter[defaults])* (COMMA - (STAR (starargs=tfpdef[expr_contextType.Param])? (COMMA tdefparameter[defaults])* (COMMA DOUBLESTAR kwargs=tfpdef[expr_contextType.Param])? + (STAR (starargs=tfpdef[expr_contextType.Param])? (COMMA k+=tdefparameter[kw_defaults])* + (COMMA tdefparameter[defaults])* (COMMA DOUBLESTAR kwargs=tfpdef[expr_contextType.Param])? | DOUBLESTAR kwargs=tfpdef[expr_contextType.Param] )? )? { - $args = actions.makeArgumentsType($typedargslist.start, $d, $starargs.tree, $kwargs.tree, defaults); + $args = actions.makeArgumentsType( + $typedargslist.start, + $d, + actions.castArg($starargs.tree), + $k, + actions.castArg($kwargs.tree), + defaults, + kw_defaults); } | STAR starargs=tfpdef[expr_contextType.Param] (COMMA DOUBLESTAR kwargs=tfpdef[expr_contextType.Param])? { - $args = actions.makeArgumentsType($typedargslist.start, $d, $starargs.tree, $kwargs.tree, defaults); + $args = actions.makeArgumentsType( + $typedargslist.start, + $d, + actions.castArg($starargs.tree), + $k, + actions.castArg($kwargs.tree), + defaults, + kw_defaults); } | DOUBLESTAR kwargs=tfpdef[expr_contextType.Param] { - $args = actions.makeArgumentsType($typedargslist.start, $d, null, $kwargs.tree, defaults); + $args = actions.makeArgumentsType( + $typedargslist.start, + $d, + null, + $k, + actions.castArg($kwargs.tree), + defaults, + kw_defaults); } ; @@ -530,23 +553,47 @@ varargslist returns [arguments args] @init { List defaults = new ArrayList(); + List kw_defaults = new ArrayList(); } : d+=vdefparameter[defaults] (options {greedy=true;}:COMMA d+=vdefparameter[defaults])* (COMMA - (STAR (starargs=vfpdef[expr_contextType.Param])? (COMMA DOUBLESTAR kwargs=vfpdef[expr_contextType.Param])? + (STAR (starargs=vfpdef[expr_contextType.Param])? (COMMA k+=vdefparameter[kw_defaults])* + (COMMA DOUBLESTAR kwargs=vfpdef[expr_contextType.Param])? | DOUBLESTAR kwargs=vfpdef[expr_contextType.Param] )? )? { - $args = actions.makeArgumentsType($varargslist.start, $d, $starargs.tree, $kwargs.tree, defaults); + $args = actions.makeArgumentsType( + $varargslist.start, + $d, + actions.castArg($starargs.tree), + $k, + actions.castArg($kwargs.tree), + defaults, + kw_defaults); } | STAR starargs=vfpdef[expr_contextType.Param] (COMMA DOUBLESTAR kwargs=vfpdef[expr_contextType.Param])? { - $args = actions.makeArgumentsType($varargslist.start, $d, $starargs.tree, $kwargs.tree, defaults); + $args = actions.makeArgumentsType( + $varargslist.start, + $d, + actions.castArg($starargs.tree), + $k, + actions.castArg($kwargs.tree), + defaults, + kw_defaults); + } | DOUBLESTAR kwargs=vfpdef[expr_contextType.Param] { - $args = actions.makeArgumentsType($varargslist.start, $d, null, $kwargs.tree, defaults); + $args = actions.makeArgumentsType( + $varargslist.start, + $d, + null, + $k, + actions.castArg($kwargs.tree), + defaults, + kw_defaults); } ; @@ -1482,10 +1529,14 @@ List arguments = new ArrayList(); List kws = new ArrayList(); List gens = new ArrayList(); + + List arguments2 = new ArrayList(); + List kws2 = new ArrayList(); + List gens2 = new ArrayList(); } : argument[arguments, kws, gens, true] (COMMA argument[arguments, kws, gens, false])* (COMMA - ( STAR s=test[expr_contextType.Load] (COMMA DOUBLESTAR k=test[expr_contextType.Load])? + ( STAR s=test[expr_contextType.Load] (COMMA argument[arguments2, kws2, gens2, false])* (COMMA DOUBLESTAR k=test[expr_contextType.Load])? | DOUBLESTAR k=test[expr_contextType.Load] )? )? Modified: branches/jy3k/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/jy3k/src/org/python/antlr/GrammarActions.java 2009-01-10 00:49:02 UTC (rev 5906) +++ branches/jy3k/src/org/python/antlr/GrammarActions.java 2009-01-10 03:53:36 UTC (rev 5907) @@ -170,7 +170,6 @@ if (o instanceof PythonTree) { return errorHandler.errorArg((PythonTree)o); } - errorHandler.error("Bad Arg node", null); return null; } @@ -315,24 +314,39 @@ } } - arguments makeArgumentsType(Token t, List params, PythonTree snameToken, - PythonTree knameToken, List defaults) { + arguments makeArgumentsType( + Token t, + List args, + arg vararg, + List kwonlyargs, //* + arg kwarg, + List defaults, + List kw_defaults //* + ) { - List<arg> p = castArgs(params); + List<arg> p = castArgs(args); List<expr> d = castExprs(defaults); + List<arg> kw = castArgs(kwonlyargs); + List<expr> kw_d = castExprs(kw_defaults); String s; String k; - if (snameToken == null) { + expr sAnnotation; + expr kAnnotation; + if (vararg == null) { s = null; + sAnnotation = null; } else { - s = cantBeNone(snameToken); + s = cantBeNone(vararg); + sAnnotation = vararg.getInternalAnnotation(); } - if (knameToken == null) { + if (kwarg == null) { k = null; + kAnnotation = null; } else { - k = cantBeNone(knameToken); + k = cantBeNone(kwarg); + kAnnotation = kwarg.getInternalAnnotation(); } - return new arguments(t, p, s, null, new ArrayList<arg>(), k, null, d, new ArrayList<expr>()); + return new arguments(t, p, s, sAnnotation, kw, k, kAnnotation, d, kw_d); } List<expr> extractArgs(List args) { @@ -550,6 +564,13 @@ return new UnaryOp(t, unaryopType.USub, o); } + String cantBeNone(arg a) { + if (a == null || a.getInternalArg().equals("None")) { + errorHandler.error("can't be None", a); + } + return a.getInternalArg(); + } + String cantBeNone(Token t) { if (t == null || t.getText().equals("None")) { errorHandler.error("can't be None", new PythonTree(t)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |