From: <fwi...@us...> - 2008-08-19 21:43:09
|
Revision: 5210 http://jython.svn.sourceforge.net/jython/?rev=5210&view=rev Author: fwierzbicki Date: 2008-08-19 21:43:06 +0000 (Tue, 19 Aug 2008) Log Message: ----------- Work to date on the one pass grammar. Not ready for others to look at really. If you really want to try it note that you need to comment out parts of site.py and os.py to get things to work. They *almost* parse and compile, but not quite, and they are basic dependencies for Jython to run. Modified Paths: -------------- branches/nowalker/build.xml branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/ExpressionParser.java branches/nowalker/src/org/python/antlr/GrammarActions.java branches/nowalker/src/org/python/antlr/InteractiveParser.java branches/nowalker/src/org/python/antlr/ModuleParser.java branches/nowalker/src/org/python/antlr/ast/BinOp.java branches/nowalker/src/org/python/antlr/ast/BoolOp.java branches/nowalker/src/org/python/util/jython.java branches/nowalker/tests/java/org/python/antlr/PythonTreeTester.java Removed Paths: ------------- branches/nowalker/grammar/PythonWalker.g Modified: branches/nowalker/build.xml =================================================================== --- branches/nowalker/build.xml 2008-08-19 21:17:36 UTC (rev 5209) +++ branches/nowalker/build.xml 2008-08-19 21:43:06 UTC (rev 5210) @@ -434,7 +434,6 @@ <arg value="-lib"/> <arg path="${work.dir}/build/gensrc/org/python/antlr"/> <arg file="${jython.base.dir}/grammar/Python.g"/> - <arg file="${jython.base.dir}/grammar/PythonWalker.g"/> <arg file="${jython.base.dir}/grammar/PythonPartial.g"/> <classpath refid="main.classpath"/> </java> Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-19 21:17:36 UTC (rev 5209) +++ branches/nowalker/grammar/Python.g 2008-08-19 21:43:06 UTC (rev 5210) @@ -75,74 +75,26 @@ INDENT; DEDENT; - Module; + PYNODE; Interactive; Expression; - NameTok; Test; - Msg; - Level; Body; - Bases; - Arguments; - Args; - Arg; - Keyword; - StarArgs; - KWArgs; - Assign; - AugAssign; - Tuple; - List; Dict; IfExp; - TryExcept; - TryFinally; - ExceptHandler; - StrTok; - NumTok; - IsNot; - NotIn; - Type; - Inst; - Tback; - Globals; - Locals; Ellipsis; ListComp; Repr; - Subscript; - SubscriptList; - Index; Target; - Value; - Lower; - Upper; - Step; - UAdd; - USub; - Invert; - Alias; - Asname; - Decorators; GeneratorExp; Ifs; Elts; - Call; - Dest; - Values; - Newline; - FpList; - StepOp; - UpperOp; - GenFor; GenIf; ListFor; ListIf; - Parens; - Brackets; + } @header { @@ -152,29 +104,68 @@ import org.python.antlr.ParseException; import org.python.antlr.PythonTree; +import org.python.antlr.ast.aliasType; import org.python.antlr.ast.argumentsType; +import org.python.antlr.ast.Assert; +import org.python.antlr.ast.Assign; import org.python.antlr.ast.Attribute; +import org.python.antlr.ast.AugAssign; +import org.python.antlr.ast.BinOp; +import org.python.antlr.ast.BoolOp; +import org.python.antlr.ast.boolopType; import org.python.antlr.ast.Break; +import org.python.antlr.ast.Call; +import org.python.antlr.ast.ClassDef; +import org.python.antlr.ast.cmpopType; +import org.python.antlr.ast.Compare; +import org.python.antlr.ast.comprehensionType; import org.python.antlr.ast.Context; import org.python.antlr.ast.Continue; +import org.python.antlr.ast.Delete; +import org.python.antlr.ast.excepthandlerType; +import org.python.antlr.ast.Exec; import org.python.antlr.ast.Expr; import org.python.antlr.ast.exprType; import org.python.antlr.ast.expr_contextType; +import org.python.antlr.ast.ExtSlice; +import org.python.antlr.ast.For; import org.python.antlr.ast.FunctionDef; +import org.python.antlr.ast.Global; +import org.python.antlr.ast.If; +import org.python.antlr.ast.Import; +import org.python.antlr.ast.ImportFrom; +import org.python.antlr.ast.Index; +import org.python.antlr.ast.keywordType; +import org.python.antlr.ast.Lambda; import org.python.antlr.ast.modType; import org.python.antlr.ast.Module; import org.python.antlr.ast.Name; import org.python.antlr.ast.Num; import org.python.antlr.ast.Pass; import org.python.antlr.ast.Print; +import org.python.antlr.ast.Raise; +import org.python.antlr.ast.operatorType; import org.python.antlr.ast.Return; +import org.python.antlr.ast.Slice; +import org.python.antlr.ast.sliceType; import org.python.antlr.ast.stmtType; import org.python.antlr.ast.Str; +import org.python.antlr.ast.Subscript; +import org.python.antlr.ast.TryExcept; +import org.python.antlr.ast.TryFinally; +import org.python.antlr.ast.Tuple; +import org.python.antlr.ast.unaryopType; +import org.python.antlr.ast.UnaryOp; +import org.python.antlr.ast.While; +import org.python.antlr.ast.With; +import org.python.antlr.ast.Yield; import org.python.core.Py; import org.python.core.PyString; import org.python.core.PyUnicode; import java.math.BigInteger; +import java.util.Iterator; +import java.util.ListIterator; } @members { @@ -297,17 +288,21 @@ ; //file_input: (NEWLINE | stmt)* ENDMARKER -file_input : (NEWLINE | stmt)* EOF - -> ^(Module stmt*) - ; +file_input + : (NEWLINE | s+=stmt)+ -> ^(PYNODE<Module>[$file_input.start, actions.makeStmts($s)]) + | -> ^(PYNODE<Module>[$file_input.start, new stmtType[0\]]) + ; //eval_input: testlist NEWLINE* ENDMARKER eval_input : LEADING_WS? (NEWLINE)* testlist[expr_contextType.Load] (NEWLINE)* EOF -> ^(Expression testlist) ; //not in CPython's Grammar file -dotted_attr - : NAME (DOT^ attr)* +dotted_attr returns [exprType etype] + : n1=NAME + ( (DOT n2+=dotted_attr)+ { $etype = actions.makeDottedAttr($n1, $n2); } + | { $etype = new Name($NAME, $NAME.text, expr_contextType.Load); } + ) ; //attr is here for Java compatibility. A Java foo.getIf() can be called from Jython as foo.if @@ -349,62 +344,94 @@ ; //decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE -decorator: AT dotted_attr - ( (LPAREN arglist? RPAREN) -> ^(AT dotted_attr ^(Call ^(Args arglist)?)) - | -> ^(AT dotted_attr) - ) NEWLINE - ; +decorator returns [exprType etype] +@after { + $decorator.tree = $etype; +} + : AT dotted_attr + //XXX: ignoring the arglist and Call generation right now. + ( LPAREN (arglist + {$etype = new Call($LPAREN, $dotted_attr.etype, actions.makeExprs($arglist.args), + actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs);} + | {$etype = $dotted_attr.etype;} + ) + RPAREN + // ^(Decorator dotted_attr ^(CallTok ^(Args arglist)?)) + | { $etype = $dotted_attr.etype; } + ) NEWLINE + ; //decorators: decorator+ -decorators: decorator+ - ; +decorators returns [List etypes] + : d+=decorator+ {$etypes = $d;} + ; //funcdef: [decorators] 'def' NAME parameters ':' suite funcdef : decorators? DEF NAME parameters COLON suite - -> ^(DEF NAME parameters ^(Body suite) ^(Decorators decorators?)) + -> ^(DEF<FunctionDef>[$DEF, $NAME.text, $parameters.args, actions.makeStmts($suite.stmts), + actions.makeExprs($decorators.etypes)]) ; //parameters: '(' [varargslist] ')' -parameters : LPAREN - (varargslist -> ^(Arguments varargslist) - | -> ^(Arguments) - ) - RPAREN - ; +parameters returns [argumentsType args] + : LPAREN + (varargslist {$args = $varargslist.args;} + | {$args = new argumentsType($parameters.start, new exprType[0], null, null, new exprType[0]);} + ) + RPAREN + ; //not in CPython's Grammar file -defparameter : fpdef (ASSIGN test[expr_contextType.Load])? {debug("parsed defparameter");} - ; +defparameter[List defaults] returns [exprType etype] +@after { + $defparameter.tree = $etype; +} + : fpdef[expr_contextType.Param] (ASSIGN test[expr_contextType.Load])? { + $etype = (exprType)$fpdef.tree; + if ($ASSIGN != null) { + defaults.add($test.tree); + } else if (!defaults.isEmpty()) { + throw new ParseException( + "non-default argument follows default argument", + $fpdef.tree); + } + } +; //varargslist: ((fpdef ['=' test] ',')* // ('*' NAME [',' '**' NAME] | '**' NAME) | // fpdef ['=' test] (',' fpdef ['=' test])* [',']) -varargslist : defparameter (options {greedy=true;}:COMMA defparameter)* - (COMMA - ( STAR starargs=NAME (COMMA DOUBLESTAR kwargs=NAME)? - | DOUBLESTAR kwargs=NAME - )? - )? {debug("parsed varargslist");} - -> ^(Args defparameter+) ^(StarArgs $starargs)? ^(KWArgs $kwargs)? - | STAR starargs=NAME (COMMA DOUBLESTAR kwargs=NAME)?{debug("parsed varargslist STARARGS");} - -> ^(StarArgs $starargs) ^(KWArgs $kwargs)? - | DOUBLESTAR kwargs=NAME {debug("parsed varargslist KWS");} - -> ^(KWArgs $kwargs) - ; +varargslist returns [argumentsType args] +@init { + List defaults = new ArrayList(); +} + : d+=defparameter[defaults] (options {greedy=true;}:COMMA d+=defparameter[defaults])* + (COMMA + ( STAR starargs=NAME (COMMA DOUBLESTAR kwargs=NAME)? + | DOUBLESTAR kwargs=NAME + )? + )? + {$args = actions.makeArgumentsType($varargslist.start, $d, $starargs, $kwargs, defaults);} + | STAR starargs=NAME (COMMA DOUBLESTAR kwargs=NAME)?{debug("parsed varargslist STARARGS");} + {$args = actions.makeArgumentsType($varargslist.start, $d, $starargs, $kwargs, defaults);} + | DOUBLESTAR kwargs=NAME {debug("parsed varargslist KWS");} + {$args = actions.makeArgumentsType($varargslist.start, $d, null, $kwargs, defaults);} + ; //fpdef: NAME | '(' fplist ')' -fpdef : NAME {debug("parsed fpdef NAME");} - | (LPAREN fpdef COMMA) => LPAREN fplist RPAREN - -> ^(FpList fplist) +fpdef[expr_contextType ctype] : NAME + -> ^(PYNODE<Name>[$NAME, $NAME.text, ctype]) + | (LPAREN fpdef[expr_contextType.Load] COMMA) => LPAREN fplist RPAREN + -> fplist | LPAREN fplist RPAREN - -> fplist + -> ^(LPAREN<Tuple>[$fplist.start, actions.makeExprs($fplist.etypes), expr_contextType.Store]) ; //fplist: fpdef (',' fpdef)* [','] -fplist : fpdef (options {greedy=true;}:COMMA fpdef)* (COMMA)? - {debug("parsed fplist");} - -> fpdef+ - ; +fplist returns [List etypes] + : f+=fpdef[expr_contextType.Store] (options {greedy=true;}:COMMA f+=fpdef[expr_contextType.Store])* (COMMA)? + {$etypes = $f;} + ; //stmt: simple_stmt | compound_stmt stmt : simple_stmt @@ -430,111 +457,103 @@ //expr_stmt: testlist (augassign (yield_expr|testlist) | // ('=' (yield_expr|testlist))*) -expr_stmt : lhs=testlist[expr_contextType.Store] - ( (augassign yield_expr -> ^(augassign $lhs yield_expr)) - | (augassign rhs=testlist[expr_contextType.Load] -> ^(augassign $lhs $rhs)) - | ((assigns) {debug("matched assigns");} -> ^(Assign ^(Target $lhs) assigns)) - | -> $lhs - ) - ; - -//not in CPython's Grammar file -assigns - @after { - PythonTree pt = ((PythonTree)$assigns.tree); - int children = pt.getChildCount(); - PythonTree child; - if (children == 1) { - child = pt; - pt.token = new CommonToken(Value, "Value"); - } else { - child = (PythonTree)pt.getChild(children - 1); - child.token = new CommonToken(Value, "Value"); - } - child.token = new CommonToken(Value, "Value"); - PythonTree targ = (PythonTree)child.getChild(0); - if (targ instanceof Context) { - ((Context)targ).setContext(expr_contextType.Load); - } +expr_stmt +@init { + stmtType stype = null; } - : assign_testlist+ - | assign_yield+ - ; +@after { + if (stype != null) { + $expr_stmt.tree = stype; + } +} -//not in CPython's Grammar file -assign_testlist - : ASSIGN testlist[expr_contextType.Store] -> ^(Target testlist) - ; - -//not in CPython's Grammar file -assign_yield - : ASSIGN yield_expr -> ^(Value yield_expr) + : + ((testlist[expr_contextType.Load] augassign) => lhs=testlist[expr_contextType.AugStore] + ( (aay=augassign y1=yield_expr {stype = new AugAssign($lhs.tree, (exprType)$lhs.tree, $aay.op, (exprType)$y1.tree);}) + | (aat=augassign rhs=testlist[expr_contextType.Load] {stype = new AugAssign($lhs.tree, (exprType)$lhs.tree, $aat.op, (exprType)$rhs.tree);}) + ) + |(testlist[expr_contextType.Load] ASSIGN) => lhs=testlist[expr_contextType.Store] + ( + | ((at=ASSIGN t+=testlist[expr_contextType.Store])+ -> ^(PYNODE<Assign>[$at, actions.makeAssignTargets((exprType)$lhs.tree, $t), actions.makeAssignValue($t)])) + | ((ay=ASSIGN y2+=yield_expr)+ -> ^(PYNODE<Assign>[$ay, actions.makeAssignTargets((exprType)$lhs.tree, $y2), actions.makeAssignValue($y2)])) + ) + | lhs=testlist[expr_contextType.Load] -> PYNODE<Expr>[$lhs.start, (exprType)$lhs.tree] + ) ; //augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | // '<<=' | '>>=' | '**=' | '//=') -augassign : PLUSEQUAL - | MINUSEQUAL - | STAREQUAL - | SLASHEQUAL - | PERCENTEQUAL - | AMPEREQUAL - | VBAREQUAL - | CIRCUMFLEXEQUAL - | LEFTSHIFTEQUAL - | RIGHTSHIFTEQUAL - | DOUBLESTAREQUAL - | DOUBLESLASHEQUAL - ; +augassign returns [operatorType op] + : PLUSEQUAL {$op = operatorType.Add;} + | MINUSEQUAL {$op = operatorType.Sub;} + | STAREQUAL {$op = operatorType.Mult;} + | SLASHEQUAL {$op = operatorType.Div;} + | PERCENTEQUAL {$op = operatorType.Mod;} + | AMPEREQUAL {$op = operatorType.BitAnd;} + | VBAREQUAL {$op = operatorType.BitOr;} + | CIRCUMFLEXEQUAL {$op = operatorType.BitXor;} + | LEFTSHIFTEQUAL {$op = operatorType.LShift;} + | RIGHTSHIFTEQUAL {$op = operatorType.RShift;} + | DOUBLESTAREQUAL {$op = operatorType.Pow;} + | DOUBLESLASHEQUAL {$op = operatorType.FloorDiv;} + ; //print_stmt: 'print' ( [ test (',' test)* [','] ] | // '>>' test [ (',' test)+ [','] ] ) -print_stmt : PRINT - ( t1=printlist -> {$t1.newline}? ^(PRINT ^(Values $t1) ^(Newline)) - -> ^(PRINT ^(Values $t1)) - | RIGHTSHIFT t2=printlist2 -> {$t2.newline}? ^(PRINT ^(Dest RIGHTSHIFT) ^(Values $t2) ^(Newline)) - -> ^(PRINT ^(Dest RIGHTSHIFT) ^(Values $t2)) - | -> ^(PRINT ^(Newline)) +print_stmt : PRINT + ( t1=printlist + -> ^(PRINT<Print>[$PRINT, null, actions.makeExprs($t1.elts), $t1.newline]) + | RIGHTSHIFT t2=printlist2 + -> ^(PRINT<Print>[$PRINT, (exprType)$t2.elts.get(0), actions.makeExprs($t2.elts, 1), $t2.newline]) + | + -> ^(PRINT<Print>[$PRINT, null, new exprType[0\], false]) ) ; //not in CPython's Grammar file -printlist returns [boolean newline] - : (test[expr_contextType.Load] COMMA) => test[expr_contextType.Load] (options {k=2;}: COMMA test[expr_contextType.Load])* (trailcomma=COMMA)? - { if ($trailcomma == null) { - $newline = true; +printlist returns [boolean newline, List elts] + : (test[expr_contextType.Load] COMMA) => + t+=test[expr_contextType.Load] (options {k=2;}: COMMA t+=test[expr_contextType.Load])* (trailcomma=COMMA)? + { $elts=$t; + if ($trailcomma == null) { + $newline = true; } else { - $newline = false; + $newline = false; } } - -> ^(Elts test+) - | test[expr_contextType.Load] {$newline = true;} - -> ^(Elts test) + | t+=test[expr_contextType.Load] { + $elts=$t; + $newline = true; + } ; +//XXX: would be nice if printlist and printlist2 could be merged. //not in CPython's Grammar file -printlist2 returns [boolean newline] - : (test[expr_contextType.Load] COMMA test[expr_contextType.Load]) => test[expr_contextType.Load] (options {k=2;}: COMMA test[expr_contextType.Load])* (trailcomma=COMMA)? - { if ($trailcomma == null) { - $newline = true; +printlist2 returns [boolean newline, List elts] + : (test[expr_contextType.Load] COMMA test[expr_contextType.Load]) => + t+=test[expr_contextType.Load] (options {k=2;}: COMMA t+=test[expr_contextType.Load])* (trailcomma=COMMA)? + { $elts=$t; + if ($trailcomma == null) { + $newline = true; } else { - $newline = false; + $newline = false; } } - -> ^(Elts test+) - | test[expr_contextType.Load] {$newline = true;} - -> ^(Elts test) + | t+=test[expr_contextType.Load] { + $elts=$t; + $newline = true; + } ; //del_stmt: 'del' exprlist del_stmt : DELETE exprlist2 - -> ^(DELETE exprlist2) + -> ^(DELETE<Delete>[$DELETE, actions.makeExprs($exprlist2.etypes)]) ; //pass_stmt: 'pass' -pass_stmt : PASS - -> ^(PASS) +pass_stmt : PASS + -> ^(PASS<Pass>[$PASS]) ; //flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt @@ -556,17 +575,19 @@ ; //return_stmt: 'return' [testlist] -return_stmt : RETURN (testlist[expr_contextType.Load])? - -> ^(RETURN ^(Value testlist)?) +return_stmt : RETURN + (testlist[expr_contextType.Load] -> ^(RETURN<Return>[$RETURN, (exprType)$testlist.tree]) + | -> ^(RETURN<Return>[$RETURN, null]) + ) ; //yield_stmt: yield_expr -yield_stmt : yield_expr +yield_stmt : yield_expr -> ^(PYNODE<Expr>[$yield_expr.start, (exprType)$yield_expr.tree]) ; //raise_stmt: 'raise' [test [',' test [',' test]]] raise_stmt: RAISE (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load] (COMMA t3=test[expr_contextType.Load])?)?)? - -> ^(RAISE ^(Type $t1)? ^(Inst $t2)? ^(Tback $t3)?) + -> ^(RAISE<Raise>[$RAISE, (exprType)$t1.tree, (exprType)$t2.tree, (exprType)$t3.tree]) ; //import_stmt: import_name | import_from @@ -576,56 +597,82 @@ //import_name: 'import' dotted_as_names import_name : IMPORT dotted_as_names - -> ^(IMPORT dotted_as_names) + -> ^(IMPORT<Import>[$IMPORT, $dotted_as_names.atypes]) ; //import_from: ('from' ('.'* dotted_name | '.'+) // 'import' ('*' | '(' import_as_names ')' | import_as_names)) -import_from: FROM (DOT* dotted_name | DOT+) IMPORT +import_from: FROM (d+=DOT* dotted_name | d+=DOT+) IMPORT (STAR - -> ^(FROM ^(Level DOT*)? ^(Value dotted_name)? ^(IMPORT STAR)) - | import_as_names - -> ^(FROM ^(Level DOT*)? ^(Value dotted_name)? ^(IMPORT import_as_names)) - | LPAREN import_as_names COMMA? RPAREN - -> ^(FROM ^(Level DOT*)? ^(Value dotted_name)? ^(IMPORT import_as_names)) + -> ^(FROM<ImportFrom>[$FROM, actions.makeFromText($d, $dotted_name.text), actions.makeStarAlias($STAR), actions.makeLevel($d)]) + | i1=import_as_names + -> ^(FROM<ImportFrom>[$FROM, actions.makeFromText($d, $dotted_name.text), actions.makeAliases($i1.atypes), actions.makeLevel($d)]) + | LPAREN i2=import_as_names COMMA? RPAREN + -> ^(FROM<ImportFrom>[$FROM, actions.makeFromText($d, $dotted_name.text), actions.makeAliases($i2.atypes), actions.makeLevel($d)]) ) ; //import_as_names: import_as_name (',' import_as_name)* [','] -import_as_names : import_as_name (COMMA! import_as_name)* - ; +import_as_names returns [aliasType[\] atypes] + : n+=import_as_name (COMMA! n+=import_as_name)* { + $atypes = (aliasType[])$n.toArray(new aliasType[$n.size()]); + } + ; //import_as_name: NAME [('as' | NAME) NAME] -import_as_name : name=NAME (AS asname=NAME)? - -> ^(Alias $name ^(Asname $asname)?) - ; +import_as_name returns [aliasType atype] +@after { + $import_as_name.tree = $atype; +} + : name=NAME (AS asname=NAME)? { + $atype = new aliasType($name, $name.text, $asname.text); + } + ; //XXX: when does CPython Grammar match "dotted_name NAME NAME"? //dotted_as_name: dotted_name [('as' | NAME) NAME] -dotted_as_name : dotted_name (AS asname=NAME)? - -> ^(Alias dotted_name ^(Asname NAME)?) - ; +dotted_as_name returns [aliasType atype] +@after { + $dotted_as_name.tree = $atype; +} + : dotted_name (AS NAME)? { + $atype = new aliasType($NAME, $dotted_name.text, $NAME.text); + } + ; + //dotted_as_names: dotted_as_name (',' dotted_as_name)* -dotted_as_names : dotted_as_name (COMMA! dotted_as_name)* - ; +dotted_as_names returns [aliasType[\] atypes] + : d+=dotted_as_name (COMMA! d+=dotted_as_name)* { + $atypes = (aliasType[])$d.toArray(new aliasType[$d.size()]); + } + ; + //dotted_name: NAME ('.' NAME)* dotted_name : NAME (DOT attr)* ; //global_stmt: 'global' NAME (',' NAME)* -global_stmt : GLOBAL NAME (COMMA NAME)* - -> ^(GLOBAL NAME+) +global_stmt : GLOBAL n+=NAME (COMMA n+=NAME)* + -> ^(GLOBAL<Global>[$GLOBAL, actions.makeNames($n)]) ; //exec_stmt: 'exec' expr ['in' test [',' test]] -exec_stmt : EXEC expr[expr_contextType.Load] (IN t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load])?)? - -> ^(EXEC expr ^(Globals $t1)? ^(Locals $t2)?) - ; +exec_stmt +@init { + stmtType stype = null; +} +@after { + $exec_stmt.tree = stype; +} + : EXEC expr[expr_contextType.Load] (IN t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load])?)? { + stype = new Exec($expr.start, (exprType)$expr.tree, (exprType)$t1.tree, (exprType)$t2.tree); + } + ; //assert_stmt: 'assert' test [',' test] assert_stmt : ASSERT t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load])? - -> ^(ASSERT ^(Test $t1) ^(Msg $t2)?) + -> ^(ASSERT<Assert>[$ASSERT, (exprType)$t1.tree, (exprType)$t2.tree]) ; //compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef @@ -639,62 +686,142 @@ ; //if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] -if_stmt: IF test[expr_contextType.Load] COLON ifsuite=suite elif_clause* (ORELSE COLON elsesuite=suite)? - -> ^(IF test $ifsuite elif_clause* ^(ORELSE $elsesuite)?) +if_stmt: IF test[expr_contextType.Load] COLON ifsuite=suite elifs+=elif_clause* (ORELSE COLON elsesuite=suite)? + -> ^(IF<If>[$IF, (exprType)$test.tree, actions.makeStmts($ifsuite.stmts), actions.makeElses($elsesuite.stmts, $elifs)]) ; //not in CPython's Grammar file elif_clause : ELIF test[expr_contextType.Load] COLON suite - -> ^(ELIF test suite) + -> ^(ELIF<If>[$ELIF, (exprType)$test.tree, actions.makeStmts($suite.stmts), new stmtType[0\]]) ; //while_stmt: 'while' test ':' suite ['else' ':' suite] -while_stmt : WHILE test[expr_contextType.Load] COLON s1=suite (ORELSE COLON s2=suite)? - -> ^(WHILE test ^(Body $s1) ^(ORELSE $s2)?) - ; +while_stmt +@init { + stmtType stype = null; +} +@after { + $while_stmt.tree = stype; +} + : WHILE test[expr_contextType.Load] COLON s1=suite (ORELSE COLON s2=suite)? { + stype = actions.makeWhile($WHILE, (exprType)$test.tree, $s1.stmts, $s2.stmts); + } + ; //for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] -for_stmt : FOR exprlist[expr_contextType.Store] IN testlist[expr_contextType.Load] COLON s1=suite (ORELSE COLON s2=suite)? - -> ^(FOR ^(Target exprlist) ^(IN testlist) ^(Body $s1) ^(ORELSE $s2)?) - ; +for_stmt +@init { + stmtType stype = null; +} +@after { + $for_stmt.tree = stype; +} + : FOR exprlist[expr_contextType.Store] IN testlist[expr_contextType.Load] COLON s1=suite (ORELSE COLON s2=suite)? { + stype = actions.makeFor($FOR, $exprlist.etype, (exprType)$testlist.tree, $s1.stmts, $s2.stmts); + } + ; //try_stmt: ('try' ':' suite // ((except_clause ':' suite)+ // ['else' ':' suite] // ['finally' ':' suite] | // 'finally' ':' suite)) -try_stmt : TRY COLON trysuite=suite - ( (except_clause+ (ORELSE COLON elsesuite=suite)? (FINALLY COLON finalsuite=suite)? - -> ^(TryExcept[$TRY] ^(Body $trysuite) except_clause+ ^(ORELSE $elsesuite)? ^(FINALLY $finalsuite)?)) - | (FINALLY COLON finalsuite=suite - -> ^(TryFinally[$TRY] ^(Body $trysuite) ^(FINALLY $finalsuite))) - ) - ; +try_stmt +@init { + stmtType stype = null; +} +@after { + $try_stmt.tree = stype; +} + : TRY COLON trysuite=suite + ( e+=except_clause+ (ORELSE COLON elsesuite=suite)? (FINALLY COLON finalsuite=suite)? { + stype = actions.makeTryExcept($TRY, $trysuite.stmts, $e, $elsesuite.stmts, $finalsuite.stmts); + } + | FINALLY COLON finalsuite=suite { + stype = actions.makeTryFinally($TRY, $trysuite.stmts, $finalsuite.stmts); + } + ) + ; //with_stmt: 'with' test [ with_var ] ':' suite -with_stmt: WITH test[expr_contextType.Load] (with_var)? COLON suite - -> ^(WITH test with_var? ^(Body suite)) - ; +with_stmt +@init { + stmtType stype = null; +} +@after { + $with_stmt.tree = stype; +} + :WITH test[expr_contextType.Load] (with_var)? COLON suite { + stype = new With($WITH, (exprType)$test.tree, $with_var.etype, actions.makeStmts($suite.stmts)); + } + ; //with_var: ('as' | NAME) expr -with_var: (AS | NAME) expr[expr_contextType.Load] - ; +with_var returns [exprType etype] + : (AS | NAME) expr[expr_contextType.Load] { + $etype = (exprType)$expr.tree; + } + ; //except_clause: 'except' [test [',' test]] except_clause : EXCEPT (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load])?)? COLON suite - //Note: passing the 'except' keyword on so we can pass the same offset - // as CPython. - -> ^(EXCEPT ^(Type $t1)? ^(Value $t2)? ^(Body suite)) + -> ^(EXCEPT<excepthandlerType>[$EXCEPT, (exprType)$t1.tree, (exprType)$t2.tree, actions.makeStmts($suite.stmts), $EXCEPT.getLine(), $EXCEPT.getCharPositionInLine()]) ; //suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT -suite - : simple_stmt - | NEWLINE! INDENT (stmt)+ DEDENT +suite returns [List stmts] + : ss+=simple_stmt {$stmts = $ss;} + | NEWLINE! INDENT (s+=stmt)+ DEDENT {$stmts = $s;} ; //test: or_test ['if' or_test 'else' test] | lambdef test[expr_contextType ctype] +@after { + if ($test.tree instanceof BoolOp) { + BoolOp b = (BoolOp)$test.tree; + List values = new ArrayList(); + + exprType left = (exprType)b.getChild(0); + exprType right = (exprType)b.getChild(1); + + exprType[] e; + if (left.getType() == b.getType() && right.getType() == b.getType()) { + BoolOp leftB = (BoolOp)left; + BoolOp rightB = (BoolOp)right; + int lenL = leftB.values.length; + int lenR = rightB.values.length; + e = new exprType[lenL + lenR]; + System.arraycopy(leftB.values, 0, e, 0, lenL - 1); + System.arraycopy(rightB.values, 0, e, lenL - 1, lenL + lenR); + } else if (left.getType() == b.getType()) { + BoolOp leftB = (BoolOp)left; + e = new exprType[leftB.values.length + 1]; + System.arraycopy(leftB.values, 0, e, 0, leftB.values.length); + e[e.length - 1] = right; + } else if (right.getType() == b.getType()) { + BoolOp rightB = (BoolOp)right; + e = new exprType[rightB.values.length + 1]; + System.arraycopy(rightB.values, 0, e, 0, rightB.values.length); + e[e.length - 1] = left; + } else { + e = new exprType[2]; + e[0] = left; + e[1] = right; + } + b.values = e; + switch (b.getType()) { + case AND: + b.op = boolopType.And; + break; + case OR: + b.op = boolopType.Or; + break; + default: + b.op = boolopType.UNDEFINED; + } + } +} + :o1=or_test[ctype] ( (IF or_test[expr_contextType.Load] ORELSE) => IF o2=or_test[ctype] ORELSE test[expr_contextType.Load] -> ^(IfExp ^(Test $o2) ^(Body $o1) ^(ORELSE test)) @@ -704,36 +831,58 @@ ; //or_test: and_test ('or' and_test)* -or_test[expr_contextType ctype] : and_test[ctype] (OR^ and_test[ctype])* +or_test[expr_contextType ctype] : and_test[ctype] (OR<BoolOp>^ and_test[ctype])* ; //and_test: not_test ('and' not_test)* -and_test[expr_contextType ctype] : not_test[ctype] (AND^ not_test[ctype])* +and_test[expr_contextType ctype] : not_test[ctype] (AND<BoolOp>^ not_test[ctype])* ; //not_test: 'not' not_test | comparison -not_test[expr_contextType ctype] : NOT^ not_test[ctype] - | comparison[ctype] - ; +not_test[expr_contextType ctype] returns [exprType etype] +@after { + if ($etype != null) { + $not_test.tree = $etype; + } +} + : NOT nt=not_test[ctype] {$etype = new UnaryOp($NOT, unaryopType.Not, (exprType)$nt.tree);} + | comparison[ctype] + ; //comparison: expr (comp_op expr)* -comparison[expr_contextType ctype]: expr[ctype] (comp_op^ expr[ctype])* +//comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' +comparison[expr_contextType ctype] +@init { + List cmps = new ArrayList(); +} +@after { + if (!cmps.isEmpty()) { + $comparison.tree = new Compare($left.tree, (exprType)$left.tree, actions.makeCmpOps(cmps), actions.makeExprs($right)); + } +} + : left=expr[ctype] + ( ( comp_op right+=expr[ctype] {cmps.add($comp_op.op);} + )+ + | -> $left + ) ; //comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' -comp_op : LESS - | GREATER - | EQUAL - | GREATEREQUAL - | LESSEQUAL - | ALT_NOTEQUAL - | NOTEQUAL - | IN - | NOT IN -> NotIn - | IS - | IS NOT -> IsNot - ; +comp_op returns [cmpopType op] + : LESS {$op = cmpopType.Lt;} + | GREATER {$op = cmpopType.Gt;} + | EQUAL {$op = cmpopType.Eq;} + | GREATEREQUAL {$op = cmpopType.GtE;} + | LESSEQUAL {$op = cmpopType.LtE;} + | ALT_NOTEQUAL {$op = cmpopType.NotEq;} + | NOTEQUAL {$op = cmpopType.NotEq;} + | IN {$op = cmpopType.In;} + | NOT IN {$op = cmpopType.NotIn;} + | IS {$op = cmpopType.Is;} + | IS NOT {$op = cmpopType.IsNot;} + ; + //expr: xor_expr ('|' xor_expr)* expr[expr_contextType ect] scope { @@ -742,40 +891,122 @@ @init { $expr::ctype = ect; } - - : xor_expr (VBAR^ xor_expr)* +@after { + if ($expr.tree instanceof BinOp) { + BinOp b = (BinOp)$expr.tree; + b.left = (exprType)b.getChild(0); + b.right = (exprType)b.getChild(1); + switch (b.getType()) { + case PLUS: + b.op = operatorType.Add; + break; + case MINUS: + b.op = operatorType.Sub; + break; + case STAR: + b.op = operatorType.Mult; + break; + case SLASH: + b.op = operatorType.Div; + break; + case PERCENT: + b.op = operatorType.Mod; + break; + case DOUBLESLASH: + b.op = operatorType.FloorDiv; + break; + case AMPER: + b.op = operatorType.BitAnd; + break; + case VBAR: + b.op = operatorType.BitOr; + break; + case CIRCUMFLEX: + b.op = operatorType.BitXor; + break; + case LEFTSHIFT: + b.op = operatorType.LShift; + break; + case RIGHTSHIFT: + b.op = operatorType.RShift; + break; + case DOUBLESTAR: + b.op = operatorType.Pow; + break; + } + } +} + : xor_expr (VBAR<BinOp>^ xor_expr)* ; //xor_expr: and_expr ('^' and_expr)* -xor_expr : and_expr (CIRCUMFLEX^ and_expr)* +xor_expr : and_expr (CIRCUMFLEX<BinOp>^ and_expr)* ; //and_expr: shift_expr ('&' shift_expr)* -and_expr : shift_expr (AMPER^ shift_expr)* +and_expr : shift_expr (AMPER<BinOp>^ shift_expr)* ; //shift_expr: arith_expr (('<<'|'>>') arith_expr)* -shift_expr : arith_expr ((LEFTSHIFT^|RIGHTSHIFT^) arith_expr)* +shift_expr : arith_expr ((LEFTSHIFT<BinOp>^|RIGHTSHIFT<BinOp>^) arith_expr)* ; //arith_expr: term (('+'|'-') term)* -arith_expr: term ((PLUS^|MINUS^) term)* + +arith_expr + :term ((PLUS<BinOp>^|MINUS<BinOp>^) term)* ; //term: factor (('*'|'/'|'%'|'//') factor)* -term : factor ((STAR^ | SLASH^ | PERCENT^ | DOUBLESLASH^ ) factor)* +term : factor ((STAR<BinOp>^ | SLASH<BinOp>^ | PERCENT<BinOp>^ | DOUBLESLASH<BinOp>^ ) factor)* ; //factor: ('+'|'-'|'~') factor | power -factor : PLUS factor -> ^(UAdd PLUS factor) - | MINUS factor -> ^(USub MINUS factor) - | TILDE factor -> ^(Invert TILDE factor) - | power - ; +factor returns [exprType etype] +@after { + $factor.tree = $etype; +} + : PLUS p=factor {$etype = new UnaryOp($PLUS, unaryopType.UAdd, $p.etype);} + | MINUS m=factor {$etype = actions.negate($MINUS, $m.etype);} + | TILDE t=factor {$etype = new UnaryOp($TILDE, unaryopType.Invert, $t.etype);} + | power {$etype = (exprType)$power.tree;} + ; //power: atom trailer* ['**' factor] -power : atom (trailer^)* (options {greedy=true;}:DOUBLESTAR^ factor)? - ; +power returns [exprType etype] +@after { + if ($etype != null) { + $power.tree = $etype; + } +} + : atom (t+=trailer)* (options {greedy=true;}:DOUBLESTAR factor)? { + if ($t != null) { + exprType current = (exprType)$atom.tree; + //for(int i = $t.size() - 1; i > -1; i--) { + for(int i = 0; i < $t.size(); i++) { + Object o = $t.get(i); + if (current instanceof Context) { + ((Context)current).setContext(expr_contextType.Load); + } + //XXX: good place for an interface to avoid all of this instanceof + if (o instanceof Call) { + Call c = (Call)o; + c.func = current; + current = c; + } else if (o instanceof Subscript) { + Subscript c = (Subscript)o; + c.value = current; + current = c; + } else if (o instanceof Attribute) { + Attribute c = (Attribute)o; + c.value = current; + current = c; + } + } + $etype = (exprType)current; + } + } + ; //atom: ('(' [yield_expr|testlist_gexp] ')' | // '[' [listmaker] ']' | @@ -783,87 +1014,152 @@ // '`' testlist1 '`' | // NAME | NUMBER | STRING+) atom : LPAREN - ( yield_expr -> ^(Parens LPAREN yield_expr) - | testlist_gexp {debug("parsed testlist_gexp");} -> ^(Parens LPAREN testlist_gexp) - | -> ^(Tuple) + ( yield_expr -> yield_expr + | testlist_gexp -> testlist_gexp + | -> ^(PYNODE<Tuple>[$LPAREN, new exprType[0\], $expr::ctype]) ) RPAREN | LBRACK - (listmaker -> ^(Brackets LBRACK listmaker) - | -> ^(Brackets LBRACK ^(List)) + (listmaker -> listmaker + | -> ^(LBRACK<org.python.antlr.ast.List>[$LBRACK, new exprType[0\], $expr::ctype]) ) RBRACK | LCURLY (dictmaker)? RCURLY -> ^(Dict LCURLY ^(Elts dictmaker)?) | BACKQUOTE testlist[expr_contextType.Load] BACKQUOTE -> ^(Repr BACKQUOTE testlist) - | NAME -> ^(NameTok NAME) - | INT -> ^(NumTok<Num>[$INT, actions.makeInt($INT)]) - | LONGINT -> ^(NumTok<Num>[$LONGINT, actions.makeInt($LONGINT)]) - | FLOAT -> ^(NumTok<Num>[$FLOAT, actions.makeFloat($FLOAT)]) - | COMPLEX -> ^(NumTok<Num>[$COMPLEX, actions.makeComplex($COMPLEX)]) + | NAME -> ^(PYNODE<Name>[$NAME, $NAME.text, $expr::ctype]) + | INT -> ^(PYNODE<Num>[$INT, actions.makeInt($INT)]) + | LONGINT -> ^(PYNODE<Num>[$LONGINT, actions.makeInt($LONGINT)]) + | FLOAT -> ^(PYNODE<Num>[$FLOAT, actions.makeFloat($FLOAT)]) + | COMPLEX -> ^(PYNODE<Num>[$COMPLEX, actions.makeComplex($COMPLEX)]) | (S+=STRING)+ - -> ^(StrTok<Str>[actions.extractStringToken($S), actions.extractStrings($S)]) + -> ^(PYNODE<Str>[actions.extractStringToken($S), actions.extractStrings($S)]) ; //listmaker: test ( list_for | (',' test)* [','] ) -listmaker : test[expr_contextType.Load] +listmaker returns [exprType etype] +@after { + $listmaker.tree = $etype; +} + : t+=test[expr_contextType.Load] ( list_for -> ^(ListComp test list_for) - | (options {greedy=true;}:COMMA test[expr_contextType.Load])* -> ^(List ^(Elts test+)) + | (options {greedy=true;}:COMMA t+=test[expr_contextType.Load])* { + $etype = new org.python.antlr.ast.List($listmaker.start, actions.makeExprs($t), $expr::ctype); + } ) (COMMA)? ; //testlist_gexp: test ( gen_for | (',' test)* [','] ) testlist_gexp - : test[expr_contextType.Load] ( ((options {k=2;}: c1=COMMA test[expr_contextType.Load])* (c2=COMMA)? -> { $c1 != null || $c2 != null }? ^(Tuple ^(Elts test+)) - -> test - ) - | ( gen_for -> ^(GeneratorExp test gen_for)) - ) + : 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 -> ^(GeneratorExp test gen_for) + ) + ) ; //lambdef: 'lambda' [varargslist] ':' test lambdef: LAMBDA (varargslist)? COLON test[expr_contextType.Load] {debug("parsed lambda");} - -> ^(LAMBDA varargslist? ^(Body test)) + -> ^(LAMBDA<Lambda>[$LAMBDA, $varargslist.args, (exprType)$test.tree]) ; //trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME -trailer : LPAREN (arglist)? RPAREN -> ^(Call ^(Args arglist)?) - | LBRACK subscriptlist RBRACK -> ^(SubscriptList subscriptlist) - | DOT^ attr {debug("motched DOT^ NAME");} +trailer : LPAREN (arglist -> ^(LPAREN<Call>[$LPAREN, null, actions.makeExprs($arglist.args), actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs]) + | -> ^(LPAREN<Call>[$LPAREN, null, new exprType[0\], new keywordType[0\], null, null]) + ) + RPAREN + | LBRACK s=subscriptlist RBRACK -> $s + | DOT attr -> ^(DOT<Attribute>[$DOT, null, $attr.text, $expr::ctype]) ; //subscriptlist: subscript (',' subscript)* [','] -subscriptlist : subscript (options {greedy=true;}:c1=COMMA subscript)* (c2=COMMA)? - -> { $c1 != null || $c2 != null }? ^(Tuple ^(Elts subscript+)) - -> subscript - ; +//FIXME: tuples not always created when commas are present. +subscriptlist returns [exprType etype] +@after { + $subscriptlist.tree = $etype; +} + : sub+=subscript (options {greedy=true;}:COMMA sub+=subscript)* (COMMA)? { + sliceType s; + List sltypes = $sub; + if (sltypes.size() == 0) { + s = null; + } else if (sltypes.size() == 1){ + s = (sliceType)sltypes.get(0); + } else { + sliceType[] st; + //FIXME: here I am using ClassCastException to decide if sltypes is populated with Index + // only. Clearly this is not the best way to do this but it's late. Somebody do + // something better please :) -- (hopefully a note to self) + try { + Iterator iter = sltypes.iterator(); + List etypes = new ArrayList(); + while (iter.hasNext()) { + Index i = (Index)iter.next(); + etypes.add(i.value); + } + exprType[] es = (exprType[])etypes.toArray(new exprType[etypes.size()]); + exprType t = new Tuple($subscriptlist.start, es, expr_contextType.Load); + s = new Index($subscriptlist.start, t); + } catch (ClassCastException cc) { + st = (sliceType[])sltypes.toArray(new sliceType[sltypes.size()]); + s = new ExtSlice($subscriptlist.start, st); + } + } + $etype = new Subscript($subscriptlist.start, null, s, $expr::ctype); + } + ; //subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop] -subscript : DOT DOT DOT -> Ellipsis - | (test[expr_contextType.Load] COLON) => t1=test[expr_contextType.Load] (COLON (t2=test[expr_contextType.Load])? (sliceop)?)? -> ^(Subscript ^(Lower $t1) ^(Upper COLON ^(UpperOp $t2)?)? sliceop?) - | (COLON) => COLON (test[expr_contextType.Load])? (sliceop)? -> ^(Subscript ^(Upper COLON ^(UpperOp test)?)? sliceop?) - | test[expr_contextType.Load] -> ^(Index test) - ; +subscript returns [sliceType sltype] +@after { + if ($sltype != null) { + $subscript.tree = $sltype; + } +} + : DOT DOT DOT -> Ellipsis + | (test[expr_contextType.Load] COLON) => lower=test[expr_contextType.Load] (c1=COLON (upper1=test[expr_contextType.Load])? (sliceop)?)? { + $sltype = actions.makeSubscript($lower.tree, $c1, $upper1.tree, $sliceop.tree); + } + | (COLON) => c2=COLON (upper2=test[expr_contextType.Load])? (sliceop)? { + $sltype = actions.makeSubscript(null, $c2, $upper2.tree, $sliceop.tree); + } + | test[expr_contextType.Load] -> ^(PYNODE<Index>[$test.start, (exprType)$test.tree]) + ; //sliceop: ':' [test] -sliceop : COLON (test[expr_contextType.Load])? -> ^(Step COLON ^(StepOp test)?) +sliceop : COLON (test[expr_contextType.Load])? -> test ; //exprlist: expr (',' expr)* [','] -exprlist[expr_contextType ctype]: (expr[expr_contextType.Load] COMMA) => expr[ctype] (options {k=2;}: COMMA expr[ctype])* (COMMA)? -> ^(Tuple ^(Elts expr+)) - | expr[ctype] - ; +exprlist[expr_contextType ctype] returns [exprType etype] + : (expr[expr_contextType.Load] COMMA) => e+=expr[ctype] (options {k=2;}: COMMA e+=expr[ctype])* (COMMA)? { + $etype = new Tuple($exprlist.start, actions.makeExprs($e), ctype); + } + | expr[ctype] { + $etype = (exprType)$expr.tree; + } + ; //XXX: I'm hoping I can get rid of this -- but for now I need an exprlist that does not produce tuples // at least for del_stmt -exprlist2 : expr[expr_contextType.Load] (options {k=2;}: COMMA expr[expr_contextType.Load])* (COMMA)? - -> expr+ - ; +exprlist2 returns [List etypes] + : e+=expr[expr_contextType.Load] (options {k=2;}: COMMA e+=expr[expr_contextType.Load])* (COMMA)? + {$etypes = $e;} + ; //testlist: test (',' test)* [','] -testlist[expr_contextType ctype] - : test[ctype] (options {k=2;}: c1=COMMA test[ctype])* (c2=COMMA)? - -> { $c1 != null || $c2 != null }? ^(Tuple ^(Elts test+)) - -> test +testlist[expr_contextType ctype] returns [exprType etype] +@after { + $testlist.tree = $etype; +} + : (test[expr_contextType.Load] COMMA) => t+=test[ctype] (options {k=2;}: c1=COMMA t+=test[ctype])* (c2=COMMA)? { + $etype = new Tuple($testlist.start, actions.makeExprs($t), ctype); + } + | test[ctype] { + $etype = (exprType)$test.tree; + } ; //XXX: @@ -876,46 +1172,54 @@ ; //classdef: 'class' NAME ['(' [testlist] ')'] ':' suite -classdef: CLASS NAME (LPAREN testlist[expr_contextType.Load]? RPAREN)? COLON suite - -> ^(CLASS NAME ^(Bases testlist)? ^(Body suite)) +classdef +@init { + stmtType stype = null; +} +@after { + $classdef.tree = stype; +} + :CLASS NAME (LPAREN testlist[expr_contextType.Load]? RPAREN)? COLON suite { + stype = new ClassDef($CLASS, $NAME.getText(), actions.makeBases($testlist.etype), actions.makeStmts($suite.stmts)); + } ; //arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | '**' test) -arglist : a1=argument[true] (COMMA a2+=argument[false])* - ( COMMA - ( STAR starargs=test[expr_contextType.Load] (COMMA DOUBLESTAR kwargs=test[expr_contextType.Load])? - | DOUBLESTAR kwargs=test[expr_contextType.Load] - )? - )? { if ($a2 != null) { - if ($a1.tree.getType() == GenFor) { - actions.errorGenExpNotSoleArg($a1.tree); - } - for (int i=0;i<$a2.size();i++) { - if (((PythonTree)$a2.get(i)).getType() == GenFor) { - actions.errorGenExpNotSoleArg(((argument_return)$a2.get(i)).tree); - } - } - } - } - -> ^(Args argument+) ^(StarArgs $starargs)? ^(KWArgs $kwargs)? - | STAR starargs=test[expr_contextType.Load] (COMMA DOUBLESTAR kwargs=test[expr_contextType.Load])? - -> ^(StarArgs $starargs) ^(KWArgs $kwargs)? - | DOUBLESTAR kwargs=test[expr_contextType.Load] - -> ^(KWArgs $kwargs) +arglist returns [List args, List keywords, exprType starargs, exprType kwargs] +@init { + List arguments = new ArrayList(); + List kws = new ArrayList(); +} + : argument[arguments, kws] (COMMA argument[arguments, kws])* + ( COMMA + ( STAR s=test[expr_contextType.Load] (COMMA DOUBLESTAR k=test[expr_contextType.Load])? + | DOUBLESTAR k=test[expr_contextType.Load] + )? + )? { + $args=arguments; + $keywords=kws; + $starargs=(exprType)$s.tree; + $kwargs=(exprType)$k.tree; + } + | STAR s=test[expr_contextType.Load] (COMMA DOUBLESTAR k=test[expr_contextType.Load])? { + $starargs=(exprType)$s.tree; + $kwargs=(exprType)$k.tree; + } + | DOUBLESTAR k=test[expr_contextType.Load] { + $kwargs=(exprType)$k.tree; + } ; //argument: test [gen_for] | test '=' test # Really [keyword '='] test -argument[boolean first] +argument[List arguments, List kws] : t1=test[expr_contextType.Load] - ( (ASSIGN t2=test[expr_contextType.Load]) -> ^(Keyword ^(Arg $t1) ^(Value $t2)?) - | gen_for { if (!first) { - actions.errorGenExpNotSoleArg($gen_for.tree); - } - } - -> ^(GenFor $t1 gen_for) - | -> ^(Arg $t1) - ) - ; + ( (ASSIGN t2=test[expr_contextType.Load]) { + $kws.add(new exprType[]{(exprType)$t1.tree, (exprType)$t2.tree}); + } + | gen_for //FIXME + | {$arguments.add($t1.tree);} + ) + ; //list_iter: list_for | list_if list_iter : list_for @@ -924,7 +1228,7 @@ //list_for: 'for' exprlist 'in' testlist_safe [list_iter] list_for : FOR exprlist[expr_contextType.Load] IN testlist[expr_contextType.Load] (list_iter)? - -> ^(ListFor ^(Target exprlist) ^(IN testlist) ^(Ifs list_iter)?) + -> ^(FOR<comprehensionType>[$FOR, $exprlist.etype, $testlist.etype, null]) ; //list_if: 'if' test [list_iter] @@ -949,7 +1253,7 @@ //yield_expr: 'yield' [testlist] yield_expr : YIELD testlist[expr_contextType.Load]? - -> ^(YIELD ^(Value testlist)?) + -> ^(YIELD<Yield>[$YIELD, $testlist.etype]) ; //XXX: Deleted: branches/nowalker/grammar/PythonWalker.g =================================================================== --- branches/nowalker/grammar/PythonWalker.g 2008-08-19 21:17:36 UTC (rev 5209) +++ branches/nowalker/grammar/PythonWalker.g 2008-08-19 21:43:06 UTC (rev 5210) @@ -1,1286 +0,0 @@ -/* -Copyright (c) 2007-2008 Frank Wierzbicki -Licensed to PSF under a Contributor Agreement. -*/ -tree grammar PythonWalker; - -options { - tokenVocab=Python; - ASTLabelType=PythonTree; -} - -@header { -package org.python.antlr; - -import org.python.core.Py; -import org.python.core.PyObject; -import org.python.core.PyString; -import org.python.antlr.ParseException; -import org.python.antlr.ast.aliasType; -import org.python.antlr.ast.argumentsType; -import org.python.antlr.ast.boolopType; -import org.python.antlr.ast.comprehensionType; -import org.python.antlr.ast.cmpopType; -import org.python.antlr.ast.excepthandlerType; -import org.python.antlr.ast.exprType; -import org.python.antlr.ast.expr_contextType; -import org.python.antlr.ast.keywordType; -import org.python.antlr.ast.modType; -import org.python.antlr.ast.operatorType; -import org.python.antlr.ast.sliceType; -import org.python.antlr.ast.stmtType; -import org.python.antlr.ast.unaryopType; -import org.python.antlr.ast.Assert; -import org.python.antlr.ast.Assign; -import org.python.antlr.ast.Attribute; -import org.python.antlr.ast.AugAssign; -import org.python.antlr.ast.BinOp; -import org.python.antlr.ast.BoolOp; -import org.python.antlr.ast.Break; -import org.python.antlr.ast.Call; -import org.python.antlr.ast.ClassDef; -import org.python.antlr.ast.Compare; -import org.python.antlr.ast.Continue; -import org.python.antlr.ast.Delete; -import org.python.antlr.ast.Dict; -import org.python.antlr.ast.Ellipsis; -import org.python.antlr.ast.ErrorStmt; -import org.python.antlr.ast.Exec; -import org.python.antlr.ast.Expr; -import org.python.antlr.ast.Expression; -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; -import org.python.antlr.ast.Index; -import org.python.antlr.ast.Import; -import org.python.antlr.ast.ImportFrom; -import org.python.antlr.ast.Interactive; -import org.python.antlr.ast.Lambda; -import org.python.antlr.ast.ListComp; -import org.python.antlr.ast.Module; -import org.python.antlr.ast.Name; -import org.python.antlr.ast.Num; -import org.python.antlr.ast.Slice; -import org.python.antlr.ast.Subscript; -import org.python.antlr.ast.TryExcept; -import org.python.antlr.ast.TryFinally; -import org.python.antlr.ast.Tuple; -import org.python.antlr.ast.Pass; -import org.python.antlr.ast.Print; -import org.python.antlr.ast.Raise; -import org.python.antlr.ast.Repr; -import org.python.antlr.ast.Return; -import org.python.antlr.ast.Str; -import org.python.antlr.ast.UnaryOp; -import org.python.antlr.ast.With; -import org.python.antlr.ast.While; -import org.python.antlr.ast.Yield; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.ListIterator; -import java.util.Map; -import java.util.Set; -} -@members { - boolean debugOn = false; - private ErrorHandler errorHandler; - private GrammarActions actions = new GrammarActions(); - - public void setErrorHandler(ErrorHandler eh) { - this.errorHandler = eh; - actions.setErrorHandler(eh); - } - - public void debug(String message) { - if (debugOn) { - System.out.println(message); - } - } - - protected void mismatch(IntStream input, int ttype, BitSet follow) throws RecognitionException { - throw new MismatchedTokenException(ttype, input); - } - - protected void mismatch(IntStream input, RecognitionException e, BitSet follow) throws RecognitionException { - throw e; - } - - String name = "Test"; - - //XXX: Not sure I need any below... - String filename = "test.py"; - boolean linenumbers = true; - boolean setFile = true; - boolean printResults = false; - //CompilerFlags cflags = Py.getCompilerFlags(); - -} - -@rulecatch { -catch (RecognitionException re) { - errorHandler.reportError(this, re); - errorHandler.recover(this, input,re); -} -} - - -expression returns [modType mod] - : ^(Expression test[expr_contextType.Load]) { $mod = actions.makeExpression($Expression, $test.etype); } - ; - -interactive returns [modType mod] - : ^(Interactive stmts?) { $mod = actions.makeInteractive($Interactive, $stmts.stypes); } - ; - -module returns [modType mod] - : ^(Module - ( stmts {$mod = actions.makeMod($Module, $stmts.stypes); } - | {$mod = actions.makeMod($Module, null);} - ) - ) - ; - -funcdef - : ^(DEF NAME ^(Arguments varargslist?) ^(Body stmts) ^(Decorators decorators?)) { - $stmts::statements.add(actions.makeFunctionDef($DEF, $NAME, $varargslist.args, $stmts.stypes, $decorators.etypes)); - } - ; - -varargslist returns [argumentsType args] -@init { - List params = new ArrayList(); - List defaults = new ArrayList(); -} - : ^(Args defparameter[params, defaults]+) (^(StarArgs sname=NAME))? (^(KWArgs kname=NAME))? { - $args = actions.makeArgumentsType($Args, params, $sname, $kname, defaults); - } - | ^(StarArgs sname=NAME) (^(KWArgs kname=NAME))? { - $args = actions.makeArgumentsType($StarArgs,params, $sname, $kname, defaults); - } - | ^(KWArgs NAME) { - $args = actions.makeArgumentsType($KWArgs, params, null, $NAME, defaults); - } - ; - -defparameter[List params, List defaults] - : fpdef[expr_contextType.Param, null] (ASSIGN test[expr_contextType.Load])? { - params.add($fpdef.etype); - if ($ASSIGN != null) { - defaults.add($test.etype); - } else if (!defaults.isEmpty()) { - throw new ParseException( - "non-default argument follows default argument", - $fpdef.start); - } - } - ; - -fpdef [expr_contextType ctype, List nms] returns [exprType etype] - : NAME { - exprType e = new Name($NAME, $NAME.text, ctype); - actions.checkAssign(e); - if (nms == null) { - $etype = e; - } else { - nms.add(e); - } - } - | ^(FpList fplist) { - exprType[] e = (exprType[])$fplist.etypes.toArray(new exprType[$fplist.etypes.size()]); - Tuple t = new Tuple($fplist.start, e, expr_contextType.Store); - if (nms == null) { - $etype = t; - } else { - nms.add(t); - } - } - ; - -fplist returns [List etypes] -@init { - List nms = new ArrayList(); -} - : fpdef[expr_contextType.Store, nms]+ { - $etypes = nms; - } - ; - -decorators returns [List etypes] -@init { - List decs = new ArrayList(); -} - : decorator[decs]+ { - $etypes = decs; - } - ; - -decorator [List decs] - : ^(AT dotted_attr (^(Call (^(Args arglist))?))?) { - if ($Call == null) { - decs.add($dotted_attr.etype); - } else { - exprType c; - if ($Args == null) { - c = actions.makeCall($Call, $dotted_attr.etype); - } else { - c = actions.makeCall($Call, $dotted_attr.etype, $arglist.args, $arglist.keywords, $arglist.starargs, $arglist.kwargs); - } - c.setCharStopIndex($Call.getCharStopIndex()); - decs.add(c); - } - } - ; - -dotted_attr returns [exprType etype, PythonTree marker] - : attr { - $etype = new Name($attr.start, $attr.text, expr_contextType.Load); - $marker = $attr.start; - debug("matched NAME in dotted_attr");} - | ^(DOT n1=dotted_attr n2=dotted_attr) { - $etype = new Attribute($n1.marker, $n1.etype, $n2.text, expr_contextType.Load); - $marker = $n1.marker; - } - ; - -//attr is here for Java compatibility. A Java foo.getIf() can be called from Jython as foo.if -// so we need to support any keyword as an attribute. -attr - : NAME - | AND - | AS - | ASSERT - | BREAK - | CLASS - | CONTINUE - | DEF - | DELETE - | ELIF - | EXCEPT - | EXEC - | FINALLY - | FROM - | FOR - | GLOBAL - | IF - | IMPORT - | IN - | IS - | LAMBDA - | NOT - | OR - | ORELSE - | PASS - | PRINT - | RAISE - | RETURN - | TRY - | WHILE - | WITH - | YIELD - ; - -stmts returns [List stypes] -scope { - List statements; -} -@init { - $stmts::statements = new ArrayList(); -} - : stmt+ { - debug("Matched stmts"); - $stypes = $stmts::statements; - } - | INDENT stmt+ DEDENT { - debug("Matched stmts"); - $stypes = $stmts::statements; - } - ; - -stmt //combines simple_stmt and compound_stmt from Python.g - : expr_stmt - | print_stmt - | del_stmt - | pass_stmt - | flow_stmt - | import_stmt - | global_stmt - | exec_stmt - | assert_stmt - | if_stmt - | while_stmt - | for_stmt - | try_stmt - | with_stmt - | funcdef - | classdef - ; - -expr_stmt - : test[expr_contextType.Load] { - debug("matched expr_stmt:test " + $test.etype); - $stmts::statements.add(new Expr($test.marker, $test.etype)); - } - | ^(augassign targ=test[expr_contextType.AugStore] value=test[expr_contextType.Load]) { - actions.checkAssign($targ.etype); - AugAssign a = new AugAssign($targ.marker, $targ.etype, $augassign.op, $value.etype); - $stmts::statements.add(a); - } - | ^(Assign targets ^(Value value=test[expr_contextType.Load])) { - debug("Matched Assign"); - exprType[] e = new exprType[$targets.etypes.size()]; - for(int i=0;i<$targets.etypes.size();i++) { - e[i] = (exprType)$targets.etypes.get(i); - } - debug("exprs: " + e.length); - Assign a = new Assign($Assign, e, $value.etype); - $stmts::statements.add(a); - } - ; - -call_expr returns [exprType etype, PythonTree marker] - : ^(Call (^(Args arglist))? test[expr_contextType.Load]) { - exprType c; - if ($Args == null) { - c = actions.makeCall($test.marker, $test.etype); - } else { - c = actions.makeCall($test.marker, $test.etype, $arglist.args, $arglist.keywords, $arglist.starargs, $arglist.kwargs); - } - c.setCharStopIndex($Call.getCharStopIndex()); - $etype = c; - } - ; - -targets returns [List etypes] -@init { - List targs = new ArrayList(); -} - : target[targs]+ { - $etypes = targs; - } - ; - -target[List etypes] - : ^(Target atom[expr_contextType.Store]) { - actions.checkAssign($atom.etype); - etypes.add($atom.etype); - } - ; - -augassign returns [operatorType op] - : PLUSEQUAL {$op = operatorType.Add;} - | MINUSEQUAL {$op = operatorType.Sub;} - | STAREQUAL {$op = operatorType.Mult;} - | SLASHEQUAL {$op = operatorType.Div;} - | PERCENTEQUAL {$op = operatorType.Mod;} - | AMPEREQUAL {$op = operatorType.BitAnd;} - | VBAREQUAL {$op = operatorType.BitOr;} - | CIRCUMFLEXEQUAL {$op = operatorType.BitXor;} - | LEFTSHIFTEQUAL {$op = operatorType.LShift;} - | RIGHTSHIFTEQUAL {$op = operatorType.RShift;} - | DOUBLESTAREQUAL {$op = operatorType.Pow;} - | DOUBLESLASHEQUAL {$op = operatorType.FloorDiv;} - ; - -binop returns [operatorType op] - : PLUS {$op = operatorType.Add;} - | MINUS {$op = operatorType.Sub;} - | STAR {$op = operatorType.Mult;} - | SLASH {$op = operatorType.Div;} - | PERCENT {$op = operatorType.Mod;} - | AMPER {$op = operatorType.BitAnd;} - | VBAR {$op = operato... [truncated message content] |
From: <fwi...@us...> - 2008-08-20 12:10:31
|
Revision: 5216 http://jython.svn.sourceforge.net/jython/?rev=5216&view=rev Author: fwierzbicki Date: 2008-08-20 12:10:26 +0000 (Wed, 20 Aug 2008) Log Message: ----------- Much better BoolOp. Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/GrammarActions.java branches/nowalker/src/org/python/antlr/ast/BoolOp.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-20 06:54:10 UTC (rev 5215) +++ branches/nowalker/grammar/Python.g 2008-08-20 12:10:26 UTC (rev 5216) @@ -776,52 +776,6 @@ //test: or_test ['if' or_test 'else' test] | lambdef test[expr_contextType ctype] -@after { - if ($test.tree instanceof BoolOp) { - BoolOp b = (BoolOp)$test.tree; - List values = new ArrayList(); - - exprType left = (exprType)b.getChild(0); - exprType right = (exprType)b.getChild(1); - - exprType[] e; - if (left.getType() == b.getType() && right.getType() == b.getType()) { - BoolOp leftB = (BoolOp)left; - BoolOp rightB = (BoolOp)right; - int lenL = leftB.values.length; - int lenR = rightB.values.length; - e = new exprType[lenL + lenR]; - System.arraycopy(leftB.values, 0, e, 0, lenL - 1); - System.arraycopy(rightB.values, 0, e, lenL - 1, lenL + lenR); - } else if (left.getType() == b.getType()) { - BoolOp leftB = (BoolOp)left; - e = new exprType[leftB.values.length + 1]; - System.arraycopy(leftB.values, 0, e, 0, leftB.values.length); - e[e.length - 1] = right; - } else if (right.getType() == b.getType()) { - BoolOp rightB = (BoolOp)right; - e = new exprType[rightB.values.length + 1]; - System.arraycopy(rightB.values, 0, e, 0, rightB.values.length); - e[e.length - 1] = left; - } else { - e = new exprType[2]; - e[0] = left; - e[1] = right; - } - b.values = e; - switch (b.getType()) { - case AND: - b.op = boolopType.And; - break; - case OR: - b.op = boolopType.Or; - break; - default: - b.op = boolopType.UNDEFINED; - } - } -} - :o1=or_test[ctype] ( (IF or_test[expr_contextType.Load] ORELSE) => IF o2=or_test[ctype] ORELSE test[expr_contextType.Load] -> ^(IfExp ^(Test $o2) ^(Body $o1) ^(ORELSE test)) @@ -831,12 +785,32 @@ ; //or_test: and_test ('or' and_test)* -or_test[expr_contextType ctype] : and_test[ctype] (OR<BoolOp>^ and_test[ctype])* - ; +or_test[expr_contextType ctype] +@after { + if ($or != null) { + $or_test.tree = actions.makeBoolOp($left.tree, boolopType.Or, $right); + } +} + : left=and_test[ctype] + ( (or=OR right+=and_test[ctype] + )+ + | -> $left + ) + ; //and_test: not_test ('and' not_test)* -and_test[expr_contextType ctype] : not_test[ctype] (AND<BoolOp>^ not_test[ctype])* - ; +and_test[expr_contextType ctype] +@after { + if ($and != null) { + $and_test.tree = actions.makeBoolOp($left.tree, boolopType.And, $right); + } +} + : left=not_test[ctype] + ( (and=AND right+=not_test[ctype] + )+ + | + ) -> $left + ; //not_test: 'not' not_test | comparison not_test[expr_contextType ctype] returns [exprType etype] @@ -850,7 +824,6 @@ ; //comparison: expr (comp_op expr)* -//comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' comparison[expr_contextType ctype] @init { List cmps = new ArrayList(); Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-20 06:54:10 UTC (rev 5215) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-20 12:10:26 UTC (rev 5216) @@ -724,4 +724,11 @@ } return new cmpopType[0]; } + + BoolOp makeBoolOp(PythonTree left, boolopType op, List right) { + List values = new ArrayList(); + values.add(left); + values.addAll(right); + return new BoolOp(left, op, makeExprs(values)); + } } Modified: branches/nowalker/src/org/python/antlr/ast/BoolOp.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/BoolOp.java 2008-08-20 06:54:10 UTC (rev 5215) +++ branches/nowalker/src/org/python/antlr/ast/BoolOp.java 2008-08-20 12:10:26 UTC (rev 5216) @@ -12,10 +12,6 @@ public static final String[] _fields = new String[] {"op","values"}; - public BoolOp(Token token) { - super(token); - } - public BoolOp(Token token, boolopType op, exprType[] values) { super(token); this.op = op; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-20 15:51:12
|
Revision: 5222 http://jython.svn.sourceforge.net/jython/?rev=5222&view=rev Author: fwierzbicki Date: 2008-08-20 15:49:38 +0000 (Wed, 20 Aug 2008) Log Message: ----------- Added Ellipsis and merged with trunk. Modified Paths: -------------- branches/nowalker/Lib/pkgutil.py branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/compiler/Module.java branches/nowalker/src/org/python/core/PyBaseException.java branches/nowalker/src/org/python/core/PyFrame.java branches/nowalker/src/org/python/core/PyObject.java branches/nowalker/src/org/python/core/__builtin__.java branches/nowalker/src/org/python/core/imp.java branches/nowalker/src/org/python/modules/zipimport/zipimporter.java branches/nowalker/src/shell/jython.bat Property Changed: ---------------- branches/nowalker/ Property changes on: branches/nowalker ___________________________________________________________________ Modified: svnmerge-integrated - /trunk/jython:1-5208 + /trunk/jython:1-5221 Modified: branches/nowalker/Lib/pkgutil.py =================================================================== --- branches/nowalker/Lib/pkgutil.py 2008-08-20 15:39:29 UTC (rev 5221) +++ branches/nowalker/Lib/pkgutil.py 2008-08-20 15:49:38 UTC (rev 5222) @@ -22,7 +22,7 @@ # accessed by _imp here def read_jython_code(fullname, file, filename): - data = _imp.unmarshalCode(filename, file, False) + data = _imp.readCode(filename, file, False) return BytecodeLoader.makeCode(fullname + "$py", data, filename) def simplegeneric(func): Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-20 15:39:29 UTC (rev 5221) +++ branches/nowalker/grammar/Python.g 2008-08-20 15:49:38 UTC (rev 5222) @@ -117,6 +117,7 @@ import org.python.antlr.ast.Continue; import org.python.antlr.ast.Delete; import org.python.antlr.ast.Dict; +import org.python.antlr.ast.Ellipsis; import org.python.antlr.ast.excepthandlerType; import org.python.antlr.ast.Exec; import org.python.antlr.ast.Expr; @@ -1092,7 +1093,7 @@ $subscript.tree = $sltype; } } - : DOT DOT DOT -> Ellipsis + : d1=DOT DOT DOT -> DOT<Ellipsis>[$d1] | (test[expr_contextType.Load] COLON) => lower=test[expr_contextType.Load] (c1=COLON (upper1=test[expr_contextType.Load])? (sliceop)?)? { $sltype = actions.makeSubscript($lower.tree, $c1, $upper1.tree, $sliceop.tree); } Modified: branches/nowalker/src/org/python/compiler/Module.java =================================================================== --- branches/nowalker/src/org/python/compiler/Module.java 2008-08-20 15:39:29 UTC (rev 5221) +++ branches/nowalker/src/org/python/compiler/Module.java 2008-08-20 15:49:38 UTC (rev 5222) @@ -405,6 +405,29 @@ CodeCompiler compiler = new CodeCompiler(this, printResults); + if (classBody) { + Label label_got_name = new Label(); + int module_tmp = c.getLocal("org/python/core/PyObject"); + + c.aload(1); + c.ldc("__module__"); + c.invokevirtual("org/python/core/PyFrame", "getname_or_null", "(" + $str + ")" + $pyObj); + c.dup(); + c.ifnonnull(label_got_name); + + c.pop(); + c.aload(1); + c.ldc("__name__"); + c.invokevirtual("org/python/core/PyFrame", "getname_or_null", "(" + $str + ")" + $pyObj); + + c.label(label_got_name); + c.astore(module_tmp); + c.aload(1); + c.ldc("__module__"); + c.aload(module_tmp); + c.invokevirtual("org/python/core/PyFrame", "setlocal", "(" + $str + $pyObj + ")V"); + } + Label genswitch = new Label(); if (scope.generator) { c.goto_(genswitch); Modified: branches/nowalker/src/org/python/core/PyBaseException.java =================================================================== --- branches/nowalker/src/org/python/core/PyBaseException.java 2008-08-20 15:39:29 UTC (rev 5221) +++ branches/nowalker/src/org/python/core/PyBaseException.java 2008-08-20 15:49:38 UTC (rev 5222) @@ -166,23 +166,20 @@ } } + @Override public String toString() { - return __repr__().toString(); + return BaseException_toString(); } - - public PyString __repr__() { - return BaseException___repr__(); - } - @ExposedMethod - final PyString BaseException___repr__() { + @ExposedMethod(names = ("__repr__")) + final String BaseException_toString() { PyObject reprSuffix = args.__repr__(); String name = getType().fastGetName(); int lastDot = name.lastIndexOf('.'); if (lastDot != -1) { name = name.substring(lastDot + 1); } - return Py.newString(name + reprSuffix.toString()); + return name + reprSuffix.toString(); } @ExposedSet(name = "args") Modified: branches/nowalker/src/org/python/core/PyFrame.java =================================================================== --- branches/nowalker/src/org/python/core/PyFrame.java 2008-08-20 15:39:29 UTC (rev 5221) +++ branches/nowalker/src/org/python/core/PyFrame.java 2008-08-20 15:49:38 UTC (rev 5222) @@ -282,6 +282,20 @@ throw Py.NameError(String.format(NAME_ERROR_MSG, index)); } + public PyObject getname_or_null(String index) { + PyObject ret; + if (f_locals == null || f_locals == f_globals) { + ret = doGetglobal(index); + } else { + ret = f_locals.__finditem__(index); + if (ret != null) { + return ret; + } + ret = doGetglobal(index); + } + return ret; + } + public PyObject getglobal(String index) { PyObject ret = doGetglobal(index); if (ret != null) { Modified: branches/nowalker/src/org/python/core/PyObject.java =================================================================== --- branches/nowalker/src/org/python/core/PyObject.java 2008-08-20 15:39:29 UTC (rev 5221) +++ branches/nowalker/src/org/python/core/PyObject.java 2008-08-20 15:49:38 UTC (rev 5222) @@ -281,7 +281,7 @@ * * @param arg0 the first argument to the function. * @param arg1 the second argument to the function. -n **/ + **/ public PyObject __call__(PyObject arg0, PyObject arg1) { return __call__(new PyObject[] { arg0, arg1 }, Py.NoKeywords); } Modified: branches/nowalker/src/org/python/core/__builtin__.java =================================================================== --- branches/nowalker/src/org/python/core/__builtin__.java 2008-08-20 15:39:29 UTC (rev 5221) +++ branches/nowalker/src/org/python/core/__builtin__.java 2008-08-20 15:49:38 UTC (rev 5222) @@ -1410,7 +1410,7 @@ @Override public String toString() { - return "<built-in function min>"; + return "<built-in function max>"; } private static PyObject max(PyObject o, PyObject key) { Modified: branches/nowalker/src/org/python/core/imp.java =================================================================== --- branches/nowalker/src/org/python/core/imp.java 2008-08-20 15:39:29 UTC (rev 5221) +++ branches/nowalker/src/org/python/core/imp.java 2008-08-20 15:49:38 UTC (rev 5222) @@ -87,7 +87,7 @@ static PyObject createFromPyClass(String name, InputStream fp, boolean testing, String fileName) { - byte[] data = unmarshalCode(name, fp, testing); + byte[] data = readCode(name, fp, testing); if (testing && data == null) { return null; } @@ -107,8 +107,7 @@ return createFromCode(name, code, fileName); } - public static byte[] unmarshalCode(String name, InputStream fp, - boolean testing) { + public static byte[] readCode(String name, InputStream fp, boolean testing) { byte[] data = readBytes(fp); int n = data.length; Modified: branches/nowalker/src/org/python/modules/zipimport/zipimporter.java =================================================================== --- branches/nowalker/src/org/python/modules/zipimport/zipimporter.java 2008-08-20 15:39:29 UTC (rev 5221) +++ branches/nowalker/src/org/python/modules/zipimport/zipimporter.java 2008-08-20 15:49:38 UTC (rev 5222) @@ -6,6 +6,7 @@ import java.io.InputStream; import java.util.Date; import java.util.Enumeration; +import java.util.EnumSet; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -51,19 +52,22 @@ /** zip_searchorder defines how we search for a module in the Zip * archive */ - static final int IS_SOURCE = 0; - static final int IS_BYTECODE = 1; - static final int IS_PACKAGE = 2; + static enum EntryType { + IS_SOURCE, IS_BYTECODE, IS_PACKAGE + }; static final SearchOrderEntry[] zip_searchorder = new SearchOrderEntry[] { - new SearchOrderEntry(File.separator + "__init__$py.class", IS_PACKAGE | IS_BYTECODE), - new SearchOrderEntry(File.separator + "__init__.py", IS_PACKAGE | IS_SOURCE), - new SearchOrderEntry("$py.class", IS_BYTECODE), - new SearchOrderEntry(".py", IS_SOURCE), - new SearchOrderEntry("", 0) + new SearchOrderEntry(File.separator + "__init__$py.class", + EnumSet.of(EntryType.IS_PACKAGE, EntryType.IS_BYTECODE)), + new SearchOrderEntry(File.separator + "__init__.py", + EnumSet.of(EntryType.IS_PACKAGE, EntryType.IS_SOURCE)), + new SearchOrderEntry("$py.class", EnumSet.of(EntryType.IS_BYTECODE)), + new SearchOrderEntry(".py", EnumSet.of(EntryType.IS_SOURCE)), }; /** Module information */ - static enum ModuleInfo {ERROR, NOT_FOUND, MODULE, PACKAGE}; + static enum ModuleInfo { + ERROR, NOT_FOUND, MODULE, PACKAGE + }; /** Pathname of the Zip archive */ @ExposedGet @@ -366,7 +370,7 @@ if (tocEntry == null) continue; - if ((entry.type & IS_PACKAGE) == IS_PACKAGE) { + if (entry.type.contains(EntryType.IS_PACKAGE)) { return ModuleInfo.PACKAGE; } return ModuleInfo.MODULE; @@ -399,8 +403,8 @@ continue; } - boolean ispackage = (entry.type & IS_PACKAGE) == IS_PACKAGE; - boolean isbytecode = (entry.type & IS_BYTECODE) == IS_BYTECODE; + boolean ispackage = entry.type.contains(EntryType.IS_PACKAGE); + boolean isbytecode = entry.type.contains(EntryType.IS_BYTECODE); if (isbytecode && isOutdatedBytecode(searchPath, tocEntry)) { continue; @@ -410,7 +414,7 @@ ZipBundle zipBundle = getDataStream(searchPath); byte[] codeBytes; if (isbytecode) { - codeBytes = imp.unmarshalCode(fullname, zipBundle.inputStream, true); + codeBytes = imp.readCode(fullname, zipBundle.inputStream, true); } else { codeBytes = imp.compileSource(fullname, zipBundle.inputStream, pathToEntry); @@ -422,7 +426,6 @@ continue; } - imp.cacheCompiledSource(pathToEntry, null, codeBytes); PyCode code = BytecodeLoader.makeCode(fullname + "$py", codeBytes, pathToEntry); return new ModuleCodeData(code, ispackage, pathToEntry); } @@ -661,9 +664,9 @@ */ protected static class SearchOrderEntry { public String suffix; - public int type; + public EnumSet type; - public SearchOrderEntry(String suffix, int type) { + public SearchOrderEntry(String suffix, EnumSet type) { this.suffix = suffix; this.type = type; } Modified: branches/nowalker/src/shell/jython.bat =================================================================== --- branches/nowalker/src/shell/jython.bat 2008-08-20 15:39:29 UTC (rev 5221) +++ branches/nowalker/src/shell/jython.bat 2008-08-20 15:49:38 UTC (rev 5222) @@ -18,10 +18,10 @@ set _JAVA_CMD=java if not "%JAVA_HOME%" == "" ( - set _JAVA_CMD="%JAVA_HOME%\bin\java" + set _JAVA_CMD="%JAVA_HOME:"=%\bin\java" ) -set _JYTHON_HOME="%JYTHON_HOME%" +set _JYTHON_HOME=%JYTHON_HOME% if not "%JYTHON_HOME%" == "" goto gotHome pushd "%~dp0%\.." set _JYTHON_HOME="%CD%" @@ -32,7 +32,7 @@ rem prefer built version set _CP=%_JYTHON_HOME%\jython.jar for %%j in (%_JYTHON_HOME%\javalib\*.jar) do ( - set _CP=!_CP!;"%%j" + set _CP=!_CP!;"%%j" ) goto run @@ -48,13 +48,103 @@ rem ----- Execute the requested command ---------------------------------------- :run -%_JAVA_CMD% %JAVA_OPTS% -Xss512k -Xbootclasspath/a:%_CP% -Dpython.home=%_JYTHON_HOME% -Dpython.executable="%~f0" -classpath "%CLASSPATH%" org.python.util.jython %JYTHON_OPTS% %* +set _JAVA_STACK=-Xss512k + +rem Escape any quotes. Use _S for ', _D for ", and _U to escape _ itself. +rem We have to escape _ itself, otherwise file names with _S and _D +rem will be converted to to wrong ones, when we un-escape. See JRUBY-2821. +set _ARGS=%* +if not defined _ARGS goto argsDone +set _ARGS=%_ARGS:_=_U% +set _ARGS=%_ARGS:'=_S% +set _ARGS=%_ARGS:"=_D% + +set _ARGS="%_ARGS%" + +:scanArgs +rem split args by spaces into first and rest +for /f "tokens=1,*" %%i in (%_ARGS%) do call :getArg "%%i" "%%j" +goto procArg + +:getArg +rem remove quotes around first arg +for %%i in (%1) do set _CMP=%%~i +set _ARGS=%2 +goto :EOF + +:procArg +if ["%_CMP%"] == [""] ( + set _ARGS= + goto argsDone +) + +REM NOTE: If you'd like to use a parameter with underscore in its name, +REM NOTE: use the quoted value: --do_stuff -> --do_Ustuff + +if ["%_CMP%"] == ["--"] goto argsDone + +if ["%_CMP%"] == ["--jdb"] ( + if "%JAVA_HOME%" == "" ( + set _JAVA_CMD=jdb + ) else ( + set _JAVA_CMD="%_JAVA_HOME:"=%\bin\jdb" + ) + goto :nextArg +) + +if ["%_CMP%"] == ["--verify"] ( + set CLASSPATH=%_CP:"=%;%CLASSPATH:"=% + set _CP= + goto :nextArg +) + +rem now unescape _D, _S and _Q +set _CMP=%_CMP:_D="% +set _CMP=%_CMP:_S='% +set _CMP=%_CMP:_U=_% +set _CMP1=%_CMP:~0,1% +set _CMP2=%_CMP:~0,2% + +rem detect first character is a quote; skip directly to jythonArg +rem this avoids a batch syntax error +if "%_CMP1:"=\\%" == "\\" goto jythonArg + +rem removing quote avoids a batch syntax error +if "%_CMP2:"=\\%" == "-J" goto jvmArg + +:jythonArg +set JYTHON_OPTS=%JYTHON_OPTS% %_CMP% +goto nextArg + +:jvmArg +set _VAL=%_CMP:~2% + +if "%_VAL:~0,4%" == "-Xss" ( + set _JAVA_STACK=%_VAL% + echo %_VAL% + goto nextArg +) + +set _JAVA_OPTS=%_JAVA_OPTS% %_VAL% + +:nextArg +set _CMP= +goto scanArgs + +:argsDone +%_JAVA_CMD% %_JAVA_OPTS% %_JAVA_STACK% -Xbootclasspath/a:%_CP% -Dpython.home=%_JYTHON_HOME% -Dpython.executable="%~f0" -classpath "%CLASSPATH%" org.python.util.jython %JYTHON_OPTS% %_ARGS% set E=%ERRORLEVEL% :cleanup +set _ARGS= +set _CMP= +set _CMP1= +set _CMP2= +set _CP= +set _JAVA_CMD= +set _JAVA_OPTS= +set _JAVA_STACK= set _JYTHON_HOME= -set _JAVA_CMD= -set _CP= :finish exit /b %E% This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-20 19:57:42
|
Revision: 5223 http://jython.svn.sourceforge.net/jython/?rev=5223&view=rev Author: fwierzbicki Date: 2008-08-20 19:57:39 +0000 (Wed, 20 Aug 2008) Log Message: ----------- Start of list comprehensions and generator expressions. Modified Paths: -------------- branches/nowalker/build.xml branches/nowalker/grammar/Python.g Modified: branches/nowalker/build.xml =================================================================== --- branches/nowalker/build.xml 2008-08-20 15:49:38 UTC (rev 5222) +++ branches/nowalker/build.xml 2008-08-20 19:57:39 UTC (rev 5223) @@ -318,9 +318,7 @@ change to grammar files. If you are working on the grammars you might want to comment this out, as a clean is really only needed if you change the tokens defined in Python.g (and cleans make the build slow) --> - <antcall target="clean"/> <!-- force jarjar build --> - <property name="jarjar.needed" value="true" /> </target> <target name ="prepare-output" depends="init,needed-check,clean-if-antlr-needed,make-output-dirs"/> Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-20 15:49:38 UTC (rev 5222) +++ branches/nowalker/grammar/Python.g 2008-08-20 19:57:39 UTC (rev 5223) @@ -78,17 +78,7 @@ PYNODE; Interactive; Expression; - Ellipsis; - ListComp; - Target; GeneratorExp; - Ifs; - Elts; - - GenFor; - GenIf; - ListIf; - } @header { @@ -133,6 +123,7 @@ import org.python.antlr.ast.ImportFrom; import org.python.antlr.ast.Index; import org.python.antlr.ast.keywordType; +import org.python.antlr.ast.ListComp; import org.python.antlr.ast.Lambda; import org.python.antlr.ast.modType; import org.python.antlr.ast.Module; @@ -162,6 +153,7 @@ import org.python.core.PyUnicode; import java.math.BigInteger; +import java.util.Collections; import java.util.Iterator; import java.util.ListIterator; } @@ -1011,26 +1003,37 @@ ; //listmaker: test ( list_for | (',' test)* [','] ) -listmaker returns [exprType etype] +listmaker +@init { + List gens = new ArrayList(); + exprType etype = null; +} @after { - $listmaker.tree = $etype; + $listmaker.tree = etype; } : t+=test[expr_contextType.Load] - ( list_for -> ^(ListComp test list_for) + ( list_for[gens] { + Collections.reverse(gens); + comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); + etype = new ListComp($listmaker.start, (exprType)$t.get(0), c); + } | (options {greedy=true;}:COMMA t+=test[expr_contextType.Load])* { - $etype = new org.python.antlr.ast.List($listmaker.start, actions.makeExprs($t), $expr::ctype); + etype = new org.python.antlr.ast.List($listmaker.start, actions.makeExprs($t), $expr::ctype); } ) (COMMA)? ; //testlist_gexp: test ( gen_for | (',' test)* [','] ) testlist_gexp +@init { + List gens = new ArrayList(); +} : 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 -> ^(GeneratorExp test gen_for) + | ( gen_for[gens] -> ^(GeneratorExp test gen_for) ) ) ; @@ -1194,44 +1197,73 @@ //argument: test [gen_for] | test '=' test # Really [keyword '='] test argument[List arguments, List kws] +@init { + List gens = new ArrayList(); +} : t1=test[expr_contextType.Load] ( (ASSIGN t2=test[expr_contextType.Load]) { $kws.add(new exprType[]{(exprType)$t1.tree, (exprType)$t2.tree}); } - | gen_for //FIXME + | gen_for[gens] //FIXME | {$arguments.add($t1.tree);} ) ; //list_iter: list_for | list_if -list_iter : list_for - | list_if - ; +list_iter [List gens] returns [exprType etype] + : list_for[gens] + | list_if[gens] { + $etype = $list_if.etype; + } + ; //list_for: 'for' exprlist 'in' testlist_safe [list_iter] -list_for : FOR exprlist[expr_contextType.Load] IN testlist[expr_contextType.Load] (list_iter)? - -> ^(FOR<comprehensionType>[$FOR, $exprlist.etype, (exprType)$testlist.tree, null]) - ; +list_for [List gens] + : FOR exprlist[expr_contextType.Load] IN testlist[expr_contextType.Load] (list_iter[gens])? { + exprType[] e; + if ($list_iter.etype != null) { + e = new exprType[]{$list_iter.etype}; + } else { + e = new exprType[0]; + } + gens.add(new comprehensionType($FOR, $exprlist.etype, (exprType)$testlist.tree, e)); + } + ; //list_if: 'if' test [list_iter] -list_if : IF test[expr_contextType.Load] (list_iter)? - -> ^(ListIf ^(Target test) (Ifs list_iter)?) - ; +list_if[List gens] returns [exprType etype] + : IF test[expr_contextType.Load] (list_iter[gens])? { + $etype = (exprType)$test.tree; + } + ; //gen_iter: gen_for | gen_if -gen_iter: gen_for - | gen_if - ; +gen_iter [List gens] returns [exprType etype] + : gen_for[gens] + | gen_if[gens] { + $etype = $gen_if.etype; + } + ; //gen_for: 'for' exprlist 'in' or_test [gen_iter] -gen_for: FOR exprlist[expr_contextType.Load] IN or_test[expr_contextType.Load] gen_iter? - -> ^(GenFor ^(Target exprlist) ^(IN or_test) ^(Ifs gen_iter)?) +gen_for [List gens] + :FOR exprlist[expr_contextType.Load] IN or_test[expr_contextType.Load] gen_iter[gens]? { + exprType[] e; + if ($gen_iter.etype != null) { + e = new exprType[]{$gen_iter.etype}; + } else { + e = new exprType[0]; + } + gens.add(new comprehensionType($FOR, $exprlist.etype, (exprType)$or_test.tree, e)); + } ; //gen_if: 'if' old_test [gen_iter] -gen_if: IF test[expr_contextType.Load] gen_iter? - -> ^(GenIf ^(Target test) ^(Ifs gen_iter)?) - ; +gen_if[List gens] returns [exprType etype] + : IF test[expr_contextType.Load] gen_iter[gens]? { + $etype = (exprType)$test.tree; + } + ; //yield_expr: 'yield' [testlist] yield_expr : YIELD testlist[expr_contextType.Load]? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-21 02:58:26
|
Revision: 5228 http://jython.svn.sourceforge.net/jython/?rev=5228&view=rev Author: fwierzbicki Date: 2008-08-21 02:58:24 +0000 (Thu, 21 Aug 2008) Log Message: ----------- debugging of some expr_contextType values. Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/GrammarActions.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-20 23:01:42 UTC (rev 5227) +++ branches/nowalker/grammar/Python.g 2008-08-21 02:58:24 UTC (rev 5228) @@ -411,7 +411,7 @@ //fpdef: NAME | '(' fplist ')' fpdef[expr_contextType ctype] : NAME -> ^(PYNODE<Name>[$NAME, $NAME.text, ctype]) - | (LPAREN fpdef[expr_contextType.Load] COMMA) => LPAREN fplist RPAREN + | (LPAREN fpdef[null] COMMA) => LPAREN fplist RPAREN -> fplist | LPAREN fplist RPAREN -> ^(LPAREN<Tuple>[$fplist.start, actions.makeExprs($fplist.etypes), expr_contextType.Store]) @@ -458,11 +458,11 @@ } : - ((testlist[expr_contextType.Load] augassign) => lhs=testlist[expr_contextType.AugStore] + ((testlist[null] augassign) => lhs=testlist[expr_contextType.AugStore] ( (aay=augassign y1=yield_expr {stype = new AugAssign($lhs.tree, (exprType)$lhs.tree, $aay.op, (exprType)$y1.tree);}) | (aat=augassign rhs=testlist[expr_contextType.Load] {stype = new AugAssign($lhs.tree, (exprType)$lhs.tree, $aat.op, (exprType)$rhs.tree);}) ) - |(testlist[expr_contextType.Load] ASSIGN) => lhs=testlist[expr_contextType.Store] + |(testlist[null] ASSIGN) => lhs=testlist[expr_contextType.Store] ( | ((at=ASSIGN t+=testlist[expr_contextType.Store])+ -> ^(PYNODE<Assign>[$at, actions.makeAssignTargets((exprType)$lhs.tree, $t), actions.makeAssignValue($t)])) | ((ay=ASSIGN y2+=yield_expr)+ -> ^(PYNODE<Assign>[$ay, actions.makeAssignTargets((exprType)$lhs.tree, $y2), actions.makeAssignValue($y2)])) @@ -502,7 +502,7 @@ //not in CPython's Grammar file printlist returns [boolean newline, List elts] - : (test[expr_contextType.Load] COMMA) => + : (test[null] COMMA) => t+=test[expr_contextType.Load] (options {k=2;}: COMMA t+=test[expr_contextType.Load])* (trailcomma=COMMA)? { $elts=$t; if ($trailcomma == null) { @@ -520,7 +520,7 @@ //XXX: would be nice if printlist and printlist2 could be merged. //not in CPython's Grammar file printlist2 returns [boolean newline, List elts] - : (test[expr_contextType.Load] COMMA test[expr_contextType.Load]) => + : (test[null] COMMA test[null]) => t+=test[expr_contextType.Load] (options {k=2;}: COMMA t+=test[expr_contextType.Load])* (trailcomma=COMMA)? { $elts=$t; if ($trailcomma == null) { @@ -767,7 +767,7 @@ //test: or_test ['if' or_test 'else' test] | lambdef test[expr_contextType ctype] :o1=or_test[ctype] - ( (IF or_test[expr_contextType.Load] ORELSE) => IF o2=or_test[ctype] ORELSE e=test[expr_contextType.Load] + ( (IF or_test[null] ORELSE) => IF o2=or_test[ctype] ORELSE e=test[expr_contextType.Load] -> ^(IF<IfExp>[$IF, (exprType)$o2.tree, (exprType)$o1.tree, (exprType)$e.tree]) | -> or_test ) @@ -1034,14 +1034,18 @@ $testlist_gexp.tree = etype; } } - : t+=test[expr_contextType.Load] - ( ((options {k=2;}: c1=COMMA t+=test[expr_contextType.Load])* (c2=COMMA)? + : t+=test[$expr::ctype] + ( ((options {k=2;}: c1=COMMA t+=test[$expr::ctype])* (c2=COMMA)? -> { $c1 != null || $c2 != null }? ^(PYNODE<Tuple>[$testlist_gexp.start, actions.makeExprs($t), $expr::ctype]) -> test ) | ( gen_for[gens] { Collections.reverse(gens); comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); + exprType e = (exprType)$t.get(0); + if (e instanceof Context) { + ((Context)e).setContext(expr_contextType.Load); + } etype = new GeneratorExp($gen_for.start, (exprType)$t.get(0), c); } ) @@ -1107,7 +1111,7 @@ } } : d1=DOT DOT DOT -> DOT<Ellipsis>[$d1] - | (test[expr_contextType.Load] COLON) => lower=test[expr_contextType.Load] (c1=COLON (upper1=test[expr_contextType.Load])? (sliceop)?)? { + | (test[null] COLON) => lower=test[expr_contextType.Load] (c1=COLON (upper1=test[expr_contextType.Load])? (sliceop)?)? { $sltype = actions.makeSubscript($lower.tree, $c1, $upper1.tree, $sliceop.tree); } | (COLON) => c2=COLON (upper2=test[expr_contextType.Load])? (sliceop)? { @@ -1122,8 +1126,8 @@ //exprlist: expr (',' expr)* [','] exprlist[expr_contextType ctype] returns [exprType etype] - : (expr[expr_contextType.Load] COMMA) => e+=expr[ctype] (options {k=2;}: COMMA e+=expr[ctype])* (COMMA)? { - $etype = new Tuple($exprlist.start, actions.makeExprs($e), ctype); + : (expr[null] COMMA) => e+=expr[ctype] (options {k=2;}: COMMA e+=expr[ctype])* (COMMA)? { + $etype = new Tuple($exprlist.start, actions.makeExprs($e), ctype); } | expr[ctype] { $etype = (exprType)$expr.tree; @@ -1145,7 +1149,7 @@ @after { $testlist.tree = etype; } - : (test[expr_contextType.Load] COMMA) => t+=test[ctype] (options {k=2;}: c1=COMMA t+=test[ctype])* (c2=COMMA)? { + : (test[null] COMMA) => t+=test[ctype] (options {k=2;}: c1=COMMA t+=test[ctype])* (c2=COMMA)? { etype = new Tuple($testlist.start, actions.makeExprs($t), ctype); } | test[ctype] { @@ -1214,7 +1218,11 @@ ( (ASSIGN t2=test[expr_contextType.Load]) { $kws.add(new exprType[]{(exprType)$t1.tree, (exprType)$t2.tree}); } - | gen_for[gens] //FIXME + | gen_for[gens] { + Collections.reverse(gens); + comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); + arguments.add(new GeneratorExp($gen_for.start, (exprType)$t1.tree, c)); + } | {$arguments.add($t1.tree);} ) ; Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-20 23:01:42 UTC (rev 5227) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-21 02:58:24 UTC (rev 5228) @@ -293,12 +293,21 @@ exprType makeAssignValue(List rhs) { exprType value = (exprType)rhs.get(rhs.size() -1); + maybeSetContext(value, expr_contextType.Load); + if (value instanceof Tuple) { + exprType[] elts = ((Tuple)value).elts; + for (int i=0;i<elts.length;i++) { + maybeSetContext(elts[i], expr_contextType.Load); + } + } + return value; + } - if (value instanceof Context) { + void maybeSetContext(PythonTree tree, expr_contextType context) { + if (tree instanceof Context) { //XXX: for Tuples, etc -- will need to recursively set to expr_contextType.Load. - ((Context)value).setContext(expr_contextType.Load); + ((Context)tree).setContext(context); } - return value; } argumentsType makeArgumentsType(Token t, List params, Token snameToken, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-21 03:47:34
|
Revision: 5230 http://jython.svn.sourceforge.net/jython/?rev=5230&view=rev Author: fwierzbicki Date: 2008-08-21 03:47:32 +0000 (Thu, 21 Aug 2008) Log Message: ----------- bugfix on exception and on assign value expr_contextType. Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/GrammarActions.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-21 03:23:28 UTC (rev 5229) +++ branches/nowalker/grammar/Python.g 2008-08-21 03:47:32 UTC (rev 5230) @@ -754,7 +754,7 @@ ; //except_clause: 'except' [test [',' test]] -except_clause : EXCEPT (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load])?)? COLON suite +except_clause : EXCEPT (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Store])?)? COLON suite -> ^(EXCEPT<excepthandlerType>[$EXCEPT, (exprType)$t1.tree, (exprType)$t2.tree, actions.makeStmts($suite.stmts), $EXCEPT.getLine(), $EXCEPT.getCharPositionInLine()]) ; Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-21 03:23:28 UTC (rev 5229) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-21 03:47:32 UTC (rev 5230) @@ -2,6 +2,7 @@ import org.antlr.runtime.CommonToken; import org.antlr.runtime.Token; +import org.antlr.runtime.tree.Tree; import org.python.core.Py; import org.python.core.PyComplex; @@ -293,21 +294,18 @@ exprType makeAssignValue(List rhs) { exprType value = (exprType)rhs.get(rhs.size() -1); - maybeSetContext(value, expr_contextType.Load); - if (value instanceof Tuple) { - exprType[] elts = ((Tuple)value).elts; - for (int i=0;i<elts.length;i++) { - maybeSetContext(elts[i], expr_contextType.Load); - } - } + recurseSetContext(value, expr_contextType.Load); return value; } - void maybeSetContext(PythonTree tree, expr_contextType context) { + void recurseSetContext(Tree tree, expr_contextType context) { if (tree instanceof Context) { //XXX: for Tuples, etc -- will need to recursively set to expr_contextType.Load. ((Context)tree).setContext(context); } + for (int i=0; i<tree.getChildCount(); i++) { + recurseSetContext(tree.getChild(i), context); + } } argumentsType makeArgumentsType(Token t, List params, Token snameToken, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-22 23:02:37
|
Revision: 5235 http://jython.svn.sourceforge.net/jython/?rev=5235&view=rev Author: fwierzbicki Date: 2008-08-22 23:02:32 +0000 (Fri, 22 Aug 2008) Log Message: ----------- Merged revisions 5227,5229,5231-5234 via svnmerge from https://jython.svn.sourceforge.net/svnroot/jython/trunk/jython ........ r5227 | pjenvey | 2008-08-20 19:01:42 -0400 (Wed, 20 Aug 2008) | 3 lines rewrite the subx joiner yet again: this time exactly as CPython does it, with __getslice__ and join. fixes a string subclass corner case ........ r5229 | leosoto | 2008-08-20 23:23:28 -0400 (Wed, 20 Aug 2008) | 1 line Fixing #1095 for old-style classes. Thanks to Anselm Kruls for the patch. ........ r5231 | pjenvey | 2008-08-21 15:44:29 -0400 (Thu, 21 Aug 2008) | 3 lines make cStringIO thread safe as unfortunately the CPython GIL guarantees it, as does the pure python version. add cStringIO.In/OutputType ........ r5232 | pjenvey | 2008-08-21 19:59:46 -0400 (Thu, 21 Aug 2008) | 1 line document TypeError vs AttributeError here ........ r5233 | fwierzbicki | 2008-08-22 11:31:56 -0400 (Fri, 22 Aug 2008) | 2 lines Switch "type"->"kind" for the compile parameter value which specifies the kind of parse/compile "exec", "eval", or "single". CPython's source uses "kind" and other parts of Jython use this term as well. ........ r5234 | pjenvey | 2008-08-22 16:16:59 -0400 (Fri, 22 Aug 2008) | 3 lines fix unicode __add__ and repeat always forcing the basic plane on the result -- can't optimize for strs when unicode also uses these methods ........ Modified Paths: -------------- branches/nowalker/Lib/test/test_descr_jy.py branches/nowalker/Lib/test/test_re_jy.py branches/nowalker/src/org/python/core/Py.java branches/nowalker/src/org/python/core/PyInstance.java branches/nowalker/src/org/python/core/PyObject.java branches/nowalker/src/org/python/core/PyString.java branches/nowalker/src/org/python/core/__builtin__.java branches/nowalker/src/org/python/modules/cStringIO.java branches/nowalker/src/org/python/modules/sre/PatternObject.java Added Paths: ----------- branches/nowalker/Lib/test/test_unicode_jy.py Property Changed: ---------------- branches/nowalker/ Property changes on: branches/nowalker ___________________________________________________________________ Modified: svnmerge-integrated - /trunk/jython:1-5221 + /trunk/jython:1-5234 Modified: branches/nowalker/Lib/test/test_descr_jy.py =================================================================== --- branches/nowalker/Lib/test/test_descr_jy.py 2008-08-22 20:16:59 UTC (rev 5234) +++ branches/nowalker/Lib/test/test_descr_jy.py 2008-08-22 23:02:32 UTC (rev 5235) @@ -326,16 +326,34 @@ def __getattr__(self, name): raise BarAttributeError + class BarClassic: + def __getattr__(self, name): + raise BarAttributeError + class Foo(object): def __getattr__(self, name): raise AttributeError("Custom message") + + class FooClassic: + def __getattr__(self, name): + raise AttributeError("Custom message") + self.assertRaises(BarAttributeError, lambda: Bar().x) + self.assertRaises(BarAttributeError, lambda: BarClassic().x) + try: Foo().x self.assert_(False) # Previous line should raise AttributteError except AttributeError, e: self.assertEquals("Custom message", str(e)) + try: + FooClassic().x + self.assert_(False) # Previous line should raise AttributteError + except AttributeError, e: + self.assertEquals("Custom message", str(e)) + + def test_main(): test_support.run_unittest(TestDescrTestCase, SubclassDescrTestCase, Modified: branches/nowalker/Lib/test/test_re_jy.py =================================================================== --- branches/nowalker/Lib/test/test_re_jy.py 2008-08-22 20:16:59 UTC (rev 5234) +++ branches/nowalker/Lib/test/test_re_jy.py 2008-08-22 23:02:32 UTC (rev 5235) @@ -8,6 +8,23 @@ result = re.sub('', lambda match : None, 'foo') self.assertEqual(result, 'foo') self.assert_(isinstance(result, str)) + + def test_sub_with_subclasses(self): + class Foo(unicode): + def join(self, items): + return Foo(unicode.join(self, items)) + result = re.sub('bar', 'baz', Foo('bar')) + self.assertEqual(result, u'baz') + self.assertEqual(type(result), unicode) + + class Foo2(unicode): + def join(self, items): + return Foo2(unicode.join(self, items)) + def __getslice__(self, start, stop): + return Foo2(unicode.__getslice__(self, start, stop)) + result = re.sub('bar', 'baz', Foo2('bar')) + self.assertEqual(result, Foo2('baz')) + self.assert_(isinstance(result, Foo2)) def test_unkown_groupname(self): self.assertRaises(IndexError, Copied: branches/nowalker/Lib/test/test_unicode_jy.py (from rev 5234, trunk/jython/Lib/test/test_unicode_jy.py) =================================================================== --- branches/nowalker/Lib/test/test_unicode_jy.py (rev 0) +++ branches/nowalker/Lib/test/test_unicode_jy.py 2008-08-22 23:02:32 UTC (rev 5235) @@ -0,0 +1,28 @@ +"""Misc unicode tests + +Made for Jython. +""" +import re +import unittest +from test import test_support + +class UnicodeTestCase(unittest.TestCase): + + def test_simplejson_plane_bug(self): + # a bug exposed by simplejson: unicode __add__ was always + # forcing the basic plane + chunker = re.compile(r'(.*?)(["\\\x00-\x1f])', re.VERBOSE | re.MULTILINE | re.DOTALL) + orig = u'z\U0001d120x' + quoted1 = u'"z\U0001d120x"' + quoted2 = '"' + orig + '"' + # chunker re gives different results depending on the plane + self.assertEqual(chunker.match(quoted1, 1).groups(), (orig, u'"')) + self.assertEqual(chunker.match(quoted2, 1).groups(), (orig, u'"')) + + +def test_main(): + test_support.run_unittest(UnicodeTestCase) + + +if __name__ == "__main__": + test_main() Modified: branches/nowalker/src/org/python/core/Py.java =================================================================== --- branches/nowalker/src/org/python/core/Py.java 2008-08-22 20:16:59 UTC (rev 5234) +++ branches/nowalker/src/org/python/core/Py.java 2008-08-22 23:02:32 UTC (rev 5235) @@ -1641,8 +1641,8 @@ } public static PyObject compile(InputStream istream, String filename, - String type) { - return compile_flags(istream, filename, type, null); + String kind) { + return compile_flags(istream, filename, kind, null); } // with compiler-flags @@ -1664,15 +1664,15 @@ } public static PyObject compile_flags(InputStream istream, String filename, - String type,CompilerFlags cflags) + String kind,CompilerFlags cflags) { - modType node = ParserFacade.parse(istream, type, filename, cflags); + modType node = ParserFacade.parse(istream, kind, filename, cflags); if (cflags != null && cflags.only_ast) { return Py.java2py(node); } boolean printResults = false; - if (type.equals("single")) { + if (kind.equals("single")) { printResults = true; } return Py.compile_flags(node, getName(), filename, true, printResults, cflags); @@ -1680,7 +1680,7 @@ public static PyObject compile_flags(String data, String filename, - String type, + String kind, CompilerFlags cflags) { if (data.contains("\0")) { @@ -1695,7 +1695,7 @@ } return Py.compile_flags(new ByteArrayInputStream(bytes), filename, - type, + kind, cflags); } Modified: branches/nowalker/src/org/python/core/PyInstance.java =================================================================== --- branches/nowalker/src/org/python/core/PyInstance.java 2008-08-22 20:16:59 UTC (rev 5234) +++ branches/nowalker/src/org/python/core/PyInstance.java 2008-08-22 23:02:32 UTC (rev 5235) @@ -201,10 +201,19 @@ } public PyObject __findattr_ex__(String name) { - return __findattr__(name, false); + return __findattr_ex__(name, false); } public PyObject __findattr__(String name, boolean stopAtJava) { + try { + return __findattr_ex__(name, stopAtJava); + } catch (PyException exc) { + if (Py.matchException(exc, Py.AttributeError)) return null; + throw exc; + } + } + + protected PyObject __findattr_ex__(String name, boolean stopAtJava) { PyObject result = ifindlocal(name); if (result != null) return result; @@ -234,12 +243,7 @@ if (getter == null) return null; - try { - return getter.__call__(this, new PyString(name)); - } catch (PyException exc) { - if (Py.matchException(exc, Py.AttributeError)) return null; - throw exc; - } + return getter.__call__(this, new PyString(name)); } public boolean isCallable() { Modified: branches/nowalker/src/org/python/core/PyObject.java =================================================================== --- branches/nowalker/src/org/python/core/PyObject.java 2008-08-22 20:16:59 UTC (rev 5234) +++ branches/nowalker/src/org/python/core/PyObject.java 2008-08-22 23:02:32 UTC (rev 5235) @@ -829,6 +829,9 @@ } public void readonlyAttributeError(String name) { + // XXX: Should be an AttributeError but CPython throws TypeError for read only + // member descriptors (in structmember.c::PyMember_SetOne), which is expected by a + // few tests. fixed in py3k: http://bugs.python.org/issue1687163 throw Py.TypeError("readonly attribute"); } Modified: branches/nowalker/src/org/python/core/PyString.java =================================================================== --- branches/nowalker/src/org/python/core/PyString.java 2008-08-22 20:16:59 UTC (rev 5234) +++ branches/nowalker/src/org/python/core/PyString.java 2008-08-22 23:02:32 UTC (rev 5235) @@ -670,7 +670,7 @@ for(int i = 0; i < count; i++) { string.getChars(0, s, new_chars, i * s); } - return createInstance(new String(new_chars), true); + return createInstance(new String(new_chars)); } @Override @@ -711,7 +711,7 @@ if (generic_other instanceof PyUnicode) { return new PyUnicode(result); } - return createInstance(result, true); + return createInstance(result); } else return null; } Modified: branches/nowalker/src/org/python/core/__builtin__.java =================================================================== --- branches/nowalker/src/org/python/core/__builtin__.java 2008-08-22 20:16:59 UTC (rev 5234) +++ branches/nowalker/src/org/python/core/__builtin__.java 2008-08-22 23:02:32 UTC (rev 5235) @@ -455,15 +455,15 @@ throw Py.TypeError("number coercion failed"); } - public static PyObject compile(String data, String filename, String type) { - return Py.compile_flags(data, filename, type, Py.getCompilerFlags()); + public static PyObject compile(String data, String filename, String kind) { + return Py.compile_flags(data, filename, kind, Py.getCompilerFlags()); } - public static PyObject compile(String data, String filename, String type, int flags, boolean dont_inherit) { + public static PyObject compile(String data, String filename, String kind, int flags, boolean dont_inherit) { if ((flags & ~PyTableCode.CO_ALL_FEATURES) != 0) { throw Py.ValueError("compile(): unrecognised flags"); } - return Py.compile_flags(data, filename, type, Py.getCompilerFlags(flags, dont_inherit)); + return Py.compile_flags(data, filename, kind, Py.getCompilerFlags(flags, dont_inherit)); } public static void delattr(PyObject o, String n) { Modified: branches/nowalker/src/org/python/modules/cStringIO.java =================================================================== --- branches/nowalker/src/org/python/modules/cStringIO.java 2008-08-22 20:16:59 UTC (rev 5234) +++ branches/nowalker/src/org/python/modules/cStringIO.java 2008-08-22 23:02:32 UTC (rev 5235) @@ -16,6 +16,7 @@ import org.python.core.PyList; import org.python.core.PyObject; import org.python.core.PyString; +import org.python.core.PyType; /** * This module implements a file-like class, StringIO, that reads and @@ -37,6 +38,9 @@ public static final int SEEK_CUR = 1; public static final int SEEK_END = 2; } + + public static PyType InputType = PyType.fromClass(StringIO.class); + public static PyType OutputType = PyType.fromClass(StringIO.class); public static StringIO StringIO() { return new StringIO(); @@ -133,7 +137,7 @@ * @param pos the position in the file. * @param mode; 0=from the start, 1=relative, 2=from the end. */ - public void seek(long pos, int mode) { + public synchronized void seek(long pos, int mode) { _complain_ifclosed(); switch (mode) { case os.SEEK_CUR: @@ -152,7 +156,7 @@ /** * Reset the file position to the beginning of the file. */ - public void reset() { + public synchronized void reset() { pos = 0; } @@ -160,7 +164,7 @@ * Return the file position. * @returns the position in the file. */ - public int tell() { + public synchronized int tell() { _complain_ifclosed(); return pos; } @@ -186,7 +190,7 @@ * @returns A string containing the data read. */ - public String read(long size) { + public synchronized String read(long size) { _complain_ifclosed(); int size_int = _convert_to_int(size); int len = buf.length(); @@ -225,7 +229,7 @@ * returned. * @returns data from the file up to and including the newline. */ - public String readline(long size) { + public synchronized String readline(long size) { _complain_ifclosed(); int size_int = _convert_to_int(size); int len = buf.length(); @@ -247,7 +251,7 @@ * Read and return a line without the trailing newline. * Usind by cPickle as an optimization. */ - public String readlineNoNl() { + public synchronized String readlineNoNl() { _complain_ifclosed(); int len = buf.length(); int i = buf.indexOf("\n", pos); @@ -303,7 +307,7 @@ /** * truncate the file at the position pos. */ - public void truncate(long pos) { + public synchronized void truncate(long pos) { int pos_int = _convert_to_int(pos); if (pos_int < 0) pos_int = this.pos; @@ -320,7 +324,7 @@ write(obj.toString()); } - public void write(String s) { + public synchronized void write(String s) { _complain_ifclosed(); buf.setLength(pos); int newpos = pos + s.length(); @@ -332,7 +336,7 @@ * Write a char to the file. Used by cPickle as an optimization. * @param ch The data to write. */ - public void writeChar(char ch) { + public synchronized void writeChar(char ch) { int len = buf.length(); if (len <= pos) buf.setLength(pos + 1); @@ -363,7 +367,7 @@ * before the StringIO object's close() method is called. * @return the contents of the StringIO. */ - public String getvalue() { + public synchronized String getvalue() { return buf.toString(); } Modified: branches/nowalker/src/org/python/modules/sre/PatternObject.java =================================================================== --- branches/nowalker/src/org/python/modules/sre/PatternObject.java 2008-08-22 20:16:59 UTC (rev 5234) +++ branches/nowalker/src/org/python/modules/sre/PatternObject.java 2008-08-22 23:02:32 UTC (rev 5235) @@ -118,7 +118,7 @@ SRE_STATE state = new SRE_STATE(string, 0, Integer.MAX_VALUE, flags); - StringBuilder buf = new StringBuilder(); + PyList list = new PyList(); int n = 0; int i = 0; @@ -137,7 +137,7 @@ if (i < b) { /* get segment before this match */ - buf.append(string.substring(i, b)); + list.append(string.__getslice__(Py.newInteger(i), Py.newInteger(b))); } if (! (i == b && i == e && n > 0)) { PyObject item; @@ -150,7 +150,7 @@ } if (item != Py.None) { - buf.append(item.toString()); + list.append(item); } i = e; n++; @@ -163,25 +163,23 @@ state.start = state.ptr; } if (i < state.endpos) { - buf.append(string.substring(i, state.endpos)); + list.append(string.__getslice__(Py.newInteger(i), Py.newInteger(state.endpos))); } - // Follows rules enumerated in test_re.test_bug_1140 - PyString outstring; - if (buf.length() == 0) { - outstring = instring.createInstance(buf.toString()); - } else if (template instanceof PyUnicode || instring instanceof PyUnicode) { - outstring = Py.newUnicode(buf.toString()); - } else { - outstring = Py.newString(buf.toString()); - } - + PyObject outstring = join_list(list, string); if (subn) { return new PyTuple(outstring, Py.newInteger(n)); } return outstring; } + private PyObject join_list(PyList list, PyString string) { + PyObject joiner = string.__getslice__(Py.Zero, Py.Zero); + if (list.size() == 0) { + return joiner; + } + return joiner.__getattr__("join").__call__(list); + } public PyObject split(PyObject[] args, String[] kws) { ArgParser ap = new ArgParser("split", args, kws, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-23 02:33:53
|
Revision: 5237 http://jython.svn.sourceforge.net/jython/?rev=5237&view=rev Author: fwierzbicki Date: 2008-08-23 02:33:48 +0000 (Sat, 23 Aug 2008) Log Message: ----------- Add expr types to BaseTree children. Modified Paths: -------------- branches/nowalker/ast/asdl_antlr.py branches/nowalker/src/org/python/antlr/GrammarActions.java branches/nowalker/src/org/python/antlr/ast/Assert.java branches/nowalker/src/org/python/antlr/ast/Assign.java branches/nowalker/src/org/python/antlr/ast/Attribute.java branches/nowalker/src/org/python/antlr/ast/AugAssign.java branches/nowalker/src/org/python/antlr/ast/BinOp.java branches/nowalker/src/org/python/antlr/ast/Call.java branches/nowalker/src/org/python/antlr/ast/Compare.java branches/nowalker/src/org/python/antlr/ast/Exec.java branches/nowalker/src/org/python/antlr/ast/Expr.java branches/nowalker/src/org/python/antlr/ast/Expression.java branches/nowalker/src/org/python/antlr/ast/For.java branches/nowalker/src/org/python/antlr/ast/GeneratorExp.java branches/nowalker/src/org/python/antlr/ast/If.java branches/nowalker/src/org/python/antlr/ast/IfExp.java branches/nowalker/src/org/python/antlr/ast/Index.java branches/nowalker/src/org/python/antlr/ast/Lambda.java branches/nowalker/src/org/python/antlr/ast/ListComp.java branches/nowalker/src/org/python/antlr/ast/Print.java branches/nowalker/src/org/python/antlr/ast/Raise.java branches/nowalker/src/org/python/antlr/ast/Repr.java branches/nowalker/src/org/python/antlr/ast/Return.java branches/nowalker/src/org/python/antlr/ast/Slice.java branches/nowalker/src/org/python/antlr/ast/Subscript.java branches/nowalker/src/org/python/antlr/ast/UnaryOp.java branches/nowalker/src/org/python/antlr/ast/While.java branches/nowalker/src/org/python/antlr/ast/With.java branches/nowalker/src/org/python/antlr/ast/Yield.java branches/nowalker/src/org/python/antlr/ast/comprehensionType.java branches/nowalker/src/org/python/antlr/ast/excepthandlerType.java branches/nowalker/src/org/python/antlr/ast/keywordType.java Modified: branches/nowalker/ast/asdl_antlr.py =================================================================== --- branches/nowalker/ast/asdl_antlr.py 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/ast/asdl_antlr.py 2008-08-23 02:33:48 UTC (rev 5237) @@ -260,12 +260,15 @@ if f.typedef is not None and f.typedef.simple: not_simple = False #For now ignoring String -- will want to revisit - if f.seq and not_simple and not fparg.startswith("String"): - self.emit("if (%s != null) {" % f.name, depth+1); - self.emit("for(int i%(name)s=0;i%(name)s<%(name)s.length;i%(name)s++) {" % {"name":f.name}, depth+2) - self.emit("addChild(%s[i%s]);" % (f.name, f.name), depth+3) - self.emit("}", depth+2) - self.emit("}", depth+1) + if not_simple and not fparg.startswith("String"): + if f.seq: + self.emit("if (%s != null) {" % f.name, depth+1); + self.emit("for(int i%(name)s=0;i%(name)s<%(name)s.length;i%(name)s++) {" % {"name":f.name}, depth+2) + self.emit("addChild(%s[i%s]);" % (f.name, f.name), depth+3) + self.emit("}", depth+2) + self.emit("}", depth+1) + elif str(f.type) == "expr": + self.emit("addChild(%s);" % (f.name), depth+1) def javaMethods(self, type, clsname, ctorname, fields, depth): # The java ctors Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -303,7 +303,7 @@ ((Context)tree).setContext(context); } for (int i=0; i<tree.getChildCount(); i++) { - recurseSetContext(tree.getChild(i), context); + recurseSetContext(tree.getChild(i), context); } } Modified: branches/nowalker/src/org/python/antlr/ast/Assert.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Assert.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Assert.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -15,19 +15,25 @@ public Assert(Token token, exprType test, exprType msg) { super(token); this.test = test; + addChild(test); this.msg = msg; + addChild(msg); } public Assert(int ttype, Token token, exprType test, exprType msg) { super(ttype, token); this.test = test; + addChild(test); this.msg = msg; + addChild(msg); } public Assert(PythonTree tree, exprType test, exprType msg) { super(tree); this.test = test; + addChild(test); this.msg = msg; + addChild(msg); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Assign.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Assign.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Assign.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -21,6 +21,7 @@ } } this.value = value; + addChild(value); } public Assign(int ttype, Token token, exprType[] targets, exprType value) { @@ -32,6 +33,7 @@ } } this.value = value; + addChild(value); } public Assign(PythonTree tree, exprType[] targets, exprType value) { @@ -43,6 +45,7 @@ } } this.value = value; + addChild(value); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Attribute.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Attribute.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Attribute.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -17,6 +17,7 @@ ctx) { super(token); this.value = value; + addChild(value); this.attr = attr; this.ctx = ctx; } @@ -25,6 +26,7 @@ expr_contextType ctx) { super(ttype, token); this.value = value; + addChild(value); this.attr = attr; this.ctx = ctx; } @@ -33,6 +35,7 @@ expr_contextType ctx) { super(tree); this.value = value; + addChild(value); this.attr = attr; this.ctx = ctx; } Modified: branches/nowalker/src/org/python/antlr/ast/AugAssign.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/AugAssign.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/AugAssign.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -17,24 +17,30 @@ value) { super(token); this.target = target; + addChild(target); this.op = op; this.value = value; + addChild(value); } public AugAssign(int ttype, Token token, exprType target, operatorType op, exprType value) { super(ttype, token); this.target = target; + addChild(target); this.op = op; this.value = value; + addChild(value); } public AugAssign(PythonTree tree, exprType target, operatorType op, exprType value) { super(tree); this.target = target; + addChild(target); this.op = op; this.value = value; + addChild(value); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/BinOp.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/BinOp.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/BinOp.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -17,28 +17,33 @@ super(token); } - public BinOp(Token token, exprType left, operatorType op, exprType right) { super(token); this.left = left; + addChild(left); this.op = op; this.right = right; + addChild(right); } public BinOp(int ttype, Token token, exprType left, operatorType op, exprType right) { super(ttype, token); this.left = left; + addChild(left); this.op = op; this.right = right; + addChild(right); } public BinOp(PythonTree tree, exprType left, operatorType op, exprType right) { super(tree); this.left = left; + addChild(left); this.op = op; this.right = right; + addChild(right); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Call.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Call.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Call.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -20,6 +20,7 @@ keywords, exprType starargs, exprType kwargs) { super(token); this.func = func; + addChild(func); this.args = args; if (args != null) { for(int iargs=0;iargs<args.length;iargs++) { @@ -33,13 +34,16 @@ } } this.starargs = starargs; + addChild(starargs); this.kwargs = kwargs; + addChild(kwargs); } public Call(int ttype, Token token, exprType func, exprType[] args, keywordType[] keywords, exprType starargs, exprType kwargs) { super(ttype, token); this.func = func; + addChild(func); this.args = args; if (args != null) { for(int iargs=0;iargs<args.length;iargs++) { @@ -53,13 +57,16 @@ } } this.starargs = starargs; + addChild(starargs); this.kwargs = kwargs; + addChild(kwargs); } public Call(PythonTree tree, exprType func, exprType[] args, keywordType[] keywords, exprType starargs, exprType kwargs) { super(tree); this.func = func; + addChild(func); this.args = args; if (args != null) { for(int iargs=0;iargs<args.length;iargs++) { @@ -73,7 +80,9 @@ } } this.starargs = starargs; + addChild(starargs); this.kwargs = kwargs; + addChild(kwargs); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Compare.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Compare.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Compare.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -18,6 +18,7 @@ comparators) { super(token); this.left = left; + addChild(left); this.ops = ops; this.comparators = comparators; if (comparators != null) { @@ -32,6 +33,7 @@ exprType[] comparators) { super(ttype, token); this.left = left; + addChild(left); this.ops = ops; this.comparators = comparators; if (comparators != null) { @@ -46,6 +48,7 @@ comparators) { super(tree); this.left = left; + addChild(left); this.ops = ops; this.comparators = comparators; if (comparators != null) { Modified: branches/nowalker/src/org/python/antlr/ast/Exec.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Exec.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Exec.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -17,24 +17,33 @@ public Exec(Token token, exprType body, exprType globals, exprType locals) { super(token); this.body = body; + addChild(body); this.globals = globals; + addChild(globals); this.locals = locals; + addChild(locals); } public Exec(int ttype, Token token, exprType body, exprType globals, exprType locals) { super(ttype, token); this.body = body; + addChild(body); this.globals = globals; + addChild(globals); this.locals = locals; + addChild(locals); } public Exec(PythonTree tree, exprType body, exprType globals, exprType locals) { super(tree); this.body = body; + addChild(body); this.globals = globals; + addChild(globals); this.locals = locals; + addChild(locals); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Expr.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Expr.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Expr.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -14,16 +14,19 @@ public Expr(Token token, exprType value) { super(token); this.value = value; + addChild(value); } public Expr(int ttype, Token token, exprType value) { super(ttype, token); this.value = value; + addChild(value); } public Expr(PythonTree tree, exprType value) { super(tree); this.value = value; + addChild(value); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Expression.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Expression.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Expression.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -14,16 +14,19 @@ public Expression(Token token, exprType body) { super(token); this.body = body; + addChild(body); } public Expression(int ttype, Token token, exprType body) { super(ttype, token); this.body = body; + addChild(body); } public Expression(PythonTree tree, exprType body) { super(tree); this.body = body; + addChild(body); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/For.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/For.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/For.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -19,7 +19,9 @@ stmtType[] orelse) { super(token); this.target = target; + addChild(target); this.iter = iter; + addChild(iter); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { @@ -38,7 +40,9 @@ stmtType[] body, stmtType[] orelse) { super(ttype, token); this.target = target; + addChild(target); this.iter = iter; + addChild(iter); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { @@ -57,7 +61,9 @@ body, stmtType[] orelse) { super(tree); this.target = target; + addChild(target); this.iter = iter; + addChild(iter); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { Modified: branches/nowalker/src/org/python/antlr/ast/GeneratorExp.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/GeneratorExp.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/GeneratorExp.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -16,6 +16,7 @@ generators) { super(token); this.elt = elt; + addChild(elt); this.generators = generators; if (generators != null) { for(int igenerators=0;igenerators<generators.length;igenerators++) { @@ -28,6 +29,7 @@ comprehensionType[] generators) { super(ttype, token); this.elt = elt; + addChild(elt); this.generators = generators; if (generators != null) { for(int igenerators=0;igenerators<generators.length;igenerators++) { @@ -40,6 +42,7 @@ generators) { super(tree); this.elt = elt; + addChild(elt); this.generators = generators; if (generators != null) { for(int igenerators=0;igenerators<generators.length;igenerators++) { Modified: branches/nowalker/src/org/python/antlr/ast/If.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/If.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/If.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -17,6 +17,7 @@ public If(Token token, exprType test, stmtType[] body, stmtType[] orelse) { super(token); this.test = test; + addChild(test); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { @@ -35,6 +36,7 @@ stmtType[] orelse) { super(ttype, token); this.test = test; + addChild(test); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { @@ -53,6 +55,7 @@ orelse) { super(tree); this.test = test; + addChild(test); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { Modified: branches/nowalker/src/org/python/antlr/ast/IfExp.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/IfExp.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/IfExp.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -17,24 +17,33 @@ public IfExp(Token token, exprType test, exprType body, exprType orelse) { super(token); this.test = test; + addChild(test); this.body = body; + addChild(body); this.orelse = orelse; + addChild(orelse); } public IfExp(int ttype, Token token, exprType test, exprType body, exprType orelse) { super(ttype, token); this.test = test; + addChild(test); this.body = body; + addChild(body); this.orelse = orelse; + addChild(orelse); } public IfExp(PythonTree tree, exprType test, exprType body, exprType orelse) { super(tree); this.test = test; + addChild(test); this.body = body; + addChild(body); this.orelse = orelse; + addChild(orelse); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Index.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Index.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Index.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -14,16 +14,19 @@ public Index(Token token, exprType value) { super(token); this.value = value; + addChild(value); } public Index(int ttype, Token token, exprType value) { super(ttype, token); this.value = value; + addChild(value); } public Index(PythonTree tree, exprType value) { super(tree); this.value = value; + addChild(value); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Lambda.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Lambda.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Lambda.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -16,18 +16,21 @@ super(token); this.args = args; this.body = body; + addChild(body); } public Lambda(int ttype, Token token, argumentsType args, exprType body) { super(ttype, token); this.args = args; this.body = body; + addChild(body); } public Lambda(PythonTree tree, argumentsType args, exprType body) { super(tree); this.args = args; this.body = body; + addChild(body); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/ListComp.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/ListComp.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/ListComp.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -15,6 +15,7 @@ public ListComp(Token token, exprType elt, comprehensionType[] generators) { super(token); this.elt = elt; + addChild(elt); this.generators = generators; if (generators != null) { for(int igenerators=0;igenerators<generators.length;igenerators++) { @@ -27,6 +28,7 @@ generators) { super(ttype, token); this.elt = elt; + addChild(elt); this.generators = generators; if (generators != null) { for(int igenerators=0;igenerators<generators.length;igenerators++) { @@ -39,6 +41,7 @@ generators) { super(tree); this.elt = elt; + addChild(elt); this.generators = generators; if (generators != null) { for(int igenerators=0;igenerators<generators.length;igenerators++) { Modified: branches/nowalker/src/org/python/antlr/ast/Print.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Print.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Print.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -16,6 +16,7 @@ public Print(Token token, exprType dest, exprType[] values, boolean nl) { super(token); this.dest = dest; + addChild(dest); this.values = values; if (values != null) { for(int ivalues=0;ivalues<values.length;ivalues++) { @@ -29,6 +30,7 @@ boolean nl) { super(ttype, token); this.dest = dest; + addChild(dest); this.values = values; if (values != null) { for(int ivalues=0;ivalues<values.length;ivalues++) { @@ -42,6 +44,7 @@ { super(tree); this.dest = dest; + addChild(dest); this.values = values; if (values != null) { for(int ivalues=0;ivalues<values.length;ivalues++) { Modified: branches/nowalker/src/org/python/antlr/ast/Raise.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Raise.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Raise.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -16,24 +16,33 @@ public Raise(Token token, exprType type, exprType inst, exprType tback) { super(token); this.type = type; + addChild(type); this.inst = inst; + addChild(inst); this.tback = tback; + addChild(tback); } public Raise(int ttype, Token token, exprType type, exprType inst, exprType tback) { super(ttype, token); this.type = type; + addChild(type); this.inst = inst; + addChild(inst); this.tback = tback; + addChild(tback); } public Raise(PythonTree tree, exprType type, exprType inst, exprType tback) { super(tree); this.type = type; + addChild(type); this.inst = inst; + addChild(inst); this.tback = tback; + addChild(tback); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Repr.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Repr.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Repr.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -14,16 +14,19 @@ public Repr(Token token, exprType value) { super(token); this.value = value; + addChild(value); } public Repr(int ttype, Token token, exprType value) { super(ttype, token); this.value = value; + addChild(value); } public Repr(PythonTree tree, exprType value) { super(tree); this.value = value; + addChild(value); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Return.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Return.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Return.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -14,16 +14,19 @@ public Return(Token token, exprType value) { super(token); this.value = value; + addChild(value); } public Return(int ttype, Token token, exprType value) { super(ttype, token); this.value = value; + addChild(value); } public Return(PythonTree tree, exprType value) { super(tree); this.value = value; + addChild(value); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Slice.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Slice.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Slice.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -17,24 +17,33 @@ public Slice(Token token, exprType lower, exprType upper, exprType step) { super(token); this.lower = lower; + addChild(lower); this.upper = upper; + addChild(upper); this.step = step; + addChild(step); } public Slice(int ttype, Token token, exprType lower, exprType upper, exprType step) { super(ttype, token); this.lower = lower; + addChild(lower); this.upper = upper; + addChild(upper); this.step = step; + addChild(step); } public Slice(PythonTree tree, exprType lower, exprType upper, exprType step) { super(tree); this.lower = lower; + addChild(lower); this.upper = upper; + addChild(upper); this.step = step; + addChild(step); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/Subscript.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Subscript.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Subscript.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -17,6 +17,7 @@ expr_contextType ctx) { super(token); this.value = value; + addChild(value); this.slice = slice; this.ctx = ctx; } @@ -25,6 +26,7 @@ expr_contextType ctx) { super(ttype, token); this.value = value; + addChild(value); this.slice = slice; this.ctx = ctx; } @@ -33,6 +35,7 @@ expr_contextType ctx) { super(tree); this.value = value; + addChild(value); this.slice = slice; this.ctx = ctx; } Modified: branches/nowalker/src/org/python/antlr/ast/UnaryOp.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/UnaryOp.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/UnaryOp.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -16,18 +16,21 @@ super(token); this.op = op; this.operand = operand; + addChild(operand); } public UnaryOp(int ttype, Token token, unaryopType op, exprType operand) { super(ttype, token); this.op = op; this.operand = operand; + addChild(operand); } public UnaryOp(PythonTree tree, unaryopType op, exprType operand) { super(tree); this.op = op; this.operand = operand; + addChild(operand); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/While.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/While.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/While.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -18,6 +18,7 @@ orelse) { super(token); this.test = test; + addChild(test); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { @@ -36,6 +37,7 @@ stmtType[] orelse) { super(ttype, token); this.test = test; + addChild(test); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { @@ -54,6 +56,7 @@ orelse) { super(tree); this.test = test; + addChild(test); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { Modified: branches/nowalker/src/org/python/antlr/ast/With.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/With.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/With.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -18,7 +18,9 @@ stmtType[] body) { super(token); this.context_expr = context_expr; + addChild(context_expr); this.optional_vars = optional_vars; + addChild(optional_vars); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { @@ -31,7 +33,9 @@ optional_vars, stmtType[] body) { super(ttype, token); this.context_expr = context_expr; + addChild(context_expr); this.optional_vars = optional_vars; + addChild(optional_vars); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { @@ -44,7 +48,9 @@ stmtType[] body) { super(tree); this.context_expr = context_expr; + addChild(context_expr); this.optional_vars = optional_vars; + addChild(optional_vars); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { Modified: branches/nowalker/src/org/python/antlr/ast/Yield.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/Yield.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/Yield.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -14,16 +14,19 @@ public Yield(Token token, exprType value) { super(token); this.value = value; + addChild(value); } public Yield(int ttype, Token token, exprType value) { super(ttype, token); this.value = value; + addChild(value); } public Yield(PythonTree tree, exprType value) { super(tree); this.value = value; + addChild(value); } public String toString() { Modified: branches/nowalker/src/org/python/antlr/ast/comprehensionType.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/comprehensionType.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/comprehensionType.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -17,7 +17,9 @@ exprType[] ifs) { super(token); this.target = target; + addChild(target); this.iter = iter; + addChild(iter); this.ifs = ifs; if (ifs != null) { for(int iifs=0;iifs<ifs.length;iifs++) { @@ -30,7 +32,9 @@ iter, exprType[] ifs) { super(ttype, token); this.target = target; + addChild(target); this.iter = iter; + addChild(iter); this.ifs = ifs; if (ifs != null) { for(int iifs=0;iifs<ifs.length;iifs++) { @@ -43,7 +47,9 @@ exprType[] ifs) { super(tree); this.target = target; + addChild(target); this.iter = iter; + addChild(iter); this.ifs = ifs; if (ifs != null) { for(int iifs=0;iifs<ifs.length;iifs++) { Modified: branches/nowalker/src/org/python/antlr/ast/excepthandlerType.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/excepthandlerType.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/excepthandlerType.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -20,7 +20,9 @@ stmtType[] body, int lineno, int col_offset) { super(token); this.type = type; + addChild(type); this.name = name; + addChild(name); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { @@ -35,7 +37,9 @@ name, stmtType[] body, int lineno, int col_offset) { super(ttype, token); this.type = type; + addChild(type); this.name = name; + addChild(name); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { @@ -50,7 +54,9 @@ stmtType[] body, int lineno, int col_offset) { super(tree); this.type = type; + addChild(type); this.name = name; + addChild(name); this.body = body; if (body != null) { for(int ibody=0;ibody<body.length;ibody++) { Modified: branches/nowalker/src/org/python/antlr/ast/keywordType.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/keywordType.java 2008-08-22 23:03:45 UTC (rev 5236) +++ branches/nowalker/src/org/python/antlr/ast/keywordType.java 2008-08-23 02:33:48 UTC (rev 5237) @@ -16,18 +16,21 @@ super(token); this.arg = arg; this.value = value; + addChild(value); } public keywordType(int ttype, Token token, String arg, exprType value) { super(ttype, token); this.arg = arg; this.value = value; + addChild(value); } public keywordType(PythonTree tree, String arg, exprType value) { super(tree); this.arg = arg; this.value = value; + addChild(value); } public String toString() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-23 19:19:18
|
Revision: 5238 http://jython.svn.sourceforge.net/jython/?rev=5238&view=rev Author: fwierzbicki Date: 2008-08-23 19:19:16 +0000 (Sat, 23 Aug 2008) Log Message: ----------- BinOp now works in one pass. Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/GrammarActions.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-23 02:33:48 UTC (rev 5237) +++ branches/nowalker/grammar/Python.g 2008-08-23 19:19:16 UTC (rev 5238) @@ -855,75 +855,114 @@ $expr::ctype = ect; } @after { - if ($expr.tree instanceof BinOp) { - BinOp b = (BinOp)$expr.tree; - b.left = (exprType)b.getChild(0); - b.right = (exprType)b.getChild(1); - switch (b.getType()) { - case PLUS: - b.op = operatorType.Add; - break; - case MINUS: - b.op = operatorType.Sub; - break; - case STAR: - b.op = operatorType.Mult; - break; - case SLASH: - b.op = operatorType.Div; - break; - case PERCENT: - b.op = operatorType.Mod; - break; - case DOUBLESLASH: - b.op = operatorType.FloorDiv; - break; - case AMPER: - b.op = operatorType.BitAnd; - break; - case VBAR: - b.op = operatorType.BitOr; - break; - case CIRCUMFLEX: - b.op = operatorType.BitXor; - break; - case LEFTSHIFT: - b.op = operatorType.LShift; - break; - case RIGHTSHIFT: - b.op = operatorType.RShift; - break; - case DOUBLESTAR: - b.op = operatorType.Pow; - break; - } + if ($op != null) { + $expr.tree = actions.makeBinOp($left.tree, operatorType.BitOr, $right); } } - : xor_expr (VBAR<BinOp>^ xor_expr)* + : left=xor_expr + ( (op=VBAR right+=xor_expr + )+ + | -> $left + ) ; + //xor_expr: and_expr ('^' and_expr)* -xor_expr : and_expr (CIRCUMFLEX<BinOp>^ and_expr)* - ; +xor_expr +@after { + if ($op != null) { + $xor_expr.tree = actions.makeBinOp($left.tree, operatorType.BitXor, $right); + } +} + : left=and_expr + ( (op=CIRCUMFLEX right+=and_expr + )+ + | -> $left + ) + ; //and_expr: shift_expr ('&' shift_expr)* -and_expr : shift_expr (AMPER<BinOp>^ shift_expr)* - ; +and_expr +@after { + if ($op != null) { + $and_expr.tree = actions.makeBinOp($left.tree, operatorType.BitAnd, $right); + } +} + : left=shift_expr + ( (op=AMPER right+=shift_expr + )+ + | -> $left + ) + ; //shift_expr: arith_expr (('<<'|'>>') arith_expr)* -shift_expr : arith_expr ((LEFTSHIFT<BinOp>^|RIGHTSHIFT<BinOp>^) arith_expr)* - ; +shift_expr +@init { + List ops = new ArrayList(); +} +@after { + if (!ops.isEmpty()) { + $shift_expr.tree = actions.makeBinOp($left.tree, ops, $right); + } +} + : left=arith_expr + ( ( shift_op right+=arith_expr {ops.add($shift_op.op);} + )+ + | -> $left + ) + ; +shift_op returns [operatorType op] + : LEFTSHIFT {$op = operatorType.LShift;} + | RIGHTSHIFT {$op = operatorType.RShift;} + ; + //arith_expr: term (('+'|'-') term)* - arith_expr - :term ((PLUS<BinOp>^|MINUS<BinOp>^) term)* +@init { + List ops = new ArrayList(); +} +@after { + if (!ops.isEmpty()) { + $arith_expr.tree = actions.makeBinOp($left.tree, ops, $right); + } +} + : left=term + ( (arith_op right+=term {ops.add($arith_op.op);} + )+ + | -> $left + ) ; +arith_op returns [operatorType op] + : PLUS {$op = operatorType.Add;} + | MINUS {$op = operatorType.Sub;} + ; + //term: factor (('*'|'/'|'%'|'//') factor)* -term : factor ((STAR<BinOp>^ | SLASH<BinOp>^ | PERCENT<BinOp>^ | DOUBLESLASH<BinOp>^ ) factor)* - ; +term +@init { + List ops = new ArrayList(); +} +@after { + if (!ops.isEmpty()) { + $term.tree = actions.makeBinOp($left.tree, ops, $right); + } +} + : left=factor + ( (term_op right+=factor {ops.add($term_op.op);} + )+ + | -> $left + ) + ; +term_op returns [operatorType op] + :STAR {$op = operatorType.Mult;} + |SLASH {$op = operatorType.Div;} + |PERCENT {$op = operatorType.Mod;} + |DOUBLESLASH {$op = operatorType.FloorDiv;} + ; + //factor: ('+'|'-'|'~') factor | power factor returns [exprType etype] @after { Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-23 02:33:48 UTC (rev 5237) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-23 19:19:16 UTC (rev 5238) @@ -737,4 +737,23 @@ values.addAll(right); return new BoolOp(left, op, makeExprs(values)); } + + BinOp makeBinOp(PythonTree left, operatorType op, List rights) { + BinOp current = new BinOp(left, (exprType)left, op, (exprType)rights.get(0)); + for (int i = 1; i< rights.size(); i++) { + exprType right = (exprType)rights.get(i); + current = new BinOp(left, current, op, right); + } + return current; + } + + BinOp makeBinOp(PythonTree left, List ops, List rights) { + BinOp current = new BinOp(left, (exprType)left, (operatorType)ops.get(0), (exprType)rights.get(0)); + for (int i = 1; i< rights.size(); i++) { + exprType right = (exprType)rights.get(i); + operatorType op = (operatorType)ops.get(i); + current = new BinOp(left, current, op, right); + } + return current; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-23 19:43:21
|
Revision: 5239 http://jython.svn.sourceforge.net/jython/?rev=5239&view=rev Author: fwierzbicki Date: 2008-08-23 19:43:19 +0000 (Sat, 23 Aug 2008) Log Message: ----------- Fine tuning List and Assign col position. Modified Paths: -------------- branches/nowalker/build.xml branches/nowalker/grammar/Python.g Modified: branches/nowalker/build.xml =================================================================== --- branches/nowalker/build.xml 2008-08-23 19:19:16 UTC (rev 5238) +++ branches/nowalker/build.xml 2008-08-23 19:43:19 UTC (rev 5239) @@ -318,9 +318,7 @@ change to grammar files. If you are working on the grammars you might want to comment this out, as a clean is really only needed if you change the tokens defined in Python.g (and cleans make the build slow) --> - <antcall target="clean"/> <!-- force jarjar build --> - <property name="jarjar.needed" value="true" /> </target> <target name ="prepare-output" depends="init,needed-check,clean-if-antlr-needed,make-output-dirs"/> Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-23 19:19:16 UTC (rev 5238) +++ branches/nowalker/grammar/Python.g 2008-08-23 19:43:19 UTC (rev 5239) @@ -464,8 +464,8 @@ ) |(testlist[null] ASSIGN) => lhs=testlist[expr_contextType.Store] ( - | ((at=ASSIGN t+=testlist[expr_contextType.Store])+ -> ^(PYNODE<Assign>[$at, actions.makeAssignTargets((exprType)$lhs.tree, $t), actions.makeAssignValue($t)])) - | ((ay=ASSIGN y2+=yield_expr)+ -> ^(PYNODE<Assign>[$ay, actions.makeAssignTargets((exprType)$lhs.tree, $y2), actions.makeAssignValue($y2)])) + | ((at=ASSIGN t+=testlist[expr_contextType.Store])+ -> ^(PYNODE<Assign>[$lhs.start, actions.makeAssignTargets((exprType)$lhs.tree, $t), actions.makeAssignValue($t)])) + | ((ay=ASSIGN y2+=yield_expr)+ -> ^(PYNODE<Assign>[$lhs.start, actions.makeAssignTargets((exprType)$lhs.tree, $y2), actions.makeAssignValue($y2)])) ) | lhs=testlist[expr_contextType.Load] -> PYNODE<Expr>[$lhs.start, (exprType)$lhs.tree] ) @@ -1022,7 +1022,7 @@ ) RPAREN | LBRACK - (listmaker -> listmaker + (listmaker[$LBRACK] -> listmaker | -> ^(LBRACK<org.python.antlr.ast.List>[$LBRACK, new exprType[0\], $expr::ctype]) ) RBRACK @@ -1042,7 +1042,7 @@ ; //listmaker: test ( list_for | (',' test)* [','] ) -listmaker +listmaker[Token lbrack] @init { List gens = new ArrayList(); exprType etype = null; @@ -1054,10 +1054,10 @@ ( list_for[gens] { Collections.reverse(gens); comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); - etype = new ListComp($listmaker.start, (exprType)$t.get(0), c); + etype = new ListComp($lbrack, (exprType)$t.get(0), c); } | (options {greedy=true;}:COMMA t+=test[expr_contextType.Load])* { - etype = new org.python.antlr.ast.List($listmaker.start, actions.makeExprs($t), $expr::ctype); + etype = new org.python.antlr.ast.List($lbrack, actions.makeExprs($t), $expr::ctype); } ) (COMMA)? ; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-23 23:04:04
|
Revision: 5240 http://jython.svn.sourceforge.net/jython/?rev=5240&view=rev Author: fwierzbicki Date: 2008-08-23 23:03:59 +0000 (Sat, 23 Aug 2008) Log Message: ----------- Make PythonTree's toStringTree more easily comparable with ast/astview.py output. This will help with the walkerless Python.g, as it doesn't quite parse ast/astview.py yet. Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/GrammarActions.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-23 19:43:19 UTC (rev 5239) +++ branches/nowalker/grammar/Python.g 2008-08-23 23:03:59 UTC (rev 5240) @@ -981,7 +981,7 @@ $power.tree = $etype; } } - : atom (t+=trailer)* (options {greedy=true;}:DOUBLESTAR factor)? { + : atom (t+=trailer[$atom.start])* (options {greedy=true;}:DOUBLESTAR factor)? { if ($t != null) { exprType current = (exprType)$atom.tree; //for(int i = $t.size() - 1; i > -1; i--) { @@ -1054,7 +1054,7 @@ ( list_for[gens] { Collections.reverse(gens); comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); - etype = new ListComp($lbrack, (exprType)$t.get(0), c); + etype = new ListComp($listmaker.start, (exprType)$t.get(0), c); } | (options {greedy=true;}:COMMA t+=test[expr_contextType.Load])* { etype = new org.python.antlr.ast.List($lbrack, actions.makeExprs($t), $expr::ctype); @@ -1097,17 +1097,17 @@ ; //trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME -trailer : LPAREN (arglist -> ^(LPAREN<Call>[$LPAREN, null, actions.makeExprs($arglist.args), actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs]) +trailer [Token begin]: LPAREN (arglist -> ^(LPAREN<Call>[$begin, null, actions.makeExprs($arglist.args), actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs]) | -> ^(LPAREN<Call>[$LPAREN, null, new exprType[0\], new keywordType[0\], null, null]) ) RPAREN - | LBRACK s=subscriptlist RBRACK -> $s - | DOT attr -> ^(DOT<Attribute>[$DOT, null, $attr.text, $expr::ctype]) + | LBRACK s=subscriptlist[begin] RBRACK -> $s + | DOT attr -> ^(DOT<Attribute>[$begin, null, $attr.text, $expr::ctype]) ; //subscriptlist: subscript (',' subscript)* [','] //FIXME: tuples not always created when commas are present. -subscriptlist returns [exprType etype] +subscriptlist[Token begin] returns [exprType etype] @after { $subscriptlist.tree = $etype; } @@ -1138,7 +1138,7 @@ s = new ExtSlice($subscriptlist.start, st); } } - $etype = new Subscript($subscriptlist.start, null, s, $expr::ctype); + $etype = new Subscript($begin, null, s, $expr::ctype); } ; @@ -1169,7 +1169,10 @@ $etype = new Tuple($exprlist.start, actions.makeExprs($e), ctype); } | expr[ctype] { + //System.out.println("expecting " + ctype); $etype = (exprType)$expr.tree; + //System.out.println("got " + ((Name)$etype).ctx); + } ; Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-23 19:43:19 UTC (rev 5239) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-23 23:03:59 UTC (rev 5240) @@ -303,7 +303,9 @@ ((Context)tree).setContext(context); } for (int i=0; i<tree.getChildCount(); i++) { - recurseSetContext(tree.getChild(i), context); + if (!(tree instanceof ListComp)) { + recurseSetContext(tree.getChild(i), context); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-25 14:21:36
|
Revision: 5243 http://jython.svn.sourceforge.net/jython/?rev=5243&view=rev Author: fwierzbicki Date: 2008-08-25 14:21:29 +0000 (Mon, 25 Aug 2008) Log Message: ----------- Fix generator expressions, rename all "stmts" in Python.g to "stypes". Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/GrammarActions.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-24 09:38:22 UTC (rev 5242) +++ branches/nowalker/grammar/Python.g 2008-08-25 14:21:29 UTC (rev 5243) @@ -358,7 +358,7 @@ //funcdef: [decorators] 'def' NAME parameters ':' suite funcdef : decorators? DEF NAME parameters COLON suite - -> ^(DEF<FunctionDef>[$DEF, $NAME.text, $parameters.args, actions.makeStmts($suite.stmts), + -> ^(DEF<FunctionDef>[$DEF, $NAME.text, $parameters.args, actions.makeStmts($suite.stypes), actions.makeExprs($decorators.etypes)]) ; @@ -677,12 +677,12 @@ //if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] if_stmt: IF test[expr_contextType.Load] COLON ifsuite=suite elifs+=elif_clause* (ORELSE COLON elsesuite=suite)? - -> ^(IF<If>[$IF, (exprType)$test.tree, actions.makeStmts($ifsuite.stmts), actions.makeElses($elsesuite.stmts, $elifs)]) + -> ^(IF<If>[$IF, (exprType)$test.tree, actions.makeStmts($ifsuite.stypes), actions.makeElses($elsesuite.stypes, $elifs)]) ; //not in CPython's Grammar file elif_clause : ELIF test[expr_contextType.Load] COLON suite - -> ^(ELIF<If>[$ELIF, (exprType)$test.tree, actions.makeStmts($suite.stmts), new stmtType[0\]]) + -> ^(ELIF<If>[$ELIF, (exprType)$test.tree, actions.makeStmts($suite.stypes), new stmtType[0\]]) ; //while_stmt: 'while' test ':' suite ['else' ':' suite] @@ -694,7 +694,7 @@ $while_stmt.tree = stype; } : WHILE test[expr_contextType.Load] COLON s1=suite (ORELSE COLON s2=suite)? { - stype = actions.makeWhile($WHILE, (exprType)$test.tree, $s1.stmts, $s2.stmts); + stype = actions.makeWhile($WHILE, (exprType)$test.tree, $s1.stypes, $s2.stypes); } ; @@ -707,7 +707,7 @@ $for_stmt.tree = stype; } : FOR exprlist[expr_contextType.Store] IN testlist[expr_contextType.Load] COLON s1=suite (ORELSE COLON s2=suite)? { - stype = actions.makeFor($FOR, $exprlist.etype, (exprType)$testlist.tree, $s1.stmts, $s2.stmts); + stype = actions.makeFor($FOR, $exprlist.etype, (exprType)$testlist.tree, $s1.stypes, $s2.stypes); } ; @@ -725,10 +725,10 @@ } : TRY COLON trysuite=suite ( e+=except_clause+ (ORELSE COLON elsesuite=suite)? (FINALLY COLON finalsuite=suite)? { - stype = actions.makeTryExcept($TRY, $trysuite.stmts, $e, $elsesuite.stmts, $finalsuite.stmts); + stype = actions.makeTryExcept($TRY, $trysuite.stypes, $e, $elsesuite.stypes, $finalsuite.stypes); } | FINALLY COLON finalsuite=suite { - stype = actions.makeTryFinally($TRY, $trysuite.stmts, $finalsuite.stmts); + stype = actions.makeTryFinally($TRY, $trysuite.stypes, $finalsuite.stypes); } ) ; @@ -742,7 +742,7 @@ $with_stmt.tree = stype; } :WITH test[expr_contextType.Load] (with_var)? COLON suite { - stype = new With($WITH, (exprType)$test.tree, $with_var.etype, actions.makeStmts($suite.stmts)); + stype = new With($WITH, (exprType)$test.tree, $with_var.etype, actions.makeStmts($suite.stypes)); } ; @@ -755,13 +755,13 @@ //except_clause: 'except' [test [',' test]] except_clause : EXCEPT (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Store])?)? COLON suite - -> ^(EXCEPT<excepthandlerType>[$EXCEPT, (exprType)$t1.tree, (exprType)$t2.tree, actions.makeStmts($suite.stmts), $EXCEPT.getLine(), $EXCEPT.getCharPositionInLine()]) + -> ^(EXCEPT<excepthandlerType>[$EXCEPT, (exprType)$t1.tree, (exprType)$t2.tree, actions.makeStmts($suite.stypes), $EXCEPT.getLine(), $EXCEPT.getCharPositionInLine()]) ; //suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT -suite returns [List stmts] - : ss+=simple_stmt {$stmts = $ss;} - | NEWLINE! INDENT (s+=stmt)+ DEDENT {$stmts = $s;} +suite returns [List stypes] + : ss+=simple_stmt {$stypes = $ss;} + | NEWLINE! INDENT (s+=stmt)+ DEDENT {$stypes = $s;} ; //test: or_test ['if' or_test 'else' test] | lambdef @@ -1085,7 +1085,7 @@ if (e instanceof Context) { ((Context)e).setContext(expr_contextType.Load); } - etype = new GeneratorExp($gen_for.start, (exprType)$t.get(0), c); + etype = new GeneratorExp($testlist_gexp.start, (exprType)$t.get(0), c); } ) ) @@ -1233,7 +1233,7 @@ $classdef.tree = stype; } :CLASS NAME (LPAREN testlist[expr_contextType.Load]? RPAREN)? COLON suite { - stype = new ClassDef($CLASS, $NAME.getText(), actions.makeBases((exprType)$testlist.tree), actions.makeStmts($suite.stmts)); + stype = new ClassDef($CLASS, $NAME.getText(), actions.makeBases((exprType)$testlist.tree), actions.makeStmts($suite.stypes)); } ; Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-24 09:38:22 UTC (rev 5242) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-25 14:21:29 UTC (rev 5243) @@ -308,7 +308,7 @@ ((Context)tree).setContext(context); } for (int i=0; i<tree.getChildCount(); i++) { - if (!(tree instanceof ListComp)) { + if (!(tree instanceof ListComp) && !(tree instanceof GeneratorExp)) { recurseSetContext(tree.getChild(i), context); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-25 18:44:52
|
Revision: 5245 http://jython.svn.sourceforge.net/jython/?rev=5245&view=rev Author: fwierzbicki Date: 2008-08-25 18:44:46 +0000 (Mon, 25 Aug 2008) Log Message: ----------- Fix build.xml (oops) Fix Generator Expression assignments and multi-statement simple_stmt. Modified Paths: -------------- branches/nowalker/build.xml branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/GrammarActions.java Modified: branches/nowalker/build.xml =================================================================== --- branches/nowalker/build.xml 2008-08-25 15:25:24 UTC (rev 5244) +++ branches/nowalker/build.xml 2008-08-25 18:44:46 UTC (rev 5245) @@ -318,7 +318,9 @@ change to grammar files. If you are working on the grammars you might want to comment this out, as a clean is really only needed if you change the tokens defined in Python.g (and cleans make the build slow) --> + <antcall target="clean"/> <!-- force jarjar build --> + <property name="jarjar.needed" value="true" /> </target> <target name ="prepare-output" depends="init,needed-check,clean-if-antlr-needed,make-output-dirs"/> Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-25 15:25:24 UTC (rev 5244) +++ branches/nowalker/grammar/Python.g 2008-08-25 18:44:46 UTC (rev 5245) @@ -279,8 +279,18 @@ //file_input: (NEWLINE | stmt)* ENDMARKER file_input - : (NEWLINE | s+=stmt)+ -> ^(PYNODE<Module>[$file_input.start, actions.makeStmts($s)]) - | -> ^(PYNODE<Module>[$file_input.start, new stmtType[0\]]) +@init { + modType mtype = null; + List stypes = new ArrayList(); +} +@after { + $file_input.tree = mtype; +} + : (NEWLINE + | stmt {stypes.addAll($stmt.stypes);} + )* { + mtype = new Module($file_input.start, actions.makeStmts(stypes)); + } ; //eval_input: testlist NEWLINE* ENDMARKER @@ -424,14 +434,21 @@ ; //stmt: simple_stmt | compound_stmt -stmt : simple_stmt - | compound_stmt - ; +stmt returns [List stypes] + : simple_stmt {$stypes = $simple_stmt.stypes;} + | compound_stmt { + $stypes = new ArrayList(); + $stypes.add($compound_stmt.tree); + } + ; //simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE -simple_stmt : small_stmt (options {greedy=true;}:SEMI small_stmt)* (SEMI)? NEWLINE - -> small_stmt+ - ; +simple_stmt returns [List stypes] + : s+=small_stmt (options {greedy=true;}:SEMI s+=small_stmt)* (SEMI)? NEWLINE { + $stypes = $s; + } + ; + //small_stmt: (expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | // import_stmt | global_stmt | exec_stmt | assert_stmt) small_stmt : expr_stmt @@ -760,8 +777,13 @@ //suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT suite returns [List stypes] - : ss+=simple_stmt {$stypes = $ss;} - | NEWLINE! INDENT (s+=stmt)+ DEDENT {$stypes = $s;} +@init { + $stypes = new ArrayList(); +} + : simple_stmt {$stypes = $simple_stmt.stypes;} + | NEWLINE! INDENT + (stmt {$stypes.addAll($stmt.stypes);} + )+ DEDENT ; //test: or_test ['if' or_test 'else' test] | lambdef Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-25 15:25:24 UTC (rev 5244) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-25 18:44:46 UTC (rev 5245) @@ -296,8 +296,11 @@ if (tree instanceof Context) { ((Context)tree).setContext(context); } - for (int i=0; i<tree.getChildCount(); i++) { - if (!(tree instanceof ListComp) && !(tree instanceof GeneratorExp)) { + if (tree instanceof GeneratorExp) { + GeneratorExp g = (GeneratorExp)tree; + recurseSetContext(g.elt, context); + } else if (!(tree instanceof ListComp)) { + for (int i=0; i<tree.getChildCount(); i++) { recurseSetContext(tree.getChild(i), context); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-25 20:36:12
|
Revision: 5246 http://jython.svn.sourceforge.net/jython/?rev=5246&view=rev Author: fwierzbicki Date: 2008-08-25 20:36:04 +0000 (Mon, 25 Aug 2008) Log Message: ----------- Fixed fplist, subscripts (especially extslice) and enable Interactive and Expression (single and eval). regrtest.py is now running. Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/ExpressionParser.java branches/nowalker/src/org/python/antlr/GrammarActions.java branches/nowalker/src/org/python/antlr/InteractiveParser.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-25 18:44:46 UTC (rev 5245) +++ branches/nowalker/grammar/Python.g 2008-08-25 20:36:04 UTC (rev 5246) @@ -76,8 +76,6 @@ DEDENT; PYNODE; - Interactive; - Expression; } @header { @@ -110,6 +108,7 @@ import org.python.antlr.ast.excepthandlerType; import org.python.antlr.ast.Exec; import org.python.antlr.ast.Expr; +import org.python.antlr.ast.Expression; import org.python.antlr.ast.exprType; import org.python.antlr.ast.expr_contextType; import org.python.antlr.ast.ExtSlice; @@ -122,6 +121,7 @@ import org.python.antlr.ast.Import; import org.python.antlr.ast.ImportFrom; import org.python.antlr.ast.Index; +import org.python.antlr.ast.Interactive; import org.python.antlr.ast.keywordType; import org.python.antlr.ast.ListComp; import org.python.antlr.ast.Lambda; @@ -272,10 +272,23 @@ } //single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE -single_input : NEWLINE* EOF -> ^(Interactive) - | simple_stmt NEWLINE* EOF -> ^(Interactive simple_stmt) - | compound_stmt NEWLINE+ EOF -> ^(Interactive compound_stmt) - ; +single_input +@init { + modType mtype = null; +} +@after { + $single_input.tree = mtype; +} + : NEWLINE* EOF { + mtype = new Interactive($single_input.start, new stmtType[0]); + } + | simple_stmt NEWLINE* EOF { + mtype = new Interactive($single_input.start, actions.makeStmts($simple_stmt.stypes)); + } + | compound_stmt NEWLINE+ EOF { + mtype = new Interactive($single_input.start, actions.makeStmts($compound_stmt.tree)); + } + ; //file_input: (NEWLINE | stmt)* ENDMARKER file_input @@ -294,8 +307,17 @@ ; //eval_input: testlist NEWLINE* ENDMARKER -eval_input : LEADING_WS? (NEWLINE)* testlist[expr_contextType.Load] (NEWLINE)* EOF -> ^(Expression testlist) - ; +eval_input +@init { + modType mtype = null; +} +@after { + $eval_input.tree = mtype; +} + : LEADING_WS? (NEWLINE)* testlist[expr_contextType.Load] (NEWLINE)* EOF { + mtype = new Expression($eval_input.start, (exprType)$testlist.tree); + } + ; //not in CPython's Grammar file dotted_attr returns [exprType etype] @@ -422,9 +444,9 @@ fpdef[expr_contextType ctype] : NAME -> ^(PYNODE<Name>[$NAME, $NAME.text, ctype]) | (LPAREN fpdef[null] COMMA) => LPAREN fplist RPAREN + -> ^(LPAREN<Tuple>[$fplist.start, actions.makeExprs($fplist.etypes), expr_contextType.Store]) + | LPAREN fplist RPAREN -> fplist - | LPAREN fplist RPAREN - -> ^(LPAREN<Tuple>[$fplist.start, actions.makeExprs($fplist.etypes), expr_contextType.Store]) ; //fplist: fpdef (',' fpdef)* [','] @@ -673,7 +695,7 @@ $exec_stmt.tree = stype; } : EXEC expr[expr_contextType.Load] (IN t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load])?)? { - stype = new Exec($expr.start, (exprType)$expr.tree, (exprType)$t1.tree, (exprType)$t2.tree); + stype = new Exec($EXEC, (exprType)$expr.tree, (exprType)$t1.tree, (exprType)$t2.tree); } ; @@ -1142,37 +1164,49 @@ //subscriptlist: subscript (',' subscript)* [','] //FIXME: tuples not always created when commas are present. subscriptlist[Token begin] returns [exprType etype] +@init { + exprType etype = null; +} @after { - $subscriptlist.tree = $etype; + $subscriptlist.tree = etype; } - : sub+=subscript (options {greedy=true;}:COMMA sub+=subscript)* (COMMA)? { - sliceType s; + : sub+=subscript (options {greedy=true;}:c1=COMMA sub+=subscript)* (c2=COMMA)? { + boolean isTuple = false; + if ($c1 != null || $c2 != null) { + isTuple = true; + } + sliceType s = null; List sltypes = $sub; - if (sltypes.size() == 0) { - s = null; - } else if (sltypes.size() == 1){ - s = (sliceType)sltypes.get(0); - } else { + boolean extslice = false; + + //NEW LOGIC + if (isTuple) { sliceType[] st; - //FIXME: here I am using ClassCastException to decide if sltypes is populated with Index - // only. Clearly this is not the best way to do this but it's late. Somebody do - // something better please :) -- (hopefully a note to self) - try { - Iterator iter = sltypes.iterator(); - List etypes = new ArrayList(); - while (iter.hasNext()) { - Index i = (Index)iter.next(); + List etypes = new ArrayList(); + for (Object o : sltypes) { + if (o instanceof Index) { + Index i = (Index)o; etypes.add(i.value); + } else { + extslice = true; + break; } + } + if (!extslice) { exprType[] es = (exprType[])etypes.toArray(new exprType[etypes.size()]); - exprType t = new Tuple($subscriptlist.start, es, expr_contextType.Load); - s = new Index($subscriptlist.start, t); - } catch (ClassCastException cc) { - st = (sliceType[])sltypes.toArray(new sliceType[sltypes.size()]); - s = new ExtSlice($subscriptlist.start, st); + exprType t = new Tuple($begin, es, expr_contextType.Load); + s = new Index($begin, t); } + } else if (sltypes.size() == 1) { + s = (sliceType)sltypes.get(0); + } else if (sltypes.size() != 0) { + extslice = true; } - $etype = new Subscript($begin, null, s, $expr::ctype); + if (extslice) { + sliceType[] st = (sliceType[])sltypes.toArray(new sliceType[sltypes.size()]); + s = new ExtSlice($begin, st); + } + etype = new Subscript($begin, null, s, $expr::ctype); } ; @@ -1194,7 +1228,8 @@ ; //sliceop: ':' [test] -sliceop : COLON (test[expr_contextType.Load])? -> test +sliceop : COLON (test[expr_contextType.Load] -> test + )? ; //exprlist: expr (',' expr)* [','] Modified: branches/nowalker/src/org/python/antlr/ExpressionParser.java =================================================================== --- branches/nowalker/src/org/python/antlr/ExpressionParser.java 2008-08-25 18:44:46 UTC (rev 5245) +++ branches/nowalker/src/org/python/antlr/ExpressionParser.java 2008-08-25 20:36:04 UTC (rev 5246) @@ -34,6 +34,7 @@ try { PythonParser.eval_input_return r = parser.eval_input(); + tree = (modType)r.tree; //CommonTreeNodeStream nodes = new CommonTreeNodeStream((Tree)r.tree); //nodes.setTokenStream(tokens); //PythonWalker walker = new PythonWalker(nodes); Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-25 18:44:46 UTC (rev 5245) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-25 20:36:04 UTC (rev 5246) @@ -185,6 +185,10 @@ return o; } + stmtType[] makeStmts(PythonTree t) { + return new stmtType[]{(stmtType)t}; + } + stmtType[] makeStmts(List stmts) { if (stmts != null) { List<stmtType> result = new ArrayList<stmtType>(); Modified: branches/nowalker/src/org/python/antlr/InteractiveParser.java =================================================================== --- branches/nowalker/src/org/python/antlr/InteractiveParser.java 2008-08-25 18:44:46 UTC (rev 5245) +++ branches/nowalker/src/org/python/antlr/InteractiveParser.java 2008-08-25 20:36:04 UTC (rev 5246) @@ -39,6 +39,7 @@ try { PythonParser.single_input_return r = parser.single_input(); + tree = (modType)r.tree; //CommonTreeNodeStream nodes = new CommonTreeNodeStream((Tree)r.tree); //nodes.setTokenStream(tokens); //PythonWalker walker = new PythonWalker(nodes); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-26 02:04:30
|
Revision: 5248 http://jython.svn.sourceforge.net/jython/?rev=5248&view=rev Author: fwierzbicki Date: 2008-08-26 02:04:27 +0000 (Tue, 26 Aug 2008) Log Message: ----------- Cleanup: removal of comments, re-format of Python.g and removal of PYNODE. Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/ModuleParser.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-25 21:18:03 UTC (rev 5247) +++ branches/nowalker/grammar/Python.g 2008-08-26 02:04:27 UTC (rev 5248) @@ -61,8 +61,7 @@ * grammar from Jim Baker. The current parsing and compiling strategy looks * like this: * - * Python source->Python.g->simple antlr AST->PythonWalker.g-> - * decorated AST (org/python/parser/ast/*)->CodeCompiler(ASM)->.class + * Python source->Python.g->AST (org/python/parser/ast/*)->CodeCompiler(ASM)->.class */ grammar Python; @@ -74,8 +73,6 @@ tokens { INDENT; DEDENT; - - PYNODE; } @header { @@ -159,12 +156,8 @@ } @members { - boolean debugOn = false; - private ErrorHandler errorHandler; - private boolean seenSingleOuterSuite = false; - private GrammarActions actions = new GrammarActions(); public void setErrorHandler(ErrorHandler eh) { @@ -172,12 +165,6 @@ actions.setErrorHandler(eh); } - private void debug(String message) { - if (debugOn) { - System.out.println(message); - } - } - protected void mismatch(IntStream input, int ttype, BitSet follow) throws RecognitionException { if (errorHandler.isRecoverable()) { super.mismatch(input, ttype, follow); @@ -224,7 +211,7 @@ int implicitLineJoiningLevel = 0; int startPos=-1; -//If you want to use another error recovery mechanisms change this +//If you want to use another error recovery mechanism change this //and the same one in the parser. private ErrorHandler errorHandler; @@ -371,14 +358,12 @@ $decorator.tree = $etype; } : AT dotted_attr - //XXX: ignoring the arglist and Call generation right now. ( LPAREN (arglist {$etype = new Call($LPAREN, $dotted_attr.etype, actions.makeExprs($arglist.args), actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs);} | {$etype = $dotted_attr.etype;} ) RPAREN - // ^(Decorator dotted_attr ^(CallTok ^(Args arglist)?)) | { $etype = $dotted_attr.etype; } ) NEWLINE ; @@ -398,7 +383,8 @@ parameters returns [argumentsType args] : LPAREN (varargslist {$args = $varargslist.args;} - | {$args = new argumentsType($parameters.start, new exprType[0], null, null, new exprType[0]);} + | { $args = new argumentsType($parameters.start, new exprType[0], null, null, new exprType[0]); + } ) RPAREN ; @@ -408,17 +394,16 @@ @after { $defparameter.tree = $etype; } - : fpdef[expr_contextType.Param] (ASSIGN test[expr_contextType.Load])? { - $etype = (exprType)$fpdef.tree; - if ($ASSIGN != null) { - defaults.add($test.tree); - } else if (!defaults.isEmpty()) { - throw new ParseException( - "non-default argument follows default argument", - $fpdef.tree); - } - } -; + : fpdef[expr_contextType.Param] (ASSIGN test[expr_contextType.Load])? + { + $etype = (exprType)$fpdef.tree; + if ($ASSIGN != null) { + defaults.add($test.tree); + } else if (!defaults.isEmpty()) { + throw new ParseException("non-default argument follows default argument", $fpdef.tree); + } + } + ; //varargslist: ((fpdef ['=' test] ',')* // ('*' NAME [',' '**' NAME] | '**' NAME) | @@ -428,47 +413,62 @@ List defaults = new ArrayList(); } : d+=defparameter[defaults] (options {greedy=true;}:COMMA d+=defparameter[defaults])* - (COMMA - ( STAR starargs=NAME (COMMA DOUBLESTAR kwargs=NAME)? - | DOUBLESTAR kwargs=NAME - )? - )? - {$args = actions.makeArgumentsType($varargslist.start, $d, $starargs, $kwargs, defaults);} - | STAR starargs=NAME (COMMA DOUBLESTAR kwargs=NAME)?{debug("parsed varargslist STARARGS");} - {$args = actions.makeArgumentsType($varargslist.start, $d, $starargs, $kwargs, defaults);} - | DOUBLESTAR kwargs=NAME {debug("parsed varargslist KWS");} - {$args = actions.makeArgumentsType($varargslist.start, $d, null, $kwargs, defaults);} - ; + (COMMA + (STAR starargs=NAME (COMMA DOUBLESTAR kwargs=NAME)? + | DOUBLESTAR kwargs=NAME + )? + )? + { + $args = actions.makeArgumentsType($varargslist.start, $d, $starargs, $kwargs, defaults); + } + | STAR starargs=NAME (COMMA DOUBLESTAR kwargs=NAME)? + { + $args = actions.makeArgumentsType($varargslist.start, $d, $starargs, $kwargs, defaults); + } + | DOUBLESTAR kwargs=NAME + { + $args = actions.makeArgumentsType($varargslist.start, $d, null, $kwargs, defaults); + } + ; //fpdef: NAME | '(' fplist ')' -fpdef[expr_contextType ctype] : NAME - -> ^(PYNODE<Name>[$NAME, $NAME.text, ctype]) - | (LPAREN fpdef[null] COMMA) => LPAREN fplist RPAREN - -> ^(LPAREN<Tuple>[$fplist.start, actions.makeExprs($fplist.etypes), expr_contextType.Store]) - | LPAREN fplist RPAREN - -> fplist - ; +fpdef[expr_contextType ctype] + : NAME + -> ^(NAME<Name>[$NAME, $NAME.text, ctype]) + | (LPAREN fpdef[null] COMMA) => LPAREN fplist RPAREN + -> ^(LPAREN<Tuple>[$fplist.start, actions.makeExprs($fplist.etypes), expr_contextType.Store]) + | LPAREN fplist RPAREN + -> fplist + ; //fplist: fpdef (',' fpdef)* [','] fplist returns [List etypes] - : f+=fpdef[expr_contextType.Store] (options {greedy=true;}:COMMA f+=fpdef[expr_contextType.Store])* (COMMA)? - {$etypes = $f;} + : f+=fpdef[expr_contextType.Store] + (options {greedy=true;}:COMMA f+=fpdef[expr_contextType.Store])* (COMMA)? + { + $etypes = $f; + } ; //stmt: simple_stmt | compound_stmt stmt returns [List stypes] - : simple_stmt {$stypes = $simple_stmt.stypes;} - | compound_stmt { - $stypes = new ArrayList(); - $stypes.add($compound_stmt.tree); - } + : simple_stmt + { + $stypes = $simple_stmt.stypes; + } + | compound_stmt + { + $stypes = new ArrayList(); + $stypes.add($compound_stmt.tree); + } ; //simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE simple_stmt returns [List stypes] - : s+=small_stmt (options {greedy=true;}:SEMI s+=small_stmt)* (SEMI)? NEWLINE { - $stypes = $s; - } + : s+=small_stmt (options {greedy=true;}:SEMI s+=small_stmt)* (SEMI)? NEWLINE + { + $stypes = $s; + } ; //small_stmt: (expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | @@ -495,18 +495,33 @@ $expr_stmt.tree = stype; } } - - : - ((testlist[null] augassign) => lhs=testlist[expr_contextType.AugStore] - ( (aay=augassign y1=yield_expr {stype = new AugAssign($lhs.tree, (exprType)$lhs.tree, $aay.op, (exprType)$y1.tree);}) - | (aat=augassign rhs=testlist[expr_contextType.Load] {stype = new AugAssign($lhs.tree, (exprType)$lhs.tree, $aat.op, (exprType)$rhs.tree);}) + : ((testlist[null] augassign) => lhs=testlist[expr_contextType.AugStore] + ( (aay=augassign y1=yield_expr + { + stype = new AugAssign($lhs.tree, (exprType)$lhs.tree, $aay.op, (exprType)$y1.tree); + } + ) + | (aat=augassign rhs=testlist[expr_contextType.Load] + { + stype = new AugAssign($lhs.tree, (exprType)$lhs.tree, $aat.op, (exprType)$rhs.tree); + } + ) ) - |(testlist[null] ASSIGN) => lhs=testlist[expr_contextType.Store] + | (testlist[null] ASSIGN) => lhs=testlist[expr_contextType.Store] ( - | ((at=ASSIGN t+=testlist[expr_contextType.Store])+ -> ^(PYNODE<Assign>[$lhs.start, actions.makeAssignTargets((exprType)$lhs.tree, $t), actions.makeAssignValue($t)])) - | ((ay=ASSIGN y2+=yield_expr)+ -> ^(PYNODE<Assign>[$lhs.start, actions.makeAssignTargets((exprType)$lhs.tree, $y2), actions.makeAssignValue($y2)])) + | ((at=ASSIGN t+=testlist[expr_contextType.Store])+ + -> ^(ASSIGN<Assign>[$lhs.start, actions.makeAssignTargets((exprType)$lhs.tree, $t), + actions.makeAssignValue($t)]) + ) + | ((ay=ASSIGN y2+=yield_expr)+ + -> ^(ASSIGN<Assign>[$lhs.start, actions.makeAssignTargets((exprType)$lhs.tree, $y2), + actions.makeAssignValue($y2)]) + ) ) - | lhs=testlist[expr_contextType.Load] -> PYNODE<Expr>[$lhs.start, (exprType)$lhs.tree] + | lhs=testlist[expr_contextType.Load] + { + stype = new Expr($lhs.start, (exprType)$lhs.tree); + } ) ; @@ -529,121 +544,145 @@ //print_stmt: 'print' ( [ test (',' test)* [','] ] | // '>>' test [ (',' test)+ [','] ] ) -print_stmt : PRINT - ( t1=printlist - -> ^(PRINT<Print>[$PRINT, null, actions.makeExprs($t1.elts), $t1.newline]) - | RIGHTSHIFT t2=printlist2 - -> ^(PRINT<Print>[$PRINT, (exprType)$t2.elts.get(0), actions.makeExprs($t2.elts, 1), $t2.newline]) - | - -> ^(PRINT<Print>[$PRINT, null, new exprType[0\], false]) - ) +print_stmt + : PRINT + (t1=printlist + -> ^(PRINT<Print>[$PRINT, null, actions.makeExprs($t1.elts), $t1.newline]) + | RIGHTSHIFT t2=printlist2 + -> ^(PRINT<Print>[$PRINT, (exprType)$t2.elts.get(0), actions.makeExprs($t2.elts, 1), $t2.newline]) + | + -> ^(PRINT<Print>[$PRINT, null, new exprType[0\], false]) + ) ; //not in CPython's Grammar file printlist returns [boolean newline, List elts] : (test[null] COMMA) => - t+=test[expr_contextType.Load] (options {k=2;}: COMMA t+=test[expr_contextType.Load])* (trailcomma=COMMA)? - { $elts=$t; - if ($trailcomma == null) { - $newline = true; - } else { - $newline = false; + t+=test[expr_contextType.Load] (options {k=2;}: COMMA t+=test[expr_contextType.Load])* + (trailcomma=COMMA)? + { + $elts=$t; + if ($trailcomma == null) { + $newline = true; + } else { + $newline = false; + } + } + | t+=test[expr_contextType.Load] + { + $elts=$t; + $newline = true; } - } - | t+=test[expr_contextType.Load] { - $elts=$t; - $newline = true; - } ; //XXX: would be nice if printlist and printlist2 could be merged. //not in CPython's Grammar file printlist2 returns [boolean newline, List elts] : (test[null] COMMA test[null]) => - t+=test[expr_contextType.Load] (options {k=2;}: COMMA t+=test[expr_contextType.Load])* (trailcomma=COMMA)? - { $elts=$t; - if ($trailcomma == null) { - $newline = true; - } else { - $newline = false; + t+=test[expr_contextType.Load] (options {k=2;}: COMMA t+=test[expr_contextType.Load])* + (trailcomma=COMMA)? + { $elts=$t; + if ($trailcomma == null) { + $newline = true; + } else { + $newline = false; + } + } + | t+=test[expr_contextType.Load] + { + $elts=$t; + $newline = true; } - } - | t+=test[expr_contextType.Load] { - $elts=$t; - $newline = true; - } ; //del_stmt: 'del' exprlist -del_stmt : DELETE del_list - -> ^(DELETE<Delete>[$DELETE, actions.makeExprs($del_list.etypes)]) - ; +del_stmt + : DELETE del_list + -> ^(DELETE<Delete>[$DELETE, actions.makeExprs($del_list.etypes)]) + ; //pass_stmt: 'pass' -pass_stmt : PASS - -> ^(PASS<Pass>[$PASS]) - ; +pass_stmt + : PASS + -> ^(PASS<Pass>[$PASS]) + ; //flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt -flow_stmt : break_stmt - | continue_stmt - | return_stmt - | raise_stmt - | yield_stmt - ; +flow_stmt + : break_stmt + | continue_stmt + | return_stmt + | raise_stmt + | yield_stmt + ; //break_stmt: 'break' -break_stmt : BREAK - -> ^(BREAK<Break>[$BREAK]) - ; +break_stmt + : BREAK + -> ^(BREAK<Break>[$BREAK]) + ; //continue_stmt: 'continue' -continue_stmt : CONTINUE - -> ^(CONTINUE<Continue>[$CONTINUE]) - ; +continue_stmt + : CONTINUE + -> ^(CONTINUE<Continue>[$CONTINUE]) + ; //return_stmt: 'return' [testlist] -return_stmt : RETURN - (testlist[expr_contextType.Load] -> ^(RETURN<Return>[$RETURN, (exprType)$testlist.tree]) - | -> ^(RETURN<Return>[$RETURN, null]) - ) - ; +return_stmt + : RETURN + (testlist[expr_contextType.Load] + -> ^(RETURN<Return>[$RETURN, (exprType)$testlist.tree]) + | + -> ^(RETURN<Return>[$RETURN, null]) + ) + ; //yield_stmt: yield_expr -yield_stmt : yield_expr -> ^(PYNODE<Expr>[$yield_expr.start, (exprType)$yield_expr.tree]) - ; +yield_stmt + : yield_expr -> ^(YIELD<Expr>[$yield_expr.start, (exprType)$yield_expr.tree]) + ; //raise_stmt: 'raise' [test [',' test [',' test]]] -raise_stmt: RAISE (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load] (COMMA t3=test[expr_contextType.Load])?)?)? - -> ^(RAISE<Raise>[$RAISE, (exprType)$t1.tree, (exprType)$t2.tree, (exprType)$t3.tree]) - ; +raise_stmt + : RAISE (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load] + (COMMA t3=test[expr_contextType.Load])?)?)? + -> ^(RAISE<Raise>[$RAISE, (exprType)$t1.tree, (exprType)$t2.tree, (exprType)$t3.tree]) + ; //import_stmt: import_name | import_from -import_stmt : import_name - | import_from - ; +import_stmt + : import_name + | import_from + ; //import_name: 'import' dotted_as_names -import_name : IMPORT dotted_as_names - -> ^(IMPORT<Import>[$IMPORT, $dotted_as_names.atypes]) - ; +import_name + : IMPORT dotted_as_names + -> ^(IMPORT<Import>[$IMPORT, $dotted_as_names.atypes]) + ; //import_from: ('from' ('.'* dotted_name | '.'+) // 'import' ('*' | '(' import_as_names ')' | import_as_names)) -import_from: FROM (d+=DOT* dotted_name | d+=DOT+) IMPORT - (STAR - -> ^(FROM<ImportFrom>[$FROM, actions.makeFromText($d, $dotted_name.text), actions.makeStarAlias($STAR), actions.makeLevel($d)]) - | i1=import_as_names - -> ^(FROM<ImportFrom>[$FROM, actions.makeFromText($d, $dotted_name.text), actions.makeAliases($i1.atypes), actions.makeLevel($d)]) - | LPAREN i2=import_as_names COMMA? RPAREN - -> ^(FROM<ImportFrom>[$FROM, actions.makeFromText($d, $dotted_name.text), actions.makeAliases($i2.atypes), actions.makeLevel($d)]) - ) - ; +import_from + : FROM (d+=DOT* dotted_name | d+=DOT+) IMPORT + (STAR + -> ^(FROM<ImportFrom>[$FROM, actions.makeFromText($d, $dotted_name.text), + actions.makeStarAlias($STAR), actions.makeLevel($d)]) + | i1=import_as_names + -> ^(FROM<ImportFrom>[$FROM, actions.makeFromText($d, $dotted_name.text), + actions.makeAliases($i1.atypes), actions.makeLevel($d)]) + | LPAREN i2=import_as_names COMMA? RPAREN + -> ^(FROM<ImportFrom>[$FROM, actions.makeFromText($d, $dotted_name.text), + actions.makeAliases($i2.atypes), actions.makeLevel($d)]) + ) + ; //import_as_names: import_as_name (',' import_as_name)* [','] import_as_names returns [aliasType[\] atypes] - : n+=import_as_name (COMMA! n+=import_as_name)* { + : n+=import_as_name (COMMA! n+=import_as_name)* + { $atypes = (aliasType[])$n.toArray(new aliasType[$n.size()]); } ; @@ -653,7 +692,8 @@ @after { $import_as_name.tree = $atype; } - : name=NAME (AS asname=NAME)? { + : name=NAME (AS asname=NAME)? + { $atype = new aliasType($name, $name.text, $asname.text); } ; @@ -665,26 +705,30 @@ $dotted_as_name.tree = $atype; } - : dotted_name (AS NAME)? { + : dotted_name (AS NAME)? + { $atype = new aliasType($NAME, $dotted_name.text, $NAME.text); } ; //dotted_as_names: dotted_as_name (',' dotted_as_name)* dotted_as_names returns [aliasType[\] atypes] - : d+=dotted_as_name (COMMA! d+=dotted_as_name)* { + : d+=dotted_as_name (COMMA! d+=dotted_as_name)* + { $atypes = (aliasType[])$d.toArray(new aliasType[$d.size()]); } ; //dotted_name: NAME ('.' NAME)* -dotted_name : NAME (DOT attr)* - ; +dotted_name + : NAME (DOT attr)* + ; //global_stmt: 'global' NAME (',' NAME)* -global_stmt : GLOBAL n+=NAME (COMMA n+=NAME)* - -> ^(GLOBAL<Global>[$GLOBAL, actions.makeNames($n)]) - ; +global_stmt + : GLOBAL n+=NAME (COMMA n+=NAME)* + -> ^(GLOBAL<Global>[$GLOBAL, actions.makeNames($n)]) + ; //exec_stmt: 'exec' expr ['in' test [',' test]] exec_stmt @@ -694,35 +738,43 @@ @after { $exec_stmt.tree = stype; } - : EXEC expr[expr_contextType.Load] (IN t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load])?)? { + : EXEC expr[expr_contextType.Load] (IN t1=test[expr_contextType.Load] + (COMMA t2=test[expr_contextType.Load])?)? + { stype = new Exec($EXEC, (exprType)$expr.tree, (exprType)$t1.tree, (exprType)$t2.tree); - } + } ; //assert_stmt: 'assert' test [',' test] -assert_stmt : ASSERT t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load])? - -> ^(ASSERT<Assert>[$ASSERT, (exprType)$t1.tree, (exprType)$t2.tree]) - ; +assert_stmt + : ASSERT t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load])? + -> ^(ASSERT<Assert>[$ASSERT, (exprType)$t1.tree, (exprType)$t2.tree]) + ; //compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef -compound_stmt : if_stmt - | while_stmt - | for_stmt - | try_stmt - | with_stmt - | funcdef - | classdef - ; +compound_stmt + : if_stmt + | while_stmt + | for_stmt + | try_stmt + | with_stmt + | funcdef + | classdef + ; //if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] -if_stmt: IF test[expr_contextType.Load] COLON ifsuite=suite elifs+=elif_clause* (ORELSE COLON elsesuite=suite)? - -> ^(IF<If>[$IF, (exprType)$test.tree, actions.makeStmts($ifsuite.stypes), actions.makeElses($elsesuite.stypes, $elifs)]) - ; +if_stmt + : IF test[expr_contextType.Load] COLON ifsuite=suite elifs+=elif_clause* + (ORELSE COLON elsesuite=suite)? + -> ^(IF<If>[$IF, (exprType)$test.tree, actions.makeStmts($ifsuite.stypes), + actions.makeElses($elsesuite.stypes, $elifs)]) + ; //not in CPython's Grammar file -elif_clause : ELIF test[expr_contextType.Load] COLON suite - -> ^(ELIF<If>[$ELIF, (exprType)$test.tree, actions.makeStmts($suite.stypes), new stmtType[0\]]) - ; +elif_clause + : ELIF test[expr_contextType.Load] COLON suite + -> ^(ELIF<If>[$ELIF, (exprType)$test.tree, actions.makeStmts($suite.stypes), new stmtType[0\]]) + ; //while_stmt: 'while' test ':' suite ['else' ':' suite] while_stmt @@ -732,7 +784,8 @@ @after { $while_stmt.tree = stype; } - : WHILE test[expr_contextType.Load] COLON s1=suite (ORELSE COLON s2=suite)? { + : WHILE test[expr_contextType.Load] COLON s1=suite (ORELSE COLON s2=suite)? + { stype = actions.makeWhile($WHILE, (exprType)$test.tree, $s1.stypes, $s2.stypes); } ; @@ -745,9 +798,11 @@ @after { $for_stmt.tree = stype; } - : FOR exprlist[expr_contextType.Store] IN testlist[expr_contextType.Load] COLON s1=suite (ORELSE COLON s2=suite)? { - stype = actions.makeFor($FOR, $exprlist.etype, (exprType)$testlist.tree, $s1.stypes, $s2.stypes); - } + : FOR exprlist[expr_contextType.Store] IN testlist[expr_contextType.Load] COLON s1=suite + (ORELSE COLON s2=suite)? + { + stype = actions.makeFor($FOR, $exprlist.etype, (exprType)$testlist.tree, $s1.stypes, $s2.stypes); + } ; //try_stmt: ('try' ':' suite @@ -763,14 +818,16 @@ $try_stmt.tree = stype; } : TRY COLON trysuite=suite - ( e+=except_clause+ (ORELSE COLON elsesuite=suite)? (FINALLY COLON finalsuite=suite)? { + ( e+=except_clause+ (ORELSE COLON elsesuite=suite)? (FINALLY COLON finalsuite=suite)? + { stype = actions.makeTryExcept($TRY, $trysuite.stypes, $e, $elsesuite.stypes, $finalsuite.stypes); } - | FINALLY COLON finalsuite=suite { + | FINALLY COLON finalsuite=suite + { stype = actions.makeTryFinally($TRY, $trysuite.stypes, $finalsuite.stypes); } - ) - ; + ) + ; //with_stmt: 'with' test [ with_var ] ':' suite with_stmt @@ -780,42 +837,54 @@ @after { $with_stmt.tree = stype; } - :WITH test[expr_contextType.Load] (with_var)? COLON suite { - stype = new With($WITH, (exprType)$test.tree, $with_var.etype, actions.makeStmts($suite.stypes)); - } + : WITH test[expr_contextType.Load] (with_var)? COLON suite + { + stype = new With($WITH, (exprType)$test.tree, $with_var.etype, + actions.makeStmts($suite.stypes)); + } ; //with_var: ('as' | NAME) expr with_var returns [exprType etype] - : (AS | NAME) expr[expr_contextType.Load] { - $etype = (exprType)$expr.tree; - } + : (AS | NAME) expr[expr_contextType.Load] + { + $etype = (exprType)$expr.tree; + } ; //except_clause: 'except' [test [',' test]] -except_clause : EXCEPT (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Store])?)? COLON suite - -> ^(EXCEPT<excepthandlerType>[$EXCEPT, (exprType)$t1.tree, (exprType)$t2.tree, actions.makeStmts($suite.stypes), $EXCEPT.getLine(), $EXCEPT.getCharPositionInLine()]) - ; +except_clause + : EXCEPT (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Store])?)? COLON suite + -> ^(EXCEPT<excepthandlerType>[$EXCEPT, (exprType)$t1.tree, (exprType)$t2.tree, + actions.makeStmts($suite.stypes), $EXCEPT.getLine(), $EXCEPT.getCharPositionInLine()]) + ; //suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT suite returns [List stypes] @init { $stypes = new ArrayList(); } - : simple_stmt {$stypes = $simple_stmt.stypes;} - | NEWLINE! INDENT - (stmt {$stypes.addAll($stmt.stypes);} + : simple_stmt + { + $stypes = $simple_stmt.stypes; + } + | NEWLINE INDENT + (stmt + { + $stypes.addAll($stmt.stypes); + } )+ DEDENT ; //test: or_test ['if' or_test 'else' test] | lambdef test[expr_contextType ctype] :o1=or_test[ctype] - ( (IF or_test[null] ORELSE) => IF o2=or_test[ctype] ORELSE e=test[expr_contextType.Load] - -> ^(IF<IfExp>[$IF, (exprType)$o2.tree, (exprType)$o1.tree, (exprType)$e.tree]) - | -> or_test - ) - | lambdef {debug("parsed lambdef");} + ( (IF or_test[null] ORELSE) => IF o2=or_test[ctype] ORELSE e=test[expr_contextType.Load] + -> ^(IF<IfExp>[$IF, (exprType)$o2.tree, (exprType)$o1.tree, (exprType)$e.tree]) + | + -> or_test + ) + | lambdef ; //or_test: and_test ('or' and_test)* @@ -828,7 +897,8 @@ : left=and_test[ctype] ( (or=OR right+=and_test[ctype] )+ - | -> $left + | + -> $left ) ; @@ -843,7 +913,8 @@ ( (and=AND right+=not_test[ctype] )+ | - ) -> $left + -> $left + ) ; //not_test: 'not' not_test | comparison @@ -853,7 +924,10 @@ $not_test.tree = $etype; } } - : NOT nt=not_test[ctype] {$etype = new UnaryOp($NOT, unaryopType.Not, (exprType)$nt.tree);} + : NOT nt=not_test[ctype] + { + $etype = new UnaryOp($NOT, unaryopType.Not, (exprType)$nt.tree); + } | comparison[ctype] ; @@ -864,13 +938,15 @@ } @after { if (!cmps.isEmpty()) { - $comparison.tree = new Compare($left.tree, (exprType)$left.tree, actions.makeCmpOps(cmps), actions.makeExprs($right)); + $comparison.tree = new Compare($left.tree, (exprType)$left.tree, actions.makeCmpOps(cmps), + actions.makeExprs($right)); } } : left=expr[ctype] ( ( comp_op right+=expr[ctype] {cmps.add($comp_op.op);} )+ - | -> $left + | + -> $left ) ; @@ -906,7 +982,8 @@ : left=xor_expr ( (op=VBAR right+=xor_expr )+ - | -> $left + | + -> $left ) ; @@ -921,7 +998,8 @@ : left=and_expr ( (op=CIRCUMFLEX right+=and_expr )+ - | -> $left + | + -> $left ) ; @@ -935,7 +1013,8 @@ : left=shift_expr ( (op=AMPER right+=shift_expr )+ - | -> $left + | + -> $left ) ; @@ -952,7 +1031,8 @@ : left=arith_expr ( ( shift_op right+=arith_expr {ops.add($shift_op.op);} )+ - | -> $left + | + -> $left ) ; @@ -974,7 +1054,8 @@ : left=term ( (arith_op right+=term {ops.add($arith_op.op);} )+ - | -> $left + | + -> $left ) ; @@ -996,7 +1077,8 @@ : left=factor ( (term_op right+=factor {ops.add($term_op.op);} )+ - | -> $left + | + -> $left ) ; @@ -1023,38 +1105,37 @@ @after { $power.tree = $etype; } - : atom (t+=trailer[$atom.start])* (options {greedy=true;}:d=DOUBLESTAR factor)? { - //System.out.println("??? " + $d + " ??? " + $factor.tree); - $etype = (exprType)$atom.tree; - if ($t != null) { - //for(int i = $t.size() - 1; i > -1; i--) { - for(int i = 0; i < $t.size(); i++) { - Object o = $t.get(i); - if ($etype instanceof Context) { - ((Context)$etype).setContext(expr_contextType.Load); - } - //XXX: good place for an interface to avoid all of this instanceof - if (o instanceof Call) { - Call c = (Call)o; - c.func = $etype; - $etype = c; - } else if (o instanceof Subscript) { - Subscript c = (Subscript)o; - c.value = $etype; - $etype = c; - } else if (o instanceof Attribute) { - Attribute c = (Attribute)o; - c.value = $etype; - $etype = c; - } - } - } - if ($d != null) { - List right = new ArrayList(); - right.add($factor.tree); - $etype = actions.makeBinOp($etype, operatorType.Pow, right); - } - } + : atom (t+=trailer[$atom.start])* (options {greedy=true;}:d=DOUBLESTAR factor)? + { + $etype = (exprType)$atom.tree; + if ($t != null) { + for(int i = 0; i < $t.size(); i++) { + Object o = $t.get(i); + if ($etype instanceof Context) { + ((Context)$etype).setContext(expr_contextType.Load); + } + //XXX: good place for an interface to avoid all of this instanceof + if (o instanceof Call) { + Call c = (Call)o; + c.func = $etype; + $etype = c; + } else if (o instanceof Subscript) { + Subscript c = (Subscript)o; + c.value = $etype; + $etype = c; + } else if (o instanceof Attribute) { + Attribute c = (Attribute)o; + c.value = $etype; + $etype = c; + } + } + } + if ($d != null) { + List right = new ArrayList(); + right.add($factor.tree); + $etype = actions.makeBinOp($etype, operatorType.Pow, right); + } + } ; //atom: ('(' [yield_expr|testlist_gexp] ')' | @@ -1062,30 +1143,45 @@ // '{' [dictmaker] '}' | // '`' testlist1 '`' | // NAME | NUMBER | STRING+) -atom : LPAREN - ( yield_expr -> yield_expr - | testlist_gexp -> testlist_gexp - | -> ^(PYNODE<Tuple>[$LPAREN, new exprType[0\], $expr::ctype]) +atom + : LPAREN + ( yield_expr + -> yield_expr + | testlist_gexp + -> testlist_gexp + | + -> ^(LPAREN<Tuple>[$LPAREN, new exprType[0\], $expr::ctype]) + ) + RPAREN + | LBRACK + (listmaker[$LBRACK] + -> listmaker + | + -> ^(LBRACK<org.python.antlr.ast.List>[$LBRACK, new exprType[0\], $expr::ctype]) + ) + RBRACK + | LCURLY + (dictmaker + -> ^(LCURLY<Dict>[$LCURLY, actions.makeExprs($dictmaker.keys), + actions.makeExprs($dictmaker.values)]) + | + -> ^(LCURLY<Dict>[$LCURLY, new exprType[0\], new exprType[0\]]) ) - RPAREN - | LBRACK - (listmaker[$LBRACK] -> listmaker - | -> ^(LBRACK<org.python.antlr.ast.List>[$LBRACK, new exprType[0\], $expr::ctype]) - ) - RBRACK - | LCURLY - (dictmaker -> ^(LCURLY<Dict>[$LCURLY, actions.makeExprs($dictmaker.keys), actions.makeExprs($dictmaker.values)]) - | -> ^(LCURLY<Dict>[$LCURLY, new exprType[0\], new exprType[0\]]) - ) RCURLY - | lb=BACKQUOTE testlist[expr_contextType.Load] rb=BACKQUOTE -> ^(BACKQUOTE<Repr>[$lb, (exprType)$testlist.tree]) - | NAME -> ^(PYNODE<Name>[$NAME, $NAME.text, $expr::ctype]) - | INT -> ^(PYNODE<Num>[$INT, actions.makeInt($INT)]) - | LONGINT -> ^(PYNODE<Num>[$LONGINT, actions.makeInt($LONGINT)]) - | FLOAT -> ^(PYNODE<Num>[$FLOAT, actions.makeFloat($FLOAT)]) - | COMPLEX -> ^(PYNODE<Num>[$COMPLEX, actions.makeComplex($COMPLEX)]) + | lb=BACKQUOTE testlist[expr_contextType.Load] rb=BACKQUOTE + -> ^(BACKQUOTE<Repr>[$lb, (exprType)$testlist.tree]) + | NAME + -> ^(NAME<Name>[$NAME, $NAME.text, $expr::ctype]) + | INT + -> ^(INT<Num>[$INT, actions.makeInt($INT)]) + | LONGINT + -> ^(LONGINT<Num>[$LONGINT, actions.makeInt($LONGINT)]) + | FLOAT + -> ^(FLOAT<Num>[$FLOAT, actions.makeFloat($FLOAT)]) + | COMPLEX + -> ^(COMPLEX<Num>[$COMPLEX, actions.makeComplex($COMPLEX)]) | (S+=STRING)+ - -> ^(PYNODE<Str>[actions.extractStringToken($S), actions.extractStrings($S)]) + -> ^(STRING<Str>[actions.extractStringToken($S), actions.extractStrings($S)]) ; //listmaker: test ( list_for | (',' test)* [','] ) @@ -1098,15 +1194,18 @@ $listmaker.tree = etype; } : t+=test[expr_contextType.Load] - ( list_for[gens] { - Collections.reverse(gens); - comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); - etype = new ListComp($listmaker.start, (exprType)$t.get(0), c); - } - | (options {greedy=true;}:COMMA t+=test[expr_contextType.Load])* { - etype = new org.python.antlr.ast.List($lbrack, actions.makeExprs($t), $expr::ctype); - } - ) (COMMA)? + (list_for[gens] + { + Collections.reverse(gens); + comprehensionType[] c = + (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); + etype = new ListComp($listmaker.start, (exprType)$t.get(0), c); + } + | (options {greedy=true;}:COMMA t+=test[expr_contextType.Load])* + { + etype = new org.python.antlr.ast.List($lbrack, actions.makeExprs($t), $expr::ctype); + } + ) (COMMA)? ; //testlist_gexp: test ( gen_for | (',' test)* [','] ) @@ -1122,18 +1221,20 @@ } : t+=test[$expr::ctype] ( ((options {k=2;}: c1=COMMA t+=test[$expr::ctype])* (c2=COMMA)? - -> { $c1 != null || $c2 != null }? ^(PYNODE<Tuple>[$testlist_gexp.start, actions.makeExprs($t), $expr::ctype]) - -> test + -> { $c1 != null || $c2 != null }? + ^(COMMA<Tuple>[$testlist_gexp.start, actions.makeExprs($t), $expr::ctype]) + -> test ) - | ( gen_for[gens] { - Collections.reverse(gens); - comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); - exprType e = (exprType)$t.get(0); - if (e instanceof Context) { - ((Context)e).setContext(expr_contextType.Load); - } - etype = new GeneratorExp($testlist_gexp.start, (exprType)$t.get(0), c); - } + | (gen_for[gens] + { + Collections.reverse(gens); + comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); + exprType e = (exprType)$t.get(0); + if (e instanceof Context) { + ((Context)e).setContext(expr_contextType.Load); + } + etype = new GeneratorExp($testlist_gexp.start, (exprType)$t.get(0), c); + } ) ) ; @@ -1146,23 +1247,31 @@ @after { $lambdef.tree = etype; } - : LAMBDA (varargslist)? COLON test[expr_contextType.Load] { - argumentsType a = $varargslist.args; - if (a == null) { - a = new argumentsType($LAMBDA, new exprType[0], null, null, new exprType[0]); - } - etype = new Lambda($LAMBDA, a, (exprType)$test.tree); - } + : LAMBDA (varargslist)? COLON test[expr_contextType.Load] + { + argumentsType a = $varargslist.args; + if (a == null) { + a = new argumentsType($LAMBDA, new exprType[0], null, null, new exprType[0]); + } + etype = new Lambda($LAMBDA, a, (exprType)$test.tree); + } ; //trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME -trailer [Token begin]: LPAREN (arglist -> ^(LPAREN<Call>[$begin, null, actions.makeExprs($arglist.args), actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs]) - | -> ^(LPAREN<Call>[$LPAREN, null, new exprType[0\], new keywordType[0\], null, null]) - ) - RPAREN - | LBRACK s=subscriptlist[begin] RBRACK -> $s - | DOT attr -> ^(DOT<Attribute>[$begin, null, $attr.text, $expr::ctype]) - ; +trailer [Token begin] + : LPAREN + (arglist + -> ^(LPAREN<Call>[$begin, null, actions.makeExprs($arglist.args), + actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs]) + | + -> ^(LPAREN<Call>[$LPAREN, null, new exprType[0\], new keywordType[0\], null, null]) + ) + RPAREN + | LBRACK s=subscriptlist[begin] RBRACK + -> $s + | DOT attr + -> ^(DOT<Attribute>[$begin, null, $attr.text, $expr::ctype]) + ; //subscriptlist: subscript (',' subscript)* [','] //FIXME: tuples not always created when commas are present. @@ -1173,44 +1282,44 @@ @after { $subscriptlist.tree = etype; } - : sub+=subscript (options {greedy=true;}:c1=COMMA sub+=subscript)* (c2=COMMA)? { - boolean isTuple = false; - if ($c1 != null || $c2 != null) { - isTuple = true; - } - sliceType s = null; - List sltypes = $sub; - boolean extslice = false; + : sub+=subscript (options {greedy=true;}:c1=COMMA sub+=subscript)* (c2=COMMA)? + { + boolean isTuple = false; + if ($c1 != null || $c2 != null) { + isTuple = true; + } + sliceType s = null; + List sltypes = $sub; + boolean extslice = false; - //NEW LOGIC - if (isTuple) { - sliceType[] st; - List etypes = new ArrayList(); - for (Object o : sltypes) { - if (o instanceof Index) { - Index i = (Index)o; - etypes.add(i.value); - } else { - extslice = true; - break; - } - } - if (!extslice) { - exprType[] es = (exprType[])etypes.toArray(new exprType[etypes.size()]); - exprType t = new Tuple($begin, es, expr_contextType.Load); - s = new Index($begin, t); - } - } else if (sltypes.size() == 1) { - s = (sliceType)sltypes.get(0); - } else if (sltypes.size() != 0) { - extslice = true; - } - if (extslice) { - sliceType[] st = (sliceType[])sltypes.toArray(new sliceType[sltypes.size()]); - s = new ExtSlice($begin, st); - } - etype = new Subscript($begin, null, s, $expr::ctype); - } + if (isTuple) { + sliceType[] st; + List etypes = new ArrayList(); + for (Object o : sltypes) { + if (o instanceof Index) { + Index i = (Index)o; + etypes.add(i.value); + } else { + extslice = true; + break; + } + } + if (!extslice) { + exprType[] es = (exprType[])etypes.toArray(new exprType[etypes.size()]); + exprType t = new Tuple($begin, es, expr_contextType.Load); + s = new Index($begin, t); + } + } else if (sltypes.size() == 1) { + s = (sliceType)sltypes.get(0); + } else if (sltypes.size() != 0) { + extslice = true; + } + if (extslice) { + sliceType[] st = (sliceType[])sltypes.toArray(new sliceType[sltypes.size()]); + s = new ExtSlice($begin, st); + } + etype = new Subscript($begin, null, s, $expr::ctype); + } ; //subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop] @@ -1220,39 +1329,49 @@ $subscript.tree = $sltype; } } - : d1=DOT DOT DOT -> DOT<Ellipsis>[$d1] - | (test[null] COLON) => lower=test[expr_contextType.Load] (c1=COLON (upper1=test[expr_contextType.Load])? (sliceop)?)? { + : d1=DOT DOT DOT + -> DOT<Ellipsis>[$d1] + | (test[null] COLON) + => lower=test[expr_contextType.Load] (c1=COLON (upper1=test[expr_contextType.Load])? (sliceop)?)? + { $sltype = actions.makeSubscript($lower.tree, $c1, $upper1.tree, $sliceop.tree); - } - | (COLON) => c2=COLON (upper2=test[expr_contextType.Load])? (sliceop)? { - $sltype = actions.makeSubscript(null, $c2, $upper2.tree, $sliceop.tree); - } - | test[expr_contextType.Load] -> ^(PYNODE<Index>[$test.start, (exprType)$test.tree]) + } + | (COLON) + => c2=COLON (upper2=test[expr_contextType.Load])? (sliceop)? + { + $sltype = actions.makeSubscript(null, $c2, $upper2.tree, $sliceop.tree); + } + | test[expr_contextType.Load] + -> ^(LPAREN<Index>[$test.start, (exprType)$test.tree]) ; //sliceop: ':' [test] -sliceop : COLON (test[expr_contextType.Load] -> test - )? - ; +sliceop + : COLON + (test[expr_contextType.Load] + -> test + )? + ; //exprlist: expr (',' expr)* [','] exprlist[expr_contextType ctype] returns [exprType etype] - : (expr[null] COMMA) => e+=expr[ctype] (options {k=2;}: COMMA e+=expr[ctype])* (COMMA)? { - $etype = new Tuple($exprlist.start, actions.makeExprs($e), ctype); - } - | expr[ctype] { - //System.out.println("expecting " + ctype); + : (expr[null] COMMA) => e+=expr[ctype] (options {k=2;}: COMMA e+=expr[ctype])* (COMMA)? + { + $etype = new Tuple($exprlist.start, actions.makeExprs($e), ctype); + } + | expr[ctype] + { $etype = (exprType)$expr.tree; - //System.out.println("got " + ((Name)$etype).ctx); - - } + } ; //XXX: I'm hoping I can get rid of this and merge it back with exprlist -- but for now I need an exprlist that does not produce tuples // at least for del_stmt del_list returns [List etypes] : e+=expr[expr_contextType.Del] (options {k=2;}: COMMA e+=expr[expr_contextType.Del])* (COMMA)? - {$etypes = $e;} + { + $etypes = $e; + } ; //testlist: test (',' test)* [','] @@ -1263,12 +1382,15 @@ @after { $testlist.tree = etype; } - : (test[null] COMMA) => t+=test[ctype] (options {k=2;}: c1=COMMA t+=test[ctype])* (c2=COMMA)? { + : (test[null] COMMA) + => t+=test[ctype] (options {k=2;}: c1=COMMA t+=test[ctype])* (c2=COMMA)? + { etype = new Tuple($testlist.start, actions.makeExprs($t), ctype); - } - | test[ctype] { + } + | test[ctype] + { etype = (exprType)$test.tree; - } + } ; //XXX: @@ -1277,8 +1399,9 @@ //dictmaker: test ':' test (',' test ':' test)* [','] dictmaker returns [List keys, List values] : k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load] - (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])* - (COMMA)? { + (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])* + (COMMA)? + { $keys = $k; $values= $v; } @@ -1292,9 +1415,11 @@ @after { $classdef.tree = stype; } - :CLASS NAME (LPAREN testlist[expr_contextType.Load]? RPAREN)? COLON suite { - stype = new ClassDef($CLASS, $NAME.getText(), actions.makeBases((exprType)$testlist.tree), actions.makeStmts($suite.stypes)); - } + : CLASS NAME (LPAREN testlist[expr_contextType.Load]? RPAREN)? COLON suite + { + stype = new ClassDef($CLASS, $NAME.getText(), actions.makeBases((exprType)$testlist.tree), + actions.makeStmts($suite.stypes)); + } ; //arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | '**' test) @@ -1304,24 +1429,27 @@ List kws = new ArrayList(); } : argument[arguments, kws] (COMMA argument[arguments, kws])* - ( COMMA - ( STAR s=test[expr_contextType.Load] (COMMA DOUBLESTAR k=test[expr_contextType.Load])? - | DOUBLESTAR k=test[expr_contextType.Load] - )? - )? { - $args=arguments; - $keywords=kws; - $starargs=(exprType)$s.tree; + (COMMA + ( STAR s=test[expr_contextType.Load] (COMMA DOUBLESTAR k=test[expr_contextType.Load])? + | DOUBLESTAR k=test[expr_contextType.Load] + )? + )? + { + $args=arguments; + $keywords=kws; + $starargs=(exprType)$s.tree; + $kwargs=(exprType)$k.tree; + } + | STAR s=test[expr_contextType.Load] (COMMA DOUBLESTAR k=test[expr_contextType.Load])? + { + $starargs=(exprType)$s.tree; $kwargs=(exprType)$k.tree; - } - | STAR s=test[expr_contextType.Load] (COMMA DOUBLESTAR k=test[expr_contextType.Load])? { - $starargs=(exprType)$s.tree; + } + | DOUBLESTAR k=test[expr_contextType.Load] + { $kwargs=(exprType)$k.tree; - } - | DOUBLESTAR k=test[expr_contextType.Load] { - $kwargs=(exprType)$k.tree; - } - ; + } + ; //argument: test [gen_for] | test '=' test # Really [keyword '='] test argument[List arguments, List kws] @@ -1329,15 +1457,19 @@ List gens = new ArrayList(); } : t1=test[expr_contextType.Load] - ( (ASSIGN t2=test[expr_contextType.Load]) { - $kws.add(new exprType[]{(exprType)$t1.tree, (exprType)$t2.tree}); - } - | gen_for[gens] { - Collections.reverse(gens); - comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); - arguments.add(new GeneratorExp($gen_for.start, (exprType)$t1.tree, c)); - } - | {$arguments.add($t1.tree);} + ((ASSIGN t2=test[expr_contextType.Load]) + { + $kws.add(new exprType[]{(exprType)$t1.tree, (exprType)$t2.tree}); + } + | gen_for[gens] + { + Collections.reverse(gens); + comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); + arguments.add(new GeneratorExp($gen_for.start, (exprType)$t1.tree, c)); + } + | { + $arguments.add($t1.tree); + } ) ; @@ -1351,20 +1483,22 @@ //list_for: 'for' exprlist 'in' testlist_safe [list_iter] list_for [List 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}; - } else { - e = new exprType[0]; - } - gens.add(new comprehensionType($FOR, $exprlist.etype, (exprType)$testlist.tree, e)); - } + : 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}; + } else { + e = new exprType[0]; + } + gens.add(new comprehensionType($FOR, $exprlist.etype, (exprType)$testlist.tree, e)); + } ; //list_if: 'if' test [list_iter] list_if[List gens] returns [exprType etype] - : IF test[expr_contextType.Load] (list_iter[gens])? { + : IF test[expr_contextType.Load] (list_iter[gens])? + { $etype = (exprType)$test.tree; } ; @@ -1372,35 +1506,39 @@ //gen_iter: gen_for | gen_if gen_iter [List gens] returns [exprType etype] : gen_for[gens] - | gen_if[gens] { - $etype = $gen_if.etype; - } + | gen_if[gens] + { + $etype = $gen_if.etype; + } ; //gen_for: 'for' exprlist 'in' or_test [gen_iter] gen_for [List 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}; - } else { - e = new exprType[0]; - } - gens.add(new comprehensionType($FOR, $exprlist.etype, (exprType)$or_test.tree, e)); - } - ; + : 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}; + } else { + e = new exprType[0]; + } + gens.add(new comprehensionType($FOR, $exprlist.etype, (exprType)$or_test.tree, e)); + } + ; //gen_if: 'if' old_test [gen_iter] gen_if[List gens] returns [exprType etype] - : IF test[expr_contextType.Load] gen_iter[gens]? { - $etype = (exprType)$test.tree; - } + : IF test[expr_contextType.Load] gen_iter[gens]? + { + $etype = (exprType)$test.tree; + } ; //yield_expr: 'yield' [testlist] -yield_expr : YIELD testlist[expr_contextType.Load]? - -> ^(YIELD<Yield>[$YIELD, (exprType)$testlist.tree]) - ; +yield_expr + : YIELD testlist[expr_contextType.Load]? + -> ^(YIELD<Yield>[$YIELD, (exprType)$testlist.tree]) + ; //XXX: //testlist1: test (',' test)* Modified: branches/nowalker/src/org/python/antlr/ModuleParser.java =================================================================== --- branches/nowalker/src/org/python/antlr/ModuleParser.java 2008-08-25 21:18:03 UTC (rev 5247) +++ branches/nowalker/src/org/python/antlr/ModuleParser.java 2008-08-26 02:04:27 UTC (rev 5248) @@ -34,28 +34,14 @@ tokens = new CommonTokenStream(indentedSource); PythonParser parser = new PythonParser(tokens); parser.setErrorHandler(errorHandler); - //PythonTreeAdaptor pta = new PythonTreeAdaptor(); parser.setTreeAdaptor(new PythonTreeAdaptor()); try { PythonParser.file_input_return r = parser.file_input(); tree = (modType)r.tree; - //CommonTreeNodeStream nodes = new CommonTreeNodeStream(new PythonTreeAdaptor(), (Tree)r.tree); - //nodes.setTokenStream(tokens); - //PythonWalker walker = new PythonWalker(nodes); - //walker.setTreeAdaptor(new PythonTreeAdaptor()); - //walker.setErrorHandler(errorHandler); - //tree = (modType)walker.module().tree; - if (tree == null) { - //XXX: seems like I should be able to get antlr to give me an empty Module instead - // of null so I wouldn't need to build an empty Module by hand here... - return new Module(new PythonTree(new CommonToken(PyLexer.PYNODE)), new stmtType[0]); - } } catch (RecognitionException e) { //XXX: this can't happen. Need to strip the throws from antlr // generated code. } - return tree; } - } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-26 12:21:45
|
Revision: 5249 http://jython.svn.sourceforge.net/jython/?rev=5249&view=rev Author: fwierzbicki Date: 2008-08-26 12:21:42 +0000 (Tue, 26 Aug 2008) Log Message: ----------- Remove unnecessary constructor on BinOp (now it is just the generated version again) Remove some whitespace in Python.g Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/ast/BinOp.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-26 02:04:27 UTC (rev 5248) +++ branches/nowalker/grammar/Python.g 2008-08-26 12:21:42 UTC (rev 5249) @@ -1261,7 +1261,7 @@ trailer [Token begin] : LPAREN (arglist - -> ^(LPAREN<Call>[$begin, null, actions.makeExprs($arglist.args), + -> ^(LPAREN<Call>[$begin, null, actions.makeExprs($arglist.args), actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs]) | -> ^(LPAREN<Call>[$LPAREN, null, new exprType[0\], new keywordType[0\], null, null]) Modified: branches/nowalker/src/org/python/antlr/ast/BinOp.java =================================================================== --- branches/nowalker/src/org/python/antlr/ast/BinOp.java 2008-08-26 02:04:27 UTC (rev 5248) +++ branches/nowalker/src/org/python/antlr/ast/BinOp.java 2008-08-26 12:21:42 UTC (rev 5249) @@ -13,10 +13,6 @@ public static final String[] _fields = new String[] {"left","op","right"}; - public BinOp(Token token) { - super(token); - } - public BinOp(Token token, exprType left, operatorType op, exprType right) { super(token); this.left = left; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-26 15:05:24
|
Revision: 5250 http://jython.svn.sourceforge.net/jython/?rev=5250&view=rev Author: fwierzbicki Date: 2008-08-26 15:05:19 +0000 (Tue, 26 Aug 2008) Log Message: ----------- Moved makeSliceType code to GrammarActions. Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/GrammarActions.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-26 12:21:42 UTC (rev 5249) +++ branches/nowalker/grammar/Python.g 2008-08-26 15:05:19 UTC (rev 5250) @@ -1274,7 +1274,6 @@ ; //subscriptlist: subscript (',' subscript)* [','] -//FIXME: tuples not always created when commas are present. subscriptlist[Token begin] returns [exprType etype] @init { exprType etype = null; @@ -1284,40 +1283,7 @@ } : sub+=subscript (options {greedy=true;}:c1=COMMA sub+=subscript)* (c2=COMMA)? { - boolean isTuple = false; - if ($c1 != null || $c2 != null) { - isTuple = true; - } - sliceType s = null; - List sltypes = $sub; - boolean extslice = false; - - if (isTuple) { - sliceType[] st; - List etypes = new ArrayList(); - for (Object o : sltypes) { - if (o instanceof Index) { - Index i = (Index)o; - etypes.add(i.value); - } else { - extslice = true; - break; - } - } - if (!extslice) { - exprType[] es = (exprType[])etypes.toArray(new exprType[etypes.size()]); - exprType t = new Tuple($begin, es, expr_contextType.Load); - s = new Index($begin, t); - } - } else if (sltypes.size() == 1) { - s = (sliceType)sltypes.get(0); - } else if (sltypes.size() != 0) { - extslice = true; - } - if (extslice) { - sliceType[] st = (sliceType[])sltypes.toArray(new sliceType[sltypes.size()]); - s = new ExtSlice($begin, st); - } + sliceType s = actions.makeSliceType($begin, $c1, $c2, $sub); etype = new Subscript($begin, null, s, $expr::ctype); } ; Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-26 12:21:42 UTC (rev 5249) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-26 15:05:19 UTC (rev 5250) @@ -706,4 +706,42 @@ } return current; } + + sliceType makeSliceType(Token begin, Token c1, Token c2, List sltypes) { + boolean isTuple = false; + if (c1 != null || c2 != null) { + isTuple = true; + } + sliceType s = null; + boolean extslice = false; + + if (isTuple) { + sliceType[] st; + List etypes = new ArrayList(); + for (Object o : sltypes) { + if (o instanceof Index) { + Index i = (Index)o; + etypes.add(i.value); + } else { + extslice = true; + break; + } + } + if (!extslice) { + exprType[] es = (exprType[])etypes.toArray(new exprType[etypes.size()]); + exprType t = new Tuple(begin, es, expr_contextType.Load); + s = new Index(begin, t); + } + } else if (sltypes.size() == 1) { + s = (sliceType)sltypes.get(0); + } else if (sltypes.size() != 0) { + extslice = true; + } + if (extslice) { + sliceType[] st = (sliceType[])sltypes.toArray(new sliceType[sltypes.size()]); + s = new ExtSlice(begin, st); + } + return s; + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-26 16:51:17
|
Revision: 5251 http://jython.svn.sourceforge.net/jython/?rev=5251&view=rev Author: fwierzbicki Date: 2008-08-26 16:51:15 +0000 (Tue, 26 Aug 2008) Log Message: ----------- Moved Subscript creation up a rule - fixed a bunch of unit tests. Modified Paths: -------------- branches/nowalker/build.xml branches/nowalker/grammar/Python.g Modified: branches/nowalker/build.xml =================================================================== --- branches/nowalker/build.xml 2008-08-26 15:05:19 UTC (rev 5250) +++ branches/nowalker/build.xml 2008-08-26 16:51:15 UTC (rev 5251) @@ -318,9 +318,7 @@ change to grammar files. If you are working on the grammars you might want to comment this out, as a clean is really only needed if you change the tokens defined in Python.g (and cleans make the build slow) --> - <antcall target="clean"/> <!-- force jarjar build --> - <property name="jarjar.needed" value="true" /> </target> <target name ="prepare-output" depends="init,needed-check,clean-if-antlr-needed,make-output-dirs"/> Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-26 15:05:19 UTC (rev 5250) +++ branches/nowalker/grammar/Python.g 2008-08-26 16:51:15 UTC (rev 5251) @@ -1105,7 +1105,7 @@ @after { $power.tree = $etype; } - : atom (t+=trailer[$atom.start])* (options {greedy=true;}:d=DOUBLESTAR factor)? + : atom (t+=trailer[$atom.start, $atom.tree])* (options {greedy=true;}:d=DOUBLESTAR factor)? { $etype = (exprType)$atom.tree; if ($t != null) { @@ -1258,33 +1258,32 @@ ; //trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME -trailer [Token begin] +trailer [Token begin, PythonTree tree] : LPAREN (arglist - -> ^(LPAREN<Call>[$begin, null, actions.makeExprs($arglist.args), + -> ^(LPAREN<Call>[$begin, (exprType)$tree, actions.makeExprs($arglist.args), actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs]) | - -> ^(LPAREN<Call>[$LPAREN, null, new exprType[0\], new keywordType[0\], null, null]) + -> ^(LPAREN<Call>[$LPAREN, (exprType)$tree, new exprType[0\], new keywordType[0\], null, null]) ) RPAREN - | LBRACK s=subscriptlist[begin] RBRACK - -> $s + | LBRACK subscriptlist[$begin] RBRACK + -> ^(LBRACK<Subscript>[$begin, (exprType)$tree, (sliceType)$subscriptlist.tree, $expr::ctype]) | DOT attr - -> ^(DOT<Attribute>[$begin, null, $attr.text, $expr::ctype]) + -> ^(DOT<Attribute>[$begin, (exprType)$tree, $attr.text, $expr::ctype]) ; //subscriptlist: subscript (',' subscript)* [','] -subscriptlist[Token begin] returns [exprType etype] +subscriptlist[Token begin] @init { - exprType etype = null; + sliceType sltype = null; } @after { - $subscriptlist.tree = etype; + $subscriptlist.tree = sltype; } : sub+=subscript (options {greedy=true;}:c1=COMMA sub+=subscript)* (c2=COMMA)? { - sliceType s = actions.makeSliceType($begin, $c1, $c2, $sub); - etype = new Subscript($begin, null, s, $expr::ctype); + sltype = actions.makeSliceType($begin, $c1, $c2, $sub); } ; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-26 20:17:53
|
Revision: 5253 http://jython.svn.sourceforge.net/jython/?rev=5253&view=rev Author: fwierzbicki Date: 2008-08-26 20:17:50 +0000 (Tue, 26 Aug 2008) Log Message: ----------- checking for bad assignment statements. Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/GrammarActions.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-26 19:37:34 UTC (rev 5252) +++ branches/nowalker/grammar/Python.g 2008-08-26 20:17:50 UTC (rev 5253) @@ -433,6 +433,9 @@ //fpdef: NAME | '(' fplist ')' fpdef[expr_contextType ctype] +@after { + actions.checkAssign((exprType)$fpdef.tree); +} : NAME -> ^(NAME<Name>[$NAME, $NAME.text, ctype]) | (LPAREN fpdef[null] COMMA) => LPAREN fplist RPAREN @@ -498,11 +501,13 @@ : ((testlist[null] augassign) => lhs=testlist[expr_contextType.AugStore] ( (aay=augassign y1=yield_expr { + actions.checkAssign((exprType)$lhs.tree); stype = new AugAssign($lhs.tree, (exprType)$lhs.tree, $aay.op, (exprType)$y1.tree); } ) | (aat=augassign rhs=testlist[expr_contextType.Load] { + actions.checkAssign((exprType)$lhs.tree); stype = new AugAssign($lhs.tree, (exprType)$lhs.tree, $aat.op, (exprType)$rhs.tree); } ) Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-26 19:37:34 UTC (rev 5252) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-26 20:17:50 UTC (rev 5253) @@ -276,16 +276,12 @@ exprType[] makeAssignTargets(exprType lhs, List rhs) { exprType[] e = new exprType[rhs.size()]; + checkAssign(lhs); e[0] = lhs; for(int i=0;i<rhs.size() - 1;i++) { - Object o = rhs.get(i); - if (o instanceof PythonParser.testlist_return) { - //XXX: Check to see if this is really happening anymore - PythonParser.testlist_return r = (PythonParser.testlist_return)o; - e[i + 1] = (exprType)r.getTree(); - } else { - e[i + 1] = (exprType)o; - } + exprType r = (exprType)rhs.get(i); + checkAssign(r); + e[i + 1] = r; } return e; } @@ -339,6 +335,7 @@ if (args != null) { for(int i=0;i<args.size();i++) { exprType[] e = (exprType[])args.get(i); + checkAssign(e[0]); Name arg = (Name)e[0]; k.add(new keywordType(arg, arg.id, e[1])); } @@ -618,6 +615,8 @@ errorHandler.error("can't assign to number", e); } else if (e instanceof Yield) { errorHandler.error("can't assign to yield expression", e); + } else if (e instanceof BinOp) { + errorHandler.error("can't assign to operator", e); } else if (e instanceof Tuple) { //XXX: performance problem? Any way to do this better? exprType[] elts = ((Tuple)e).elts; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-27 00:44:38
|
Revision: 5254 http://jython.svn.sourceforge.net/jython/?rev=5254&view=rev Author: fwierzbicki Date: 2008-08-27 00:44:35 +0000 (Wed, 27 Aug 2008) Log Message: ----------- Fix illegal Lambda statements and more illegal assigns. Also raise exceptions on illegal gen expression arguments. Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/GrammarActions.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-26 20:17:50 UTC (rev 5253) +++ branches/nowalker/grammar/Python.g 2008-08-27 00:44:35 UTC (rev 5254) @@ -851,7 +851,7 @@ //with_var: ('as' | NAME) expr with_var returns [exprType etype] - : (AS | NAME) expr[expr_contextType.Load] + : (AS | NAME) expr[expr_contextType.Store] { $etype = (exprType)$expr.tree; } @@ -1397,14 +1397,18 @@ @init { List arguments = new ArrayList(); List kws = new ArrayList(); + List gens = new ArrayList(); } - : argument[arguments, kws] (COMMA argument[arguments, kws])* + : 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])? | DOUBLESTAR k=test[expr_contextType.Load] )? )? { + if (arguments.size() > 1 && gens.size() > 0) { + actions.errorGenExpNotSoleArg(new PythonTree($arglist.start)); + } $args=arguments; $keywords=kws; $starargs=(exprType)$s.tree; @@ -1422,19 +1426,20 @@ ; //argument: test [gen_for] | test '=' test # Really [keyword '='] test -argument[List arguments, List kws] -@init { - List gens = new ArrayList(); -} +argument[List arguments, List kws, List gens, boolean first] returns [boolean genarg] : t1=test[expr_contextType.Load] ((ASSIGN t2=test[expr_contextType.Load]) { $kws.add(new exprType[]{(exprType)$t1.tree, (exprType)$t2.tree}); } - | gen_for[gens] + | gen_for[$gens] { - Collections.reverse(gens); - comprehensionType[] c = (comprehensionType[])gens.toArray(new comprehensionType[gens.size()]); + if (!first) { + actions.errorGenExpNotSoleArg($gen_for.tree); + } + $genarg = true; + Collections.reverse($gens); + comprehensionType[] c = (comprehensionType[])$gens.toArray(new comprehensionType[$gens.size()]); arguments.add(new GeneratorExp($gen_for.start, (exprType)$t1.tree, c)); } | { Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-26 20:17:50 UTC (rev 5253) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-27 00:44:35 UTC (rev 5254) @@ -299,6 +299,9 @@ if (tree instanceof GeneratorExp) { GeneratorExp g = (GeneratorExp)tree; recurseSetContext(g.elt, context); + } else if (tree instanceof ListComp) { + ListComp lc = (ListComp)tree; + recurseSetContext(lc.elt, context); } else if (!(tree instanceof ListComp)) { for (int i=0; i<tree.getChildCount(); i++) { recurseSetContext(tree.getChild(i), context); @@ -617,6 +620,8 @@ errorHandler.error("can't assign to yield expression", e); } else if (e instanceof BinOp) { errorHandler.error("can't assign to operator", e); + } else if (e instanceof Lambda) { + errorHandler.error("can't assign to lambda", e); } else if (e instanceof Tuple) { //XXX: performance problem? Any way to do this better? exprType[] elts = ((Tuple)e).elts; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-08-27 02:38:38
|
Revision: 5255 http://jython.svn.sourceforge.net/jython/?rev=5255&view=rev Author: fwierzbicki Date: 2008-08-27 02:38:35 +0000 (Wed, 27 Aug 2008) Log Message: ----------- Fix for FunctionDef and Call problems. Modified Paths: -------------- branches/nowalker/grammar/Python.g branches/nowalker/src/org/python/antlr/GrammarActions.java Modified: branches/nowalker/grammar/Python.g =================================================================== --- branches/nowalker/grammar/Python.g 2008-08-27 00:44:35 UTC (rev 5254) +++ branches/nowalker/grammar/Python.g 2008-08-27 02:38:35 UTC (rev 5255) @@ -359,25 +359,42 @@ } : AT dotted_attr ( LPAREN (arglist - {$etype = new Call($LPAREN, $dotted_attr.etype, actions.makeExprs($arglist.args), - actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs);} - | {$etype = $dotted_attr.etype;} + { + $etype = actions.makeCall($LPAREN, $dotted_attr.etype, $arglist.args, + $arglist.keywords, $arglist.starargs, $arglist.kwargs); + } + |{ + $etype = actions.makeCall($LPAREN, $dotted_attr.etype); + } ) RPAREN - | { $etype = $dotted_attr.etype; } + | { + $etype = $dotted_attr.etype; + } ) NEWLINE ; //decorators: decorator+ decorators returns [List etypes] - : d+=decorator+ {$etypes = $d;} + : d+=decorator+ + { + $etypes = $d; + } ; //funcdef: [decorators] 'def' NAME parameters ':' suite -funcdef : decorators? DEF NAME parameters COLON suite - -> ^(DEF<FunctionDef>[$DEF, $NAME.text, $parameters.args, actions.makeStmts($suite.stypes), - actions.makeExprs($decorators.etypes)]) - ; +funcdef +@init { stmtType stype = null; } +@after { $funcdef.tree = stype; } + : decorators? DEF NAME parameters COLON suite + { + Token t = $DEF; + if ($decorators.start != null) { + t = $decorators.start; + } + stype = actions.makeFuncdef(t, $NAME, $parameters.args, $suite.stypes, $decorators.etypes); + } + ; //parameters: '(' [varargslist] ')' parameters returns [argumentsType args] @@ -1387,7 +1404,7 @@ } : CLASS NAME (LPAREN testlist[expr_contextType.Load]? RPAREN)? COLON suite { - stype = new ClassDef($CLASS, $NAME.getText(), actions.makeBases((exprType)$testlist.tree), + stype = new ClassDef($CLASS, actions.cantBeNone($NAME), actions.makeBases((exprType)$testlist.tree), actions.makeStmts($suite.stypes)); } ; @@ -1443,6 +1460,9 @@ arguments.add(new GeneratorExp($gen_for.start, (exprType)$t1.tree, c)); } | { + if (kws.size() > 0) { + errorHandler.error("non-keyword arg after keyword arg", $t1.tree); + } $arguments.add($t1.tree); } ) Modified: branches/nowalker/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-27 00:44:35 UTC (rev 5254) +++ branches/nowalker/src/org/python/antlr/GrammarActions.java 2008-08-27 02:38:35 UTC (rev 5255) @@ -233,6 +233,7 @@ if (target == null || iter == null) { return errorHandler.errorStmt(new PythonTree(t)); } + cantBeNone(target); stmtType[] o = makeStmts(orelse); stmtType[] b = makeStmts(body); @@ -258,9 +259,9 @@ return new TryFinally(t, b, f); } - stmtType makeFunctionDef(PythonTree t, PythonTree nameToken, argumentsType args, List funcStatements, List decorators) { + stmtType makeFuncdef(Token t, Token nameToken, argumentsType args, List funcStatements, List decorators) { if (nameToken == null) { - return errorHandler.errorStmt(t); + return errorHandler.errorStmt(new PythonTree(t)); } cantBeNone(nameToken); argumentsType a; @@ -554,13 +555,13 @@ return new For(t, target, iter, b, o); } - exprType makeCall(PythonTree t, exprType func) { + exprType makeCall(Token t, exprType func) { return makeCall(t, func, null, null, null, null); } - exprType makeCall(PythonTree t, exprType func, List args, List keywords, exprType starargs, exprType kwargs) { + exprType makeCall(Token t, exprType func, List args, List keywords, exprType starargs, exprType kwargs) { if (func == null) { - return errorHandler.errorExpr(t); + return errorHandler.errorExpr(new PythonTree(t)); } keywordType[] k = makeKeywords(keywords); exprType[] a = makeExprs(args); @@ -603,6 +604,13 @@ return new UnaryOp(t, unaryopType.USub, o); } + String cantBeNone(Token t) { + if (t == null || t.getText().equals("None")) { + errorHandler.error("can't be None", new PythonTree(t)); + } + return t.getText(); + } + void cantBeNone(PythonTree e) { if (e.getText().equals("None")) { errorHandler.error("can't be None", e); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |