From: <fwi...@us...> - 2008-09-26 17:02:02
|
Revision: 5352 http://jython.svn.sourceforge.net/jython/?rev=5352&view=rev Author: fwierzbicki Date: 2008-09-26 17:01:58 +0000 (Fri, 26 Sep 2008) Log Message: ----------- Fixes an infinite loop that occurs when there is an unterminated triple string and ListErrorHandler is being used. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2008-09-26 15:37:19 UTC (rev 5351) +++ trunk/jython/grammar/Python.g 2008-09-26 17:01:58 UTC (rev 5352) @@ -250,6 +250,10 @@ } catch (NoViableAltException nva) { errorHandler.reportError(this, nva); errorHandler.recover(this, nva); // throw out current char and try again + } catch (FailedPredicateException fp) { + //XXX: added this for failed STRINGPART + errorHandler.reportError(this, fp); + errorHandler.recover(this, fp); // throw out current char and try again } catch (RecognitionException re) { errorHandler.reportError(this, re); // match() routine has already called recover() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-10-14 19:28:37
|
Revision: 5392 http://jython.svn.sourceforge.net/jython/?rev=5392&view=rev Author: fwierzbicki Date: 2008-10-14 19:28:28 +0000 (Tue, 14 Oct 2008) Log Message: ----------- Added inFinally parameter to suite rule, and a dynamically scoped parameter continueIllegal to support disallowing continue in a finally clause. This fixes test_syntax. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2008-10-14 16:43:46 UTC (rev 5391) +++ trunk/jython/grammar/Python.g 2008-10-14 19:28:28 UTC (rev 5392) @@ -402,7 +402,7 @@ funcdef @init { stmtType stype = null; } @after { $funcdef.tree = stype; } - : decorators? DEF NAME parameters COLON suite + : decorators? DEF NAME parameters COLON suite[false] { Token t = $DEF; if ($decorators.start != null) { @@ -663,7 +663,11 @@ //continue_stmt: 'continue' continue_stmt - : CONTINUE + : CONTINUE { + if (!$suite.isEmpty() && $suite::continueIllegal) { + errorHandler.error("'continue' not supported inside 'finally' clause", new PythonTree($continue_stmt.start)); + } + } -> ^(CONTINUE<Continue>[$CONTINUE]) ; @@ -802,7 +806,7 @@ //if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] if_stmt - : IF test[expr_contextType.Load] COLON ifsuite=suite elif_clause[$test.start]? + : IF test[expr_contextType.Load] COLON ifsuite=suite[false] elif_clause[$test.start]? -> ^(IF<If>[$IF, actions.castExpr($test.tree), actions.castStmts($ifsuite.stypes), actions.makeElse($elif_clause.stypes, $elif_clause.tree)]) ; @@ -812,7 +816,7 @@ : else_clause { $stypes = $else_clause.stypes; } - | ELIF test[expr_contextType.Load] COLON suite + | ELIF test[expr_contextType.Load] COLON suite[false] (e2=elif_clause[$iftest] -> ^(ELIF<If>[$iftest, actions.castExpr($test.tree), actions.castStmts($suite.stypes), actions.makeElse($e2.stypes, $e2.tree)]) | @@ -822,7 +826,7 @@ //not in CPython's Grammar file else_clause returns [List stypes] - : ORELSE COLON elsesuite=suite { + : ORELSE COLON elsesuite=suite[false] { $stypes = $suite.stypes; } ; @@ -835,7 +839,7 @@ @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[false] (ORELSE COLON s2=suite[false])? { stype = actions.makeWhile($WHILE, actions.castExpr($test.tree), $s1.stypes, $s2.stypes); } @@ -849,8 +853,8 @@ @after { $for_stmt.tree = stype; } - : FOR exprlist[expr_contextType.Store] IN testlist[expr_contextType.Load] COLON s1=suite - (ORELSE COLON s2=suite)? + : FOR exprlist[expr_contextType.Store] IN testlist[expr_contextType.Load] COLON s1=suite[false] + (ORELSE COLON s2=suite[false])? { stype = actions.makeFor($FOR, $exprlist.etype, actions.castExpr($testlist.tree), $s1.stypes, $s2.stypes); } @@ -868,12 +872,12 @@ @after { $try_stmt.tree = stype; } - : TRY COLON trysuite=suite - ( e+=except_clause+ (ORELSE COLON elsesuite=suite)? (FINALLY COLON finalsuite=suite)? + : TRY COLON trysuite=suite[!$suite.isEmpty() && $suite::continueIllegal] + ( e+=except_clause+ (ORELSE COLON elsesuite=suite[!$suite.isEmpty() && $suite::continueIllegal])? (FINALLY COLON finalsuite=suite[true])? { stype = actions.makeTryExcept($TRY, $trysuite.stypes, $e, $elsesuite.stypes, $finalsuite.stypes); } - | FINALLY COLON finalsuite=suite + | FINALLY COLON finalsuite=suite[true] { stype = actions.makeTryFinally($TRY, $trysuite.stypes, $finalsuite.stypes); } @@ -888,7 +892,7 @@ @after { $with_stmt.tree = stype; } - : WITH test[expr_contextType.Load] (with_var)? COLON suite + : WITH test[expr_contextType.Load] (with_var)? COLON suite[false] { stype = new With($WITH, actions.castExpr($test.tree), $with_var.etype, actions.castStmts($suite.stypes)); @@ -905,14 +909,22 @@ //except_clause: 'except' [test [',' test]] except_clause - : EXCEPT (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Store])?)? COLON suite + : EXCEPT (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Store])?)? COLON suite[!$suite.isEmpty() && $suite::continueIllegal] -> ^(EXCEPT<excepthandlerType>[$EXCEPT, actions.castExpr($t1.tree), actions.castExpr($t2.tree), actions.castStmts($suite.stypes), $EXCEPT.getLine(), $EXCEPT.getCharPositionInLine()]) ; //suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT -suite returns [List stypes] +suite[boolean fromFinally] returns [List stypes] +scope { + boolean continueIllegal; +} @init { + if ($suite::continueIllegal || fromFinally) { + $suite::continueIllegal = true; + } else { + $suite::continueIllegal = false; + } $stypes = new ArrayList(); } : simple_stmt @@ -1409,7 +1421,7 @@ @after { $classdef.tree = stype; } - : CLASS NAME (LPAREN testlist[expr_contextType.Load]? RPAREN)? COLON suite + : CLASS NAME (LPAREN testlist[expr_contextType.Load]? RPAREN)? COLON suite[false] { stype = new ClassDef($CLASS, actions.cantBeNone($NAME), actions.makeBases(actions.castExpr($testlist.tree)), actions.castStmts($suite.stypes)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-10-31 16:26:49
|
Revision: 5536 http://jython.svn.sourceforge.net/jython/?rev=5536&view=rev Author: fwierzbicki Date: 2008-10-31 16:26:45 +0000 (Fri, 31 Oct 2008) Log Message: ----------- Offset fix. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2008-10-31 15:59:39 UTC (rev 5535) +++ trunk/jython/grammar/Python.g 2008-10-31 16:26:45 UTC (rev 5536) @@ -1178,6 +1178,7 @@ $etype = c; } else if (o instanceof Attribute) { Attribute c = (Attribute)o; + c.setCharStartIndex($etype.getCharStartIndex()); c.value = $etype; $etype = c; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-11-14 16:07:45
|
Revision: 5579 http://jython.svn.sourceforge.net/jython/?rev=5579&view=rev Author: fwierzbicki Date: 2008-11-14 16:07:43 +0000 (Fri, 14 Nov 2008) Log Message: ----------- Fix for NPE's and a weird Antlr error that can occur when Antlr is allowed to recover from parser errrors (for example, when ListErrorHandler is used). Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2008-11-14 07:35:53 UTC (rev 5578) +++ trunk/jython/grammar/Python.g 2008-11-14 16:07:43 UTC (rev 5579) @@ -307,7 +307,10 @@ $file_input.tree = mtype; } : (NEWLINE - | stmt {stypes.addAll($stmt.stypes);} + | stmt { + if ($stmt.stypes != null) + {stypes.addAll($stmt.stypes);} + } )* EOF { mtype = new Module($file_input.start, actions.castStmts(stypes)); } @@ -937,10 +940,11 @@ $stypes = $simple_stmt.stypes; } | NEWLINE INDENT - (stmt - { + (stmt { + if ($stmt.stypes != null) { $stypes.addAll($stmt.stypes); } + } )+ DEDENT ; @@ -1119,6 +1123,14 @@ -> $left ) ; + // This only happens when Antlr is allowed to do error recovery (for example if ListErrorHandler + // is used. It is at least possible that this is a bug in Antlr itself, so this needs further + // investigation. To reproduce, set errorHandler to ListErrorHandler and try to parse "[". + catch [RewriteCardinalityException rce] { + PythonTree badNode = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), null); + retval.tree = badNode; + errorHandler.error("Internal Parser Error", badNode); + } arith_op returns [operatorType op] : PLUS {$op = operatorType.Add;} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-01-04 17:35:49
|
Revision: 5840 http://jython.svn.sourceforge.net/jython/?rev=5840&view=rev Author: fwierzbicki Date: 2009-01-04 17:35:44 +0000 (Sun, 04 Jan 2009) Log Message: ----------- Handle cases where the entire tree ends up as an error. Only comes up with alternate ErrorHandlers. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2009-01-04 08:41:16 UTC (rev 5839) +++ trunk/jython/grammar/Python.g 2009-01-04 17:35:44 UTC (rev 5840) @@ -103,6 +103,7 @@ import org.python.antlr.ast.Delete; import org.python.antlr.ast.Dict; import org.python.antlr.ast.Ellipsis; +import org.python.antlr.ast.ErrorMod; import org.python.antlr.ast.ExceptHandler; import org.python.antlr.ast.Exec; import org.python.antlr.ast.Expr; @@ -289,6 +290,13 @@ mtype = new Interactive($single_input.start, actions.castStmts($compound_stmt.tree)); } ; + //XXX: this block is duplicated in three places, how to extract? + catch [RecognitionException re] { + errorHandler.reportError(this, re); + errorHandler.recover(this, input,re); + PythonTree badNode = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); + retval.tree = new ErrorMod(badNode); + } //file_input: (NEWLINE | stmt)* ENDMARKER file_input @@ -318,7 +326,15 @@ mtype = new Module($file_input.start, actions.castStmts(stypes)); } ; + //XXX: this block is duplicated in three places, how to extract? + catch [RecognitionException re] { + errorHandler.reportError(this, re); + errorHandler.recover(this, input,re); + PythonTree badNode = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); + retval.tree = new ErrorMod(badNode); + } + //eval_input: testlist NEWLINE* ENDMARKER eval_input @init { @@ -331,7 +347,15 @@ mtype = new Expression($eval_input.start, actions.castExpr($testlist.tree)); } ; + //XXX: this block is duplicated in three places, how to extract? + catch [RecognitionException re] { + errorHandler.reportError(this, re); + errorHandler.recover(this, input,re); + PythonTree badNode = (PythonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re); + retval.tree = new ErrorMod(badNode); + } + //not in CPython's Grammar file dotted_attr returns [expr etype] : n1=NAME This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-01-14 03:42:48
|
Revision: 5927 http://jython.svn.sourceforge.net/jython/?rev=5927&view=rev Author: fwierzbicki Date: 2009-01-14 03:42:42 +0000 (Wed, 14 Jan 2009) Log Message: ----------- Small fix to grammar -- a "print" by itself should have it's NL attribute set to true as CPython does. Because "false" doesn't make sense in this context (it would be a no-op), the compiler doesn't check, so it passed unnoticed. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2009-01-14 01:03:58 UTC (rev 5926) +++ trunk/jython/grammar/Python.g 2009-01-14 03:42:42 UTC (rev 5927) @@ -624,7 +624,7 @@ | RIGHTSHIFT t2=printlist2 -> ^(PRINT<Print>[$PRINT, actions.castExpr($t2.elts.get(0)), actions.castExprs($t2.elts, 1), $t2.newline]) | - -> ^(PRINT<Print>[$PRINT, null, new ArrayList<expr>(), false]) + -> ^(PRINT<Print>[$PRINT, null, new ArrayList<expr>(), true]) ) ; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-01-15 03:22:26
|
Revision: 5932 http://jython.svn.sourceforge.net/jython/?rev=5932&view=rev Author: fwierzbicki Date: 2009-01-15 02:04:31 +0000 (Thu, 15 Jan 2009) Log Message: ----------- Small change to obsessively match CPython AST. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2009-01-14 23:56:22 UTC (rev 5931) +++ trunk/jython/grammar/Python.g 2009-01-15 02:04:31 UTC (rev 5932) @@ -1412,9 +1412,9 @@ //sliceop: ':' [test] sliceop : COLON - (test[expr_contextType.Load] - -> test - )? + (test[expr_contextType.Load] -> test + |-> ^(COLON<Name>[$COLON, "None", expr_contextType.Load]) + ) ; //exprlist: expr (',' expr)* [','] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-07-05 22:59:02
|
Revision: 6511 http://jython.svn.sourceforge.net/jython/?rev=6511&view=rev Author: fwierzbicki Date: 2009-07-05 22:58:57 +0000 (Sun, 05 Jul 2009) Log Message: ----------- Now that PythonPartial has a separate Lexer, remove behavior related to variable "partial". Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2009-07-05 22:34:44 UTC (rev 6510) +++ trunk/jython/grammar/Python.g 2009-07-05 22:58:57 UTC (rev 6511) @@ -1772,13 +1772,6 @@ } ; -STRINGPART - : {partial}?=> ('r'|'u'|'ur'|'R'|'U'|'UR'|'uR'|'Ur')? - ( '\'\'\'' ~('\'\'\'')* - | '"""' ~('"""')* - ) - ; - /** the two '"'? cause a warning -- is there a way to avoid that? */ fragment TRIQUOTE @@ -1804,18 +1797,12 @@ : '\\' ('\r')? '\n' (' '|'\t')* { $channel=HIDDEN; } ( c1=COMMENT | nl=NEWLINE { - if (!partial) { - emit(new CommonToken(NEWLINE,nl.getText())); - } + emit(new CommonToken(NEWLINE,nl.getText())); } | ) { if (input.LA(1) == -1) { - if (partial) { - emit(new CommonToken(TRAILBACKSLASH,"\\")); - } else { - throw new ParseException("unexpected character after line continuation character"); - } + throw new ParseException("unexpected character after line continuation character"); } } ; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-07-06 18:02:37
|
Revision: 6515 http://jython.svn.sourceforge.net/jython/?rev=6515&view=rev Author: fwierzbicki Date: 2009-07-06 18:02:32 +0000 (Mon, 06 Jul 2009) Log Message: ----------- Whitespace cleanup. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2009-07-06 16:31:40 UTC (rev 6514) +++ trunk/jython/grammar/Python.g 2009-07-06 18:02:32 UTC (rev 6515) @@ -274,15 +274,18 @@ @after { $single_input.tree = mtype; } - : NEWLINE* EOF { + : NEWLINE* EOF + { mtype = new Interactive($single_input.start, new ArrayList<stmt>()); - } - | simple_stmt NEWLINE* EOF { + } + | simple_stmt NEWLINE* EOF + { mtype = new Interactive($single_input.start, actions.castStmts($simple_stmt.stypes)); - } - | compound_stmt NEWLINE+ EOF { + } + | compound_stmt NEWLINE+ EOF + { mtype = new Interactive($single_input.start, actions.castStmts($compound_stmt.tree)); - } + } ; //XXX: this block is duplicated in three places, how to extract? catch [RecognitionException re] { @@ -312,7 +315,8 @@ $file_input.tree = mtype; } : (NEWLINE - | stmt { + | stmt + { if ($stmt.stypes != null) {stypes.addAll($stmt.stypes);} } @@ -337,9 +341,10 @@ @after { $eval_input.tree = mtype; } - : LEADING_WS? (NEWLINE)* testlist[expr_contextType.Load] (NEWLINE)* EOF { + : LEADING_WS? (NEWLINE)* testlist[expr_contextType.Load] (NEWLINE)* EOF + { mtype = new Expression($eval_input.start, actions.castExpr($testlist.tree)); - } + } ; //XXX: this block is duplicated in three places, how to extract? catch [RecognitionException re] { @@ -351,10 +356,17 @@ //not in CPython's Grammar file -dotted_attr returns [expr etype] +dotted_attr + returns [expr etype] : n1=NAME - ( (DOT n2+=NAME)+ { $etype = actions.makeDottedAttr($n1, $n2); } - | { $etype = new Name($n1, $n1.text, expr_contextType.Load); } + ( (DOT n2+=NAME)+ + { + $etype = actions.makeDottedAttr($n1, $n2); + } + | + { + $etype = new Name($n1, $n1.text, expr_contextType.Load); + } ) ; @@ -397,7 +409,8 @@ ; //decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE -decorator returns [expr etype] +decorator + returns [expr etype] @after { $decorator.tree = $etype; } @@ -408,19 +421,22 @@ $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; } ) NEWLINE ; //decorators: decorator+ -decorators returns [List etypes] +decorators + returns [List etypes] : d+=decorator+ { $etypes = $d; @@ -442,19 +458,24 @@ ; //parameters: '(' [varargslist] ')' -parameters returns [arguments args] +parameters + returns [arguments args] : LPAREN (varargslist - {$args = $varargslist.args; - } - | { $args = new arguments($parameters.start, new ArrayList<expr>(), null, null, new ArrayList<expr>()); + { + $args = $varargslist.args; } + | + { + $args = new arguments($parameters.start, new ArrayList<expr>(), null, null, new ArrayList<expr>()); + } ) RPAREN ; //not in CPython's Grammar file -defparameter[List defaults] returns [expr etype] +defparameter + [List defaults] returns [expr etype] @after { $defparameter.tree = $etype; } @@ -472,7 +493,8 @@ //varargslist: ((fpdef ['=' test] ',')* // ('*' NAME [',' '**' NAME] | '**' NAME) | // fpdef ['=' test] (',' fpdef ['=' test])* [',']) -varargslist returns [arguments args] +varargslist + returns [arguments args] @init { List defaults = new ArrayList(); } @@ -509,7 +531,8 @@ ; //fplist: fpdef (',' fpdef)* [','] -fplist returns [List etypes] +fplist + returns [List etypes] : f+=fpdef[expr_contextType.Store] (options {greedy=true;}:COMMA f+=fpdef[expr_contextType.Store])* (COMMA)? { @@ -518,7 +541,8 @@ ; //stmt: simple_stmt | compound_stmt -stmt returns [List stypes] +stmt + returns [List stypes] : simple_stmt { $stypes = $simple_stmt.stypes; @@ -531,7 +555,8 @@ ; //simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE -simple_stmt returns [List stypes] +simple_stmt + returns [List stypes] : s+=small_stmt (options {greedy=true;}:SEMI s+=small_stmt)* (SEMI)? NEWLINE { $stypes = $s; @@ -564,16 +589,16 @@ } : ((testlist[null] augassign) => lhs=testlist[expr_contextType.AugStore] ( (aay=augassign y1=yield_expr - { - actions.checkAssign(actions.castExpr($lhs.tree)); - stype = new AugAssign($lhs.tree, actions.castExpr($lhs.tree), $aay.op, actions.castExpr($y1.tree)); - } + { + actions.checkAssign(actions.castExpr($lhs.tree)); + stype = new AugAssign($lhs.tree, actions.castExpr($lhs.tree), $aay.op, actions.castExpr($y1.tree)); + } ) | (aat=augassign rhs=testlist[expr_contextType.Load] - { - actions.checkAssign(actions.castExpr($lhs.tree)); - stype = new AugAssign($lhs.tree, actions.castExpr($lhs.tree), $aat.op, actions.castExpr($rhs.tree)); - } + { + actions.checkAssign(actions.castExpr($lhs.tree)); + stype = new AugAssign($lhs.tree, actions.castExpr($lhs.tree), $aat.op, actions.castExpr($rhs.tree)); + } ) ) | (testlist[null] ASSIGN) => lhs=testlist[expr_contextType.Store] @@ -596,19 +621,32 @@ //augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | // '<<=' | '>>=' | '**=' | '//=') -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;} +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)* [','] ] | @@ -625,10 +663,10 @@ ; //not in CPython's Grammar file -printlist returns [boolean newline, List elts] +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)? + t+=test[expr_contextType.Load] (options {k=2;}: COMMA t+=test[expr_contextType.Load])* (trailcomma=COMMA)? { $elts=$t; if ($trailcomma == null) { @@ -646,10 +684,10 @@ //XXX: would be nice if printlist and printlist2 could be merged. //not in CPython's Grammar file -printlist2 returns [boolean newline, List elts] +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)? + t+=test[expr_contextType.Load] (options {k=2;}: COMMA t+=test[expr_contextType.Load])* (trailcomma=COMMA)? { $elts=$t; if ($trailcomma == null) { $newline = true; @@ -694,11 +732,12 @@ //continue_stmt: 'continue' continue_stmt - : CONTINUE { - if (!$suite.isEmpty() && $suite::continueIllegal) { - errorHandler.error("'continue' not supported inside 'finally' clause", new PythonTree($continue_stmt.start)); - } - } + : CONTINUE + { + if (!$suite.isEmpty() && $suite::continueIllegal) { + errorHandler.error("'continue' not supported inside 'finally' clause", new PythonTree($continue_stmt.start)); + } + } -> ^(CONTINUE<Continue>[$CONTINUE]) ; @@ -753,7 +792,8 @@ ; //import_as_names: import_as_name (',' import_as_name)* [','] -import_as_names returns [List<alias> atypes] +import_as_names + returns [List<alias> atypes] : n+=import_as_name (COMMA! n+=import_as_name)* { $atypes = $n; @@ -761,7 +801,8 @@ ; //import_as_name: NAME [('as' | NAME) NAME] -import_as_name returns [alias atype] +import_as_name + returns [alias atype] @after { $import_as_name.tree = $atype; } @@ -773,7 +814,8 @@ //XXX: when does CPython Grammar match "dotted_name NAME NAME"? //dotted_as_name: dotted_name [('as' | NAME) NAME] -dotted_as_name returns [alias atype] +dotted_as_name + returns [alias atype] @after { $dotted_as_name.tree = $atype; } @@ -785,7 +827,8 @@ ; //dotted_as_names: dotted_as_name (',' dotted_as_name)* -dotted_as_names returns [List<alias> atypes] +dotted_as_names + returns [List<alias> atypes] : d+=dotted_as_name (COMMA! d+=dotted_as_name)* { $atypes = $d; @@ -793,8 +836,10 @@ ; //dotted_name: NAME ('.' NAME)* -dotted_name returns [String name] - : NAME (DOT dn+=attr)* { +dotted_name + returns [String name] + : NAME (DOT dn+=attr)* + { $name = actions.makeDottedText($NAME, $dn); } ; @@ -813,8 +858,7 @@ @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, actions.castExpr($expr.tree), actions.castExpr($t1.tree), actions.castExpr($t2.tree)); } @@ -845,10 +889,12 @@ ; //not in CPython's Grammar file -elif_clause [Token iftest] returns [List stypes] - : else_clause { - $stypes = $else_clause.stypes; - } +elif_clause + [Token iftest] returns [List stypes] + : else_clause + { + $stypes = $else_clause.stypes; + } | ELIF test[expr_contextType.Load] COLON suite[false] (e2=elif_clause[$iftest] -> ^(ELIF<If>[$iftest, actions.castExpr($test.tree), actions.castStmts($suite.stypes), actions.makeElse($e2.stypes, $e2.tree)]) @@ -858,10 +904,12 @@ ; //not in CPython's Grammar file -else_clause returns [List stypes] - : ORELSE COLON elsesuite=suite[false] { - $stypes = $suite.stypes; - } +else_clause + returns [List stypes] + : ORELSE COLON elsesuite=suite[false] + { + $stypes = $suite.stypes; + } ; //while_stmt: 'while' test ':' suite ['else' ':' suite] @@ -873,9 +921,9 @@ $while_stmt.tree = stype; } : WHILE test[expr_contextType.Load] COLON s1=suite[false] (ORELSE COLON s2=suite[false])? - { - stype = actions.makeWhile($WHILE, actions.castExpr($test.tree), $s1.stypes, $s2.stypes); - } + { + stype = actions.makeWhile($WHILE, actions.castExpr($test.tree), $s1.stypes, $s2.stypes); + } ; //for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] @@ -933,7 +981,8 @@ ; //with_var: ('as' | NAME) expr -with_var returns [expr etype] +with_var + returns [expr etype] : (AS | NAME) expr[expr_contextType.Store] { $etype = actions.castExpr($expr.tree); @@ -948,7 +997,8 @@ ; //suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT -suite[boolean fromFinally] returns [List stypes] +suite + [boolean fromFinally] returns [List stypes] scope { boolean continueIllegal; } @@ -965,11 +1015,12 @@ $stypes = $simple_stmt.stypes; } | NEWLINE INDENT - (stmt { - if ($stmt.stypes != null) { - $stypes.addAll($stmt.stypes); - } - } + (stmt + { + if ($stmt.stypes != null) { + $stypes.addAll($stmt.stypes); + } + } )+ DEDENT ; @@ -1033,7 +1084,10 @@ } } : left=expr[ctype] - ( ( comp_op right+=expr[ctype] {cmps.add($comp_op.op);} + ( ( comp_op right+=expr[ctype] + { + cmps.add($comp_op.op); + } )+ | -> $left @@ -1041,18 +1095,30 @@ ; //comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' -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;} +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;} ; @@ -1119,16 +1185,22 @@ } } : left=arith_expr - ( ( shift_op right+=arith_expr {ops.add($shift_op.op);} + ( ( shift_op right+=arith_expr + { + ops.add($shift_op.op); + } )+ | -> $left ) ; -shift_op returns [operatorType op] - : LEFTSHIFT {$op = operatorType.LShift;} - | RIGHTSHIFT {$op = operatorType.RShift;} +shift_op + returns [operatorType op] + : LEFTSHIFT + {$op = operatorType.LShift;} + | RIGHTSHIFT + {$op = operatorType.RShift;} ; //arith_expr: term (('+'|'-') term)* @@ -1142,7 +1214,10 @@ } } : left=term - ( (arith_op right+=term {ops.add($arith_op.op);} + ( (arith_op right+=term + { + ops.add($arith_op.op); + } )+ | -> $left @@ -1157,9 +1232,12 @@ errorHandler.error("Internal Parser Error", badNode); } -arith_op returns [operatorType op] - : PLUS {$op = operatorType.Add;} - | MINUS {$op = operatorType.Sub;} +arith_op + returns [operatorType op] + : PLUS + {$op = operatorType.Add;} + | MINUS + {$op = operatorType.Sub;} ; //term: factor (('*'|'/'|'%'|'//') factor)* @@ -1173,33 +1251,47 @@ } } : left=factor - ( (term_op right+=factor {ops.add($term_op.op);} + ( (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;} +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 [expr etype] +factor + returns [expr 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 = actions.castExpr($power.tree);} + : 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 = actions.castExpr($power.tree);} ; //power: atom trailer* ['**' factor] -power returns [expr etype] +power + returns [expr etype] @after { $power.tree = $etype; } @@ -1293,15 +1385,15 @@ } : t+=test[$expr::ctype] (list_for[gens] - { - Collections.reverse(gens); - List<comprehension> c = gens; - etype = new ListComp($listmaker.start, actions.castExpr($t.get(0)), c); - } + { + Collections.reverse(gens); + List<comprehension> c = gens; + etype = new ListComp($listmaker.start, actions.castExpr($t.get(0)), c); + } | (options {greedy=true;}:COMMA t+=test[$expr::ctype])* - { - etype = new org.python.antlr.ast.List($lbrack, actions.castExprs($t), $expr::ctype); - } + { + etype = new org.python.antlr.ast.List($lbrack, actions.castExprs($t), $expr::ctype); + } ) (COMMA)? ; @@ -1385,7 +1477,8 @@ ; //subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop] -subscript returns [slice sltype] +subscript + returns [slice sltype] @after { if ($sltype != null) { $subscript.tree = $sltype; @@ -1410,17 +1503,20 @@ //sliceop: ':' [test] sliceop : COLON - (test[expr_contextType.Load] -> test - |-> ^(COLON<Name>[$COLON, "None", expr_contextType.Load]) + (test[expr_contextType.Load] + -> test + | + -> ^(COLON<Name>[$COLON, "None", expr_contextType.Load]) ) ; //exprlist: expr (',' expr)* [','] -exprlist[expr_contextType ctype] returns [expr etype] +exprlist + [expr_contextType ctype] returns [expr etype] : (expr[null] COMMA) => e+=expr[ctype] (options {k=2;}: COMMA e+=expr[ctype])* (COMMA)? - { - $etype = new Tuple($exprlist.start, actions.castExprs($e), ctype); - } + { + $etype = new Tuple($exprlist.start, actions.castExprs($e), ctype); + } | expr[ctype] { $etype = actions.castExpr($expr.tree); @@ -1429,7 +1525,8 @@ //not in CPython's Grammar file //Needed as an exprlist that does not produce tuples for del_stmt. -del_list returns [List<expr> etypes] +del_list + returns [List<expr> etypes] : e+=expr[expr_contextType.Del] (options {k=2;}: COMMA e+=expr[expr_contextType.Del])* (COMMA)? { $etypes = actions.makeDeleteList($e); @@ -1445,7 +1542,8 @@ ; //dictmaker: test ':' test (',' test ':' test)* [','] -dictmaker returns [List keys, List values] +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)? @@ -1477,7 +1575,8 @@ ; //arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | '**' test) -arglist returns [List args, List keywords, expr starargs, expr kwargs] +arglist + returns [List args, List keywords, expr starargs, expr kwargs] @init { List arguments = new ArrayList(); List kws = new ArrayList(); @@ -1510,7 +1609,8 @@ ; //argument: test [gen_for] | test '=' test # Really [keyword '='] test -argument[List arguments, List kws, List gens, boolean first] returns [boolean genarg] +argument + [List arguments, List kws, List gens, boolean first] returns [boolean genarg] : t1=test[expr_contextType.Load] ((ASSIGN t2=test[expr_contextType.Load]) { @@ -1529,7 +1629,8 @@ List<comprehension> c = $gens; arguments.add(new GeneratorExp($t1.start, actions.castExpr($t1.tree), c)); } - | { + | + { if (kws.size() > 0) { errorHandler.error("non-keyword arg after keyword arg", $t1.tree); } @@ -1559,9 +1660,9 @@ //list_if: 'if' test [list_iter] list_if[List gens, List ifs] : IF test[expr_contextType.Load] (list_iter[gens, ifs])? - { + { ifs.add(actions.castExpr($test.tree)); - } + } ; //gen_iter: gen_for | gen_if @@ -1585,9 +1686,9 @@ //gen_if: 'if' old_test [gen_iter] gen_if[List gens, List ifs] : IF test[expr_contextType.Load] gen_iter[gens, ifs]? - { + { ifs.add(actions.castExpr($test.tree)); - } + } ; //yield_expr: 'yield' [testlist] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-08-13 01:54:24
|
Revision: 6664 http://jython.svn.sourceforge.net/jython/?rev=6664&view=rev Author: fwierzbicki Date: 2009-08-13 01:54:15 +0000 (Thu, 13 Aug 2009) Log Message: ----------- Better lineno col_offset match with CPython on elif. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2009-08-12 03:12:07 UTC (rev 6663) +++ trunk/jython/grammar/Python.g 2009-08-13 01:54:15 UTC (rev 6664) @@ -885,23 +885,23 @@ //if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] if_stmt - : IF test[expr_contextType.Load] COLON ifsuite=suite[false] elif_clause[$test.start]? + : IF test[expr_contextType.Load] COLON ifsuite=suite[false] elif_clause? -> ^(IF<If>[$IF, actions.castExpr($test.tree), actions.castStmts($ifsuite.stypes), actions.makeElse($elif_clause.stypes, $elif_clause.tree)]) ; //not in CPython's Grammar file elif_clause - [Token iftest] returns [List stypes] + returns [List stypes] : else_clause { $stypes = $else_clause.stypes; } | ELIF test[expr_contextType.Load] COLON suite[false] - (e2=elif_clause[$iftest] - -> ^(ELIF<If>[$iftest, actions.castExpr($test.tree), actions.castStmts($suite.stypes), actions.makeElse($e2.stypes, $e2.tree)]) + (e2=elif_clause + -> ^(ELIF<If>[$test.start, actions.castExpr($test.tree), actions.castStmts($suite.stypes), actions.makeElse($e2.stypes, $e2.tree)]) | - -> ^(ELIF<If>[$iftest, actions.castExpr($test.tree), actions.castStmts($suite.stypes), new ArrayList<stmt>()]) + -> ^(ELIF<If>[$test.start, actions.castExpr($test.tree), actions.castStmts($suite.stypes), new ArrayList<stmt>()]) ) ; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-08-16 03:04:18
|
Revision: 6674 http://jython.svn.sourceforge.net/jython/?rev=6674&view=rev Author: fwierzbicki Date: 2009-08-16 03:04:08 +0000 (Sun, 16 Aug 2009) Log Message: ----------- Fix col_offset for some NOT expressions. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2009-08-16 02:55:25 UTC (rev 6673) +++ trunk/jython/grammar/Python.g 2009-08-16 03:04:08 UTC (rev 6674) @@ -1080,7 +1080,7 @@ //not_test: 'not' not_test | comparison not_test [expr_contextType ctype] returns [Token leftTok] - : NOT nt=not_test[ctype] {$leftTok = $nt.leftTok;} + : NOT nt=not_test[ctype] -> ^(NOT<UnaryOp>[$NOT, unaryopType.Not, actions.castExpr($nt.tree)]) | comparison[ctype] {$leftTok = $comparison.leftTok;} ; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-08-17 02:31:00
|
Revision: 6689 http://jython.svn.sourceforge.net/jython/?rev=6689&view=rev Author: fwierzbicki Date: 2009-08-17 02:30:53 +0000 (Mon, 17 Aug 2009) Log Message: ----------- Removed dynamic scope on expr::lparen. Need to pass the lparen info up to each rule anyway. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2009-08-17 02:29:34 UTC (rev 6688) +++ trunk/jython/grammar/Python.g 2009-08-17 02:30:53 UTC (rev 6689) @@ -1142,14 +1142,12 @@ [expr_contextType ect] returns [Token leftTok] scope { expr_contextType ctype; - Token lparen; } @init { $expr::ctype = ect; - $expr::lparen = null; } @after { - $leftTok = $expr::lparen; + $leftTok = $left.lparen; if ($op != null) { $expr.tree = actions.makeBinOp($left.tree, operatorType.BitOr, $right); } @@ -1165,10 +1163,12 @@ //xor_expr: and_expr ('^' and_expr)* xor_expr + returns [Token lparen = null] @after { if ($op != null) { $xor_expr.tree = actions.makeBinOp($left.tree, operatorType.BitXor, $right); } + $lparen = $left.lparen; } : left=and_expr ( (op=CIRCUMFLEX right+=and_expr @@ -1180,10 +1180,12 @@ //and_expr: shift_expr ('&' shift_expr)* and_expr + returns [Token lparen = null] @after { if ($op != null) { $and_expr.tree = actions.makeBinOp($left.tree, operatorType.BitAnd, $right); } + $lparen = $left.lparen; } : left=shift_expr ( (op=AMPER right+=shift_expr @@ -1195,6 +1197,7 @@ //shift_expr: arith_expr (('<<'|'>>') arith_expr)* shift_expr + returns [Token lparen = null] @init { List ops = new ArrayList(); List toks = new ArrayList(); @@ -1203,6 +1206,7 @@ if (!ops.isEmpty()) { $shift_expr.tree = actions.makeBinOp($left.tree, ops, $right, toks); } + $lparen = $left.lparen; } : left=arith_expr ( ( shift_op right+=arith_expr @@ -1226,6 +1230,7 @@ //arith_expr: term (('+'|'-') term)* arith_expr + returns [Token lparen = null] @init { List ops = new ArrayList(); List toks = new ArrayList(); @@ -1234,6 +1239,7 @@ if (!ops.isEmpty()) { $arith_expr.tree = actions.makeBinOp($left.tree, ops, $right, toks); } + $lparen = $left.lparen; } : left=term ( (arith_op right+=term @@ -1265,11 +1271,13 @@ //term: factor (('*'|'/'|'%'|'//') factor)* term + returns [Token lparen = null] @init { List ops = new ArrayList(); List toks = new ArrayList(); } @after { + $lparen = $left.lparen; if (!ops.isEmpty()) { $term.tree = actions.makeBinOp($left.tree, ops, $right, toks); } @@ -1300,7 +1308,7 @@ //factor: ('+'|'-'|'~') factor | power factor - returns [expr etype] + returns [expr etype, Token lparen = null] @after { $factor.tree = $etype; } @@ -1311,17 +1319,21 @@ | TILDE t=factor {$etype = new UnaryOp($TILDE, unaryopType.Invert, $t.etype);} | power - {$etype = actions.castExpr($power.tree);} + { + $etype = actions.castExpr($power.tree); + $lparen = $power.lparen; + } ; //power: atom trailer* ['**' factor] power - returns [expr etype] + returns [expr etype, Token lparen = null] @after { $power.tree = $etype; } : atom (t+=trailer[$atom.start, $atom.tree])* (options {greedy=true;}:d=DOUBLESTAR factor)? { + $lparen = $atom.lparen; //XXX: This could be better. $etype = actions.castExpr($atom.tree); if ($t != null) { @@ -1359,7 +1371,8 @@ // '`' testlist1 '`' | // NAME | NUMBER | STRING+) atom - : LPAREN {$expr::lparen = $LPAREN;} + returns [Token lparen = null] + : LPAREN {$lparen = $LPAREN;} ( yield_expr -> yield_expr | testlist_gexp This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-10-01 20:49:05
|
Revision: 6820 http://jython.svn.sourceforge.net/jython/?rev=6820&view=rev Author: fwierzbicki Date: 2009-10-01 20:48:58 +0000 (Thu, 01 Oct 2009) Log Message: ----------- Added a comment for trailing whitespace handling in single mode. Tobias asked me what it did and it took way too long to answer :) Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2009-10-01 20:11:08 UTC (rev 6819) +++ trunk/jython/grammar/Python.g 2009-10-01 20:48:58 UTC (rev 6820) @@ -2030,6 +2030,15 @@ } } } else if (this.single && newlines == 1) { + // This is here for this case in interactive mode: + // + // def foo(): + // print 1 + // <spaces but no code> + // + // The above would complete in interactive mode instead + // of giving ... to wait for more input. + // throw new ParseException("Trailing space in single mode."); } else { // make a string of n newlines This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2011-03-24 02:08:19
|
Revision: 7264 http://jython.svn.sourceforge.net/jython/?rev=7264&view=rev Author: fwierzbicki Date: 2011-03-24 02:08:13 +0000 (Thu, 24 Mar 2011) Log Message: ----------- Move code back to it's relevant comment. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2011-03-24 01:01:57 UTC (rev 7263) +++ trunk/jython/grammar/Python.g 2011-03-24 02:08:13 UTC (rev 7264) @@ -205,15 +205,14 @@ * a = [3, * 4] */ +int implicitLineJoiningLevel = 0; +int startPos=-1; //For use in partial parsing. public boolean eofWhileNested = false; public boolean partial = false; public boolean single = false; -int implicitLineJoiningLevel = 0; -int startPos=-1; - //If you want to use another error recovery mechanism change this //and the same one in the parser. private ErrorHandler errorHandler; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2011-03-25 15:25:14
|
Revision: 7267 http://jython.svn.sourceforge.net/jython/?rev=7267&view=rev Author: fwierzbicki Date: 2011-03-25 15:25:07 +0000 (Fri, 25 Mar 2011) Log Message: ----------- Reformat so that I can more easily script the removal of the grammar actions. I am probably going to need another parser to check "from __future__". Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2011-03-24 20:12:46 UTC (rev 7266) +++ trunk/jython/grammar/Python.g 2011-03-25 15:25:07 UTC (rev 7267) @@ -267,6 +267,8 @@ } } +//START OF PARSER RULES + //single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE single_input @init { @@ -318,8 +320,9 @@ : (NEWLINE | stmt { - if ($stmt.stypes != null) - {stypes.addAll($stmt.stypes);} + if ($stmt.stypes != null) { + stypes.addAll($stmt.stypes); + } } )* EOF { @@ -446,8 +449,13 @@ //funcdef: [decorators] 'def' NAME parameters ':' suite funcdef -@init { stmt stype = null; } -@after { $funcdef.tree = stype; } +@init { + stmt stype = null; +} + +@after { + $funcdef.tree = stype; +} : decorators? DEF NAME parameters COLON suite[false] { Token t = $DEF; @@ -625,29 +633,53 @@ augassign returns [operatorType op] : PLUSEQUAL - {$op = operatorType.Add;} + { + $op = operatorType.Add; + } | MINUSEQUAL - {$op = operatorType.Sub;} + { + $op = operatorType.Sub; + } | STAREQUAL - {$op = operatorType.Mult;} + { + $op = operatorType.Mult; + } | SLASHEQUAL - {$op = operatorType.Div;} + { + $op = operatorType.Div; + } | PERCENTEQUAL - {$op = operatorType.Mod;} + { + $op = operatorType.Mod; + } | AMPEREQUAL - {$op = operatorType.BitAnd;} + { + $op = operatorType.BitAnd; + } | VBAREQUAL - {$op = operatorType.BitOr;} + { + $op = operatorType.BitOr; + } | CIRCUMFLEXEQUAL - {$op = operatorType.BitXor;} + { + $op = operatorType.BitXor; + } | LEFTSHIFTEQUAL - {$op = operatorType.LShift;} + { + $op = operatorType.LShift; + } | RIGHTSHIFTEQUAL - {$op = operatorType.RShift;} + { + $op = operatorType.RShift; + } | DOUBLESTAREQUAL - {$op = operatorType.Pow;} + { + $op = operatorType.Pow; + } | DOUBLESLASHEQUAL - {$op = operatorType.FloorDiv;} + { + $op = operatorType.FloorDiv; + } ; //print_stmt: 'print' ( [ test (',' test)* [','] ] | @@ -1085,7 +1117,10 @@ [expr_contextType ctype] returns [Token leftTok] : NOT nt=not_test[ctype] -> ^(NOT<UnaryOp>[$NOT, unaryopType.Not, actions.castExpr($nt.tree)]) - | comparison[ctype] {$leftTok = $comparison.leftTok;} + | comparison[ctype] + { + $leftTok = $comparison.leftTok; + } ; //comparison: expr (comp_op expr)* @@ -1116,27 +1151,49 @@ comp_op returns [cmpopType op] : LESS - {$op = cmpopType.Lt;} + { + $op = cmpopType.Lt; + } | GREATER - {$op = cmpopType.Gt;} + { + $op = cmpopType.Gt; + } | EQUAL - {$op = cmpopType.Eq;} + { + $op = cmpopType.Eq; + } | GREATEREQUAL - {$op = cmpopType.GtE;} + { + $op = cmpopType.GtE; + } | LESSEQUAL - {$op = cmpopType.LtE;} + { + $op = cmpopType.LtE; + } | ALT_NOTEQUAL - {$op = cmpopType.NotEq;} + { + $op = cmpopType.NotEq; + } | NOTEQUAL - {$op = cmpopType.NotEq;} + { + $op = cmpopType.NotEq; + } | IN - {$op = cmpopType.In;} + { + $op = cmpopType.In; + } | NOT IN - {$op = cmpopType.NotIn;} + { + $op = cmpopType.NotIn; + } | IS - {$op = cmpopType.Is;} + { + $op = cmpopType.Is; + } | IS NOT - {$op = cmpopType.IsNot;} + { + $op = cmpopType.IsNot; + } ; @@ -1242,9 +1299,13 @@ shift_op returns [operatorType op] : LEFTSHIFT - {$op = operatorType.LShift;} + { + $op = operatorType.LShift; + } | RIGHTSHIFT - {$op = operatorType.RShift;} + { + $op = operatorType.RShift; + } ; //arith_expr: term (('+'|'-') term)* @@ -1287,9 +1348,13 @@ arith_op returns [operatorType op] : PLUS - {$op = operatorType.Add;} + { + $op = operatorType.Add; + } | MINUS - {$op = operatorType.Sub;} + { + $op = operatorType.Sub; + } ; //term: factor (('*'|'/'|'%'|'//') factor)* @@ -1323,14 +1388,22 @@ term_op returns [operatorType op] - :STAR - {$op = operatorType.Mult;} - |SLASH - {$op = operatorType.Div;} - |PERCENT - {$op = operatorType.Mod;} - |DOUBLESLASH - {$op = operatorType.FloorDiv;} + : STAR + { + $op = operatorType.Mult; + } + | SLASH + { + $op = operatorType.Div; + } + | PERCENT + { + $op = operatorType.Mod; + } + | DOUBLESLASH + { + $op = operatorType.FloorDiv; + } ; //factor: ('+'|'-'|'~') factor | power @@ -1340,11 +1413,17 @@ $factor.tree = $etype; } : PLUS p=factor - {$etype = new UnaryOp($PLUS, unaryopType.UAdd, $p.etype);} + { + $etype = new UnaryOp($PLUS, unaryopType.UAdd, $p.etype); + } | MINUS m=factor - {$etype = actions.negate($MINUS, $m.etype);} + { + $etype = actions.negate($MINUS, $m.etype); + } | TILDE t=factor - {$etype = new UnaryOp($TILDE, unaryopType.Invert, $t.etype);} + { + $etype = new UnaryOp($TILDE, unaryopType.Invert, $t.etype); + } | power { $etype = actions.castExpr($power.tree); @@ -1399,7 +1478,10 @@ // NAME | NUMBER | STRING+) atom returns [Token lparen = null] - : LPAREN {$lparen = $LPAREN;} + : LPAREN + { + $lparen = $LPAREN; + } ( yield_expr -> yield_expr | testlist_gexp @@ -1475,8 +1557,7 @@ } : t+=test[$expr::ctype] ( ((options {k=2;}: c1=COMMA t+=test[$expr::ctype])* (c2=COMMA)? - -> { $c1 != null || $c2 != null }? - ^(COMMA<Tuple>[$testlist_gexp.start, actions.castExprs($t), $expr::ctype]) + -> { $c1 != null || $c2 != null }? ^(COMMA<Tuple>[$testlist_gexp.start, actions.castExprs($t), $expr::ctype]) -> test ) | (gen_for[gens] @@ -1778,6 +1859,7 @@ -> ^(YIELD<Yield>[$YIELD, actions.castExpr($testlist.tree)]) ; +//START OF LEXER RULES AS : 'as' ; ASSERT : 'assert' ; BREAK : 'break' ; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2011-03-28 01:33:11
|
Revision: 7270 http://jython.svn.sourceforge.net/jython/?rev=7270&view=rev Author: fwierzbicki Date: 2011-03-28 01:33:05 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Convert from rewrite action to regular action for consistency, also fix some whitespace. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2011-03-26 16:22:17 UTC (rev 7269) +++ trunk/jython/grammar/Python.g 2011-03-28 01:33:05 UTC (rev 7270) @@ -613,12 +613,16 @@ | (testlist[null] ASSIGN) => lhs=testlist[expr_contextType.Store] ( | ((at=ASSIGN t+=testlist[expr_contextType.Store])+ - -> ^(ASSIGN<Assign>[$lhs.start, actions.makeAssignTargets(actions.castExpr($lhs.tree), $t), - actions.makeAssignValue($t)]) + { + stype = new Assign($lhs.tree, actions.makeAssignTargets( + actions.castExpr($lhs.tree), $t), actions.makeAssignValue($t)); + } ) | ((ay=ASSIGN y2+=yield_expr)+ - -> ^(ASSIGN<Assign>[$lhs.start, actions.makeAssignTargets(actions.castExpr($lhs.tree), $y2), - actions.makeAssignValue($y2)]) + { + stype = new Assign($lhs.start, actions.makeAssignTargets( + actions.castExpr($lhs.tree), $y2), actions.makeAssignValue($y2)); + } ) ) | lhs=testlist[expr_contextType.Load] @@ -1196,7 +1200,6 @@ } ; - //expr: xor_expr ('|' xor_expr)* expr [expr_contextType ect] returns [Token leftTok] @@ -1721,7 +1724,7 @@ ; //arglist: (argument ',')* (argument [','] -// |'*' test (',' argument)* [',' '**' test] +// |'*' test (',' argument)* [',' '**' test] // |'**' test) arglist returns [List args, List keywords, expr starargs, expr kwargs] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2011-03-28 04:17:43
|
Revision: 7272 http://jython.svn.sourceforge.net/jython/?rev=7272&view=rev Author: fwierzbicki Date: 2011-03-28 04:17:37 +0000 (Mon, 28 Mar 2011) Log Message: ----------- Convert fpdef from rewrite action to regular action for consistency. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2011-03-28 01:33:33 UTC (rev 7271) +++ trunk/jython/grammar/Python.g 2011-03-28 04:17:37 UTC (rev 7272) @@ -528,15 +528,24 @@ //fpdef: NAME | '(' fplist ')' fpdef[expr_contextType ctype] +@init { + expr etype = null; +} @after { + if (etype != null) { + $fpdef.tree = etype; + } actions.checkAssign(actions.castExpr($fpdef.tree)); } : NAME - -> ^(NAME<Name>[$NAME, $NAME.text, ctype]) + { + etype = new Name($NAME, $NAME.text, ctype); + } | (LPAREN fpdef[null] COMMA) => LPAREN fplist RPAREN - -> ^(LPAREN<Tuple>[$fplist.start, actions.castExprs($fplist.etypes), expr_contextType.Store]) - | LPAREN fplist RPAREN - -> fplist + { + etype = new Tuple($fplist.start, actions.castExprs($fplist.etypes), expr_contextType.Store); + } + | LPAREN! fplist RPAREN! ; //fplist: fpdef (',' fpdef)* [','] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2011-03-29 01:57:54
|
Revision: 7273 http://jython.svn.sourceforge.net/jython/?rev=7273&view=rev Author: fwierzbicki Date: 2011-03-29 01:57:47 +0000 (Tue, 29 Mar 2011) Log Message: ----------- Fix the rest of the easier rewrite rules. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2011-03-28 04:17:37 UTC (rev 7272) +++ trunk/jython/grammar/Python.g 2011-03-29 01:57:47 UTC (rev 7273) @@ -698,13 +698,26 @@ //print_stmt: 'print' ( [ test (',' test)* [','] ] | // '>>' test [ (',' test)+ [','] ] ) print_stmt +@init { + stmt stype = null; +} + +@after { + $print_stmt.tree = stype; +} : PRINT (t1=printlist - -> ^(PRINT<Print>[$PRINT, null, actions.castExprs($t1.elts), $t1.newline]) + { + stype = new Print($PRINT, null, actions.castExprs($t1.elts), $t1.newline); + } | RIGHTSHIFT t2=printlist2 - -> ^(PRINT<Print>[$PRINT, actions.castExpr($t2.elts.get(0)), actions.castExprs($t2.elts, 1), $t2.newline]) + { + stype = new Print($PRINT, actions.castExpr($t2.elts.get(0)), actions.castExprs($t2.elts, 1), $t2.newline); + } | - -> ^(PRINT<Print>[$PRINT, null, new ArrayList<expr>(), true]) + { + stype = new Print($PRINT, null, new ArrayList<expr>(), true); + } ) ; @@ -748,17 +761,32 @@ } ; - //del_stmt: 'del' exprlist del_stmt +@init { + stmt stype = null; +} +@after { + $del_stmt.tree = stype; +} : DELETE del_list - -> ^(DELETE<Delete>[$DELETE, $del_list.etypes]) + { + stype = new Delete($DELETE, $del_list.etypes); + } ; //pass_stmt: 'pass' pass_stmt +@init { + stmt stype = null; +} +@after { + $pass_stmt.tree = stype; +} : PASS - -> ^(PASS<Pass>[$PASS]) + { + stype = new Pass($PASS); + } ; //flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt @@ -772,42 +800,82 @@ //break_stmt: 'break' break_stmt +@init { + stmt stype = null; +} +@after { + $break_stmt.tree = stype; +} : BREAK - -> ^(BREAK<Break>[$BREAK]) + { + stype = new Break($BREAK); + } ; //continue_stmt: 'continue' continue_stmt +@init { + stmt stype = null; +} +@after { + $continue_stmt.tree = stype; +} : CONTINUE { if (!$suite.isEmpty() && $suite::continueIllegal) { errorHandler.error("'continue' not supported inside 'finally' clause", new PythonTree($continue_stmt.start)); } + stype = new Continue($CONTINUE); } - -> ^(CONTINUE<Continue>[$CONTINUE]) ; //return_stmt: 'return' [testlist] return_stmt +@init { + stmt stype = null; +} +@after { + $return_stmt.tree = stype; +} : RETURN (testlist[expr_contextType.Load] - -> ^(RETURN<Return>[$RETURN, actions.castExpr($testlist.tree)]) + { + stype = new Return($RETURN, actions.castExpr($testlist.tree)); + } | - -> ^(RETURN<Return>[$RETURN, null]) + { + stype = new Return($RETURN, null); + } ) ; //yield_stmt: yield_expr yield_stmt +@init { + stmt stype = null; +} +@after { + $yield_stmt.tree = stype; +} : yield_expr - -> ^(YIELD<Expr>[$yield_expr.start, actions.castExpr($yield_expr.tree)]) + { + stype = new Expr($yield_expr.start, actions.castExpr($yield_expr.tree)); + } ; //raise_stmt: 'raise' [test [',' test [',' test]]] raise_stmt +@init { + stmt stype = null; +} +@after { + $raise_stmt.tree = stype; +} : RAISE (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load] (COMMA t3=test[expr_contextType.Load])?)?)? - -> ^(RAISE<Raise>[$RAISE, actions.castExpr($t1.tree), actions.castExpr($t2.tree), actions.castExpr($t3.tree)]) + { + stype = new Raise($RAISE, actions.castExpr($t1.tree), actions.castExpr($t2.tree), actions.castExpr($t3.tree)); + } ; //import_stmt: import_name | import_from @@ -818,8 +886,16 @@ //import_name: 'import' dotted_as_names import_name +@init { + stmt stype = null; +} +@after { + $import_name.tree = stype; +} : IMPORT dotted_as_names - -> ^(IMPORT<Import>[$IMPORT, $dotted_as_names.atypes]) + { + stype = new Import($IMPORT, $dotted_as_names.atypes); + } ; //import_from: ('from' ('.'* dotted_name | '.'+) @@ -915,8 +991,16 @@ //assert_stmt: 'assert' test [',' test] assert_stmt +@init { + stmt stype = null; +} +@after { + $assert_stmt.tree = stype; +} : ASSERT t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Load])? - -> ^(ASSERT<Assert>[$ASSERT, actions.castExpr($t1.tree), actions.castExpr($t2.tree)]) + { + stype = new Assert($ASSERT, actions.castExpr($t1.tree), actions.castExpr($t2.tree)); + } ; //compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef @@ -929,12 +1013,19 @@ | (decorators? DEF) => funcdef | classdef ; - //if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] if_stmt +@init { + stmt stype = null; +} +@after { + $if_stmt.tree = stype; +} : IF test[expr_contextType.Load] COLON ifsuite=suite[false] elif_clause? - -> ^(IF<If>[$IF, actions.castExpr($test.tree), actions.castStmts($ifsuite.stypes), - actions.makeElse($elif_clause.stypes, $elif_clause.tree)]) + { + stype = new If($IF, actions.castExpr($test.tree), actions.castStmts($ifsuite.stypes), + actions.makeElse($elif_clause.stypes, $elif_clause.tree)); + } ; //not in CPython's Grammar file @@ -1041,9 +1132,17 @@ //except_clause: 'except' [test [('as' | ',') test]] except_clause +@init { + excepthandler extype = null; +} +@after { + $except_clause.tree = extype; +} : EXCEPT (t1=test[expr_contextType.Load] ((COMMA | AS) t2=test[expr_contextType.Store])?)? COLON suite[!$suite.isEmpty() && $suite::continueIllegal] - -> ^(EXCEPT<ExceptHandler>[$EXCEPT, actions.castExpr($t1.tree), actions.castExpr($t2.tree), - actions.castStmts($suite.stypes)]) + { + extype = new ExceptHandler($EXCEPT, actions.castExpr($t1.tree), actions.castExpr($t2.tree), + actions.castStmts($suite.stypes)); + } ; //suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2011-03-30 02:47:10
|
Revision: 7275 http://jython.svn.sourceforge.net/jython/?rev=7275&view=rev Author: fwierzbicki Date: 2011-03-30 02:47:03 +0000 (Wed, 30 Mar 2011) Log Message: ----------- More rewrite actions changed to plain actions. Modified Paths: -------------- trunk/jython/grammar/Python.g Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2011-03-29 01:58:24 UTC (rev 7274) +++ trunk/jython/grammar/Python.g 2011-03-30 02:47:03 UTC (rev 7275) @@ -609,7 +609,7 @@ ( (aay=augassign y1=yield_expr { actions.checkAssign(actions.castExpr($lhs.tree)); - stype = new AugAssign($lhs.tree, actions.castExpr($lhs.tree), $aay.op, actions.castExpr($y1.tree)); + stype = new AugAssign($lhs.tree, actions.castExpr($lhs.tree), $aay.op, actions.castExpr($y1.etype)); } ) | (aat=augassign rhs=testlist[expr_contextType.Load] @@ -859,7 +859,7 @@ } : yield_expr { - stype = new Expr($yield_expr.start, actions.castExpr($yield_expr.tree)); + stype = new Expr($yield_expr.start, actions.castExpr($yield_expr.etype)); } ; @@ -1013,6 +1013,7 @@ | (decorators? DEF) => funcdef | classdef ; + //if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] if_stmt @init { @@ -1031,16 +1032,28 @@ //not in CPython's Grammar file elif_clause returns [List stypes] +@init { + stmt stype = null; +} +@after { + if (stype != null) { + $elif_clause.tree = stype; + } +} : else_clause { $stypes = $else_clause.stypes; } | ELIF test[expr_contextType.Load] COLON suite[false] - (e2=elif_clause - -> ^(ELIF<If>[$test.start, actions.castExpr($test.tree), actions.castStmts($suite.stypes), actions.makeElse($e2.stypes, $e2.tree)]) - | - -> ^(ELIF<If>[$test.start, actions.castExpr($test.tree), actions.castStmts($suite.stypes), new ArrayList<stmt>()]) - ) + (e2=elif_clause + { + stype = new If($test.start, actions.castExpr($test.tree), actions.castStmts($suite.stypes), actions.makeElse($e2.stypes, $e2.tree)); + } + | + { + stype = new If($test.start, actions.castExpr($test.tree), actions.castStmts($suite.stypes), new ArrayList<stmt>()); + } + ) ; //not in CPython's Grammar file @@ -1175,9 +1188,19 @@ //test: or_test ['if' or_test 'else' test] | lambdef test[expr_contextType ctype] +@init { + expr etype = null; +} +@after { + if (etype != null) { + $test.tree = etype; + } +} :o1=or_test[ctype] ( (IF or_test[null] ORELSE) => IF o2=or_test[ctype] ORELSE e=test[expr_contextType.Load] - -> ^(IF<IfExp>[$o1.start, actions.castExpr($o2.tree), actions.castExpr($o1.tree), actions.castExpr($e.tree)]) + { + etype = new IfExp($o1.start, actions.castExpr($o2.tree), actions.castExpr($o1.tree), actions.castExpr($e.tree)); + } | -> or_test ) @@ -1227,8 +1250,18 @@ //not_test: 'not' not_test | comparison not_test [expr_contextType ctype] returns [Token leftTok] +@init { + expr etype = null; +} +@after { + if (etype != null) { + $not_test.tree = etype; + } +} : NOT nt=not_test[ctype] - -> ^(NOT<UnaryOp>[$NOT, unaryopType.Not, actions.castExpr($nt.tree)]) + { + etype = new UnaryOp($NOT, unaryopType.Not, actions.castExpr($nt.tree)); + } | comparison[ctype] { $leftTok = $comparison.leftTok; @@ -1589,47 +1622,79 @@ // NAME | NUMBER | STRING+) atom returns [Token lparen = null] +@init { + expr etype = null; +} +@after { + if (etype != null) { + $atom.tree = etype; + } +} : LPAREN { $lparen = $LPAREN; } ( yield_expr - -> yield_expr + { + etype = $yield_expr.etype; + } | testlist_gexp -> testlist_gexp | - -> ^(LPAREN<Tuple>[$LPAREN, new ArrayList<expr>(), $expr::ctype]) + { + etype = new Tuple($LPAREN, new ArrayList<expr>(), $expr::ctype); + } ) RPAREN | LBRACK (listmaker[$LBRACK] -> listmaker | - -> ^(LBRACK<org.python.antlr.ast.List>[$LBRACK, new ArrayList<expr>(), $expr::ctype]) + { + etype = new org.python.antlr.ast.List($LBRACK, new ArrayList<expr>(), $expr::ctype); + } ) RBRACK | LCURLY (dictmaker - -> ^(LCURLY<Dict>[$LCURLY, actions.castExprs($dictmaker.keys), - actions.castExprs($dictmaker.values)]) + { + etype = new Dict($LCURLY, actions.castExprs($dictmaker.keys), + actions.castExprs($dictmaker.values)); + } | - -> ^(LCURLY<Dict>[$LCURLY, new ArrayList<expr>(), new ArrayList<expr>()]) + { + etype = new Dict($LCURLY, new ArrayList<expr>(), new ArrayList<expr>()); + } ) RCURLY | lb=BACKQUOTE testlist[expr_contextType.Load] rb=BACKQUOTE - -> ^(BACKQUOTE<Repr>[$lb, actions.castExpr($testlist.tree)]) + { + etype = new Repr($lb, actions.castExpr($testlist.tree)); + } | NAME - -> ^(NAME<Name>[$NAME, $NAME.text, $expr::ctype]) + { + etype = new Name($NAME, $NAME.text, $expr::ctype); + } | INT - -> ^(INT<Num>[$INT, actions.makeInt($INT)]) + { + etype = new Num($INT, actions.makeInt($INT)); + } | LONGINT - -> ^(LONGINT<Num>[$LONGINT, actions.makeInt($LONGINT)]) + { + etype = new Num($LONGINT, actions.makeInt($LONGINT)); + } | FLOAT - -> ^(FLOAT<Num>[$FLOAT, actions.makeFloat($FLOAT)]) + { + etype = new Num($FLOAT, actions.makeFloat($FLOAT)); + } | COMPLEX - -> ^(COMPLEX<Num>[$COMPLEX, actions.makeComplex($COMPLEX)]) + { + etype = new Num($COMPLEX, actions.makeComplex($COMPLEX)); + } | (S+=STRING)+ - -> ^(STRING<Str>[actions.extractStringToken($S), actions.extractStrings($S, encoding)]) + { + etype = new Str(actions.extractStringToken($S), actions.extractStrings($S, encoding)); + } ; //listmaker: test ( list_for | (',' test)* [','] ) @@ -1667,10 +1732,12 @@ } } : t+=test[$expr::ctype] - ( ((options {k=2;}: c1=COMMA t+=test[$expr::ctype])* (c2=COMMA)? - -> { $c1 != null || $c2 != null }? ^(COMMA<Tuple>[$testlist_gexp.start, actions.castExprs($t), $expr::ctype]) - -> test - ) + ( (options {k=2;}: c1=COMMA t+=test[$expr::ctype])* (c2=COMMA)? + { $c1 != null || $c2 != null }? + { + etype = new Tuple($testlist_gexp.start, actions.castExprs($t), $expr::ctype); + } + | -> test | (gen_for[gens] { Collections.reverse(gens); @@ -1704,19 +1771,35 @@ ; //trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME -trailer [Token begin, PythonTree tree] +trailer [Token begin, PythonTree ptree] +@init { + expr etype = null; +} +@after { + if (etype != null) { + $trailer.tree = etype; + } +} : LPAREN - (arglist - -> ^(LPAREN<Call>[$begin, actions.castExpr($tree), actions.castExprs($arglist.args), - actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs]) - | - -> ^(LPAREN<Call>[$begin, actions.castExpr($tree), new ArrayList<expr>(), new ArrayList<keyword>(), null, null]) - ) + (arglist + { + etype = new Call($begin, actions.castExpr($ptree), actions.castExprs($arglist.args), + actions.makeKeywords($arglist.keywords), $arglist.starargs, $arglist.kwargs); + } + | + { + etype = new Call($begin, actions.castExpr($ptree), new ArrayList<expr>(), new ArrayList<keyword>(), null, null); + } + ) RPAREN | LBRACK subscriptlist[$begin] RBRACK - -> ^(LBRACK<Subscript>[$begin, actions.castExpr($tree), actions.castSlice($subscriptlist.tree), $expr::ctype]) + { + etype = new Subscript($begin, actions.castExpr($ptree), actions.castSlice($subscriptlist.tree), $expr::ctype); + } | DOT attr - -> ^(DOT<Attribute>[$begin, actions.castExpr($tree), new Name($attr.tree, $attr.text, expr_contextType.Load), $expr::ctype]) + { + etype = new Attribute($begin, actions.castExpr($ptree), new Name($attr.tree, $attr.text, expr_contextType.Load), $expr::ctype); + } ; //subscriptlist: subscript (',' subscript)* [','] @@ -1737,16 +1820,16 @@ subscript returns [slice sltype] @after { - if ($sltype != null) { - $subscript.tree = $sltype; - } + $subscript.tree = $sltype; } : d1=DOT DOT DOT - -> DOT<Ellipsis>[$d1] + { + $sltype = new 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); + $sltype = actions.makeSubscript($lower.tree, $c1, $upper1.tree, $sliceop.tree); } | (COLON) => c2=COLON (upper2=test[expr_contextType.Load])? (sliceop)? @@ -1754,16 +1837,28 @@ $sltype = actions.makeSubscript(null, $c2, $upper2.tree, $sliceop.tree); } | test[expr_contextType.Load] - -> ^(LPAREN<Index>[$test.start, actions.castExpr($test.tree)]) + { + $sltype = new Index($test.start, actions.castExpr($test.tree)); + } ; //sliceop: ':' [test] sliceop +@init { + expr etype = null; +} +@after { + if (etype != null) { + $sliceop.tree = etype; + } +} : COLON (test[expr_contextType.Load] -> test | - -> ^(COLON<Name>[$COLON, "None", expr_contextType.Load]) + { + etype = new Name($COLON, "None", expr_contextType.Load); + } ) ; @@ -1792,9 +1887,19 @@ //testlist: test (',' test)* [','] testlist[expr_contextType ctype] +@init { + expr etype = null; +} +@after { + if (etype != null) { + $testlist.tree = etype; + } +} : (test[null] COMMA) => t+=test[ctype] (options {k=2;}: COMMA t+=test[ctype])* (COMMA)? - -> ^(COMMA<Tuple>[$testlist.start, actions.castExprs($t), ctype]) + { + etype = new Tuple($testlist.start, actions.castExprs($t), ctype); + } | test[ctype] ; @@ -1966,8 +2071,15 @@ //yield_expr: 'yield' [testlist] yield_expr + returns [expr etype] +@after { + //needed for y2+=yield_expr + $yield_expr.tree = $etype; +} : YIELD testlist[expr_contextType.Load]? - -> ^(YIELD<Yield>[$YIELD, actions.castExpr($testlist.tree)]) + { + $etype = new Yield($YIELD, actions.castExpr($testlist.tree)); + } ; //START OF LEXER RULES This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |