[Pydev-cvs] org.python.pydev.parser/src/org/python/parser PythonGrammarTokenManager.java,1.2,1.3 pyt
Brought to you by:
fabioz
From: Fabio Z. <fa...@us...> - 2005-08-28 20:20:11
|
Update of /cvsroot/pydev/org.python.pydev.parser/src/org/python/parser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1872/src/org/python/parser Modified Files: PythonGrammarTokenManager.java python.jjt build.xml PythonGrammar.java package.html PythonGrammarTreeConstants.java TreeBuilder.java PythonGrammarConstants.java Log Message: Index: build.xml =================================================================== RCS file: /cvsroot/pydev/org.python.pydev.parser/src/org/python/parser/build.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** build.xml 28 Aug 2005 01:59:45 -0000 1.2 --- build.xml 28 Aug 2005 20:20:02 -0000 1.3 *************** *** 9,13 **** If this build.xml is called directly, you have to make sure the property javaccHome is set correctly. This can be done either inside this build.xml (first top property), or on the command line. ! Current setting is: ${javaccHome} </echo> --- 9,16 ---- If this build.xml is called directly, you have to make sure the property javaccHome is set correctly. This can be done either inside this build.xml (first top property), or on the command line. ! ! This build only handles javacc. If changes are done to the python.asdl file, you have to ! re-generate it by hand with "python asdl_java.py Python.asdl" inside of the ast package. ! Current setting is: ${javaccHome} </echo> Index: package.html =================================================================== RCS file: /cvsroot/pydev/org.python.pydev.parser/src/org/python/parser/package.html,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** package.html 25 Jun 2005 20:23:37 -0000 1.1 --- package.html 28 Aug 2005 20:20:02 -0000 1.2 *************** *** 4,7 **** --- 4,15 ---- It uses JavaCC and adslgen. + Fabio: + It has been updated to support: + - list comprehension correctly (in tuples and in method calls, which required only changes to javacc) + - decorators, which required changes to javacc and python.asdl (a decorators type was created, as oposed + to an array of expressions, as was in the prior version in the python tree). + + Still to do: + - allow for error recovery </body> \ No newline at end of file Index: PythonGrammarConstants.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev.parser/src/org/python/parser/PythonGrammarConstants.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** PythonGrammarConstants.java 28 Aug 2005 01:59:45 -0000 1.2 --- PythonGrammarConstants.java 28 Aug 2005 20:20:02 -0000 1.3 *************** *** 88,108 **** int ASSERT = 89; int AS = 90; ! int NAME = 91; ! int LETTER = 92; ! int DECNUMBER = 93; ! int HEXNUMBER = 94; ! int OCTNUMBER = 95; ! int FLOAT = 96; ! int COMPLEX = 97; ! int EXPONENT = 98; ! int DIGIT = 99; ! int SINGLE_STRING = 108; ! int SINGLE_STRING2 = 109; ! int TRIPLE_STRING = 110; ! int TRIPLE_STRING2 = 111; ! int SINGLE_USTRING = 112; ! int SINGLE_USTRING2 = 113; ! int TRIPLE_USTRING = 114; ! int TRIPLE_USTRING2 = 115; int DEFAULT = 0; --- 88,109 ---- int ASSERT = 89; int AS = 90; ! int AT = 91; ! int NAME = 92; ! int LETTER = 93; ! int DECNUMBER = 94; ! int HEXNUMBER = 95; ! int OCTNUMBER = 96; ! int FLOAT = 97; ! int COMPLEX = 98; ! int EXPONENT = 99; ! int DIGIT = 100; ! int SINGLE_STRING = 109; ! int SINGLE_STRING2 = 110; ! int TRIPLE_STRING = 111; ! int TRIPLE_STRING2 = 112; ! int SINGLE_USTRING = 113; ! int SINGLE_USTRING2 = 114; ! int TRIPLE_USTRING = 115; ! int TRIPLE_USTRING2 = 116; int DEFAULT = 0; *************** *** 218,221 **** --- 219,223 ---- "\"assert\"", "\"as\"", + "\"@\"", "<NAME>", "<LETTER>", *************** *** 227,231 **** "<EXPONENT>", "<DIGIT>", - "<token of kind 100>", "<token of kind 101>", "<token of kind 102>", --- 229,232 ---- *************** *** 235,238 **** --- 236,240 ---- "<token of kind 106>", "<token of kind 107>", + "<token of kind 108>", "\"\\\'\"", "\"\\\"\"", *************** *** 244,265 **** "\"\\\"\\\"\\\"\"", "\"\\\\\\r\\n\"", ! "<token of kind 117>", "\"\\\\\\r\\n\"", ! "<token of kind 119>", "\"\\\\\\r\\n\"", ! "<token of kind 121>", "\"\\\\\\r\\n\"", ! "<token of kind 123>", "\"\"", "\"\"", "\"\"", "\"\"", - "<token of kind 128>", "<token of kind 129>", "\"\\r\\n\"", "\"\\n\"", "\"\\r\"", - "<token of kind 133>", "<token of kind 134>", "\"`\"", }; --- 246,267 ---- "\"\\\"\\\"\\\"\"", "\"\\\\\\r\\n\"", ! "<token of kind 118>", "\"\\\\\\r\\n\"", ! "<token of kind 120>", "\"\\\\\\r\\n\"", ! "<token of kind 122>", "\"\\\\\\r\\n\"", ! "<token of kind 124>", "\"\"", "\"\"", "\"\"", "\"\"", "<token of kind 129>", + "<token of kind 130>", "\"\\r\\n\"", "\"\\n\"", "\"\\r\"", "<token of kind 134>", + "<token of kind 135>", "\"`\"", }; Index: PythonGrammar.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev.parser/src/org/python/parser/PythonGrammar.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** PythonGrammar.java 28 Aug 2005 03:03:08 -0000 1.4 --- PythonGrammar.java 28 Aug 2005 20:20:02 -0000 1.5 *************** *** 199,202 **** --- 199,203 ---- case ASSERT: case AS: + case AT: case NAME: case DECNUMBER: *************** *** 213,217 **** case TRIPLE_USTRING: case TRIPLE_USTRING2: [...4356 lines suppressed...] for (int j = 0; j < 32; j++) { --- 7411,7415 ---- jj_kind = -1; } ! for (int i = 0; i < 109; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { *************** *** 7366,7370 **** } } ! for (int i = 0; i < 136; i++) { if (la1tokens[i]) { jj_expentry = new int[1]; --- 7432,7436 ---- } } ! for (int i = 0; i < 137; i++) { if (la1tokens[i]) { jj_expentry = new int[1]; Index: PythonGrammarTokenManager.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev.parser/src/org/python/parser/PythonGrammarTokenManager.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** PythonGrammarTokenManager.java 28 Aug 2005 01:59:45 -0000 1.2 --- PythonGrammarTokenManager.java 28 Aug 2005 20:20:02 -0000 1.3 *************** *** 273,288 **** { case 0: ! if ((active1 & 0x4000000000000L) != 0L) { ! jjmatchedKind = 133; return -1; } return -1; case 1: ! if ((active1 & 0x4000000000000L) != 0L) [...2189 lines suppressed...] - image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); - matchedToken.image = image.toString(); - break; case 109 : if (image == null) --- 3861,3864 ---- *************** *** 3915,3918 **** --- 3910,3920 ---- matchedToken.image = image.toString(); break; + case 116 : + if (image == null) + image = new StringBuffer(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)))); + else + image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + matchedToken.image = image.toString(); + break; default : break; Index: PythonGrammarTreeConstants.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev.parser/src/org/python/parser/PythonGrammarTreeConstants.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** PythonGrammarTreeConstants.java 28 Aug 2005 01:59:45 -0000 1.2 --- PythonGrammarTreeConstants.java 28 Aug 2005 20:20:02 -0000 1.3 *************** *** 9,106 **** public int JJTEVAL_INPUT = 2; public int JJTFUNCDEF = 3; ! public int JJTVOID = 4; ! public int JJTEXTRAARGLIST = 5; ! public int JJTEXTRAKEYWORDLIST = 6; ! public int JJTDEFAULTARG = 7; ! public int JJTTUPLE = 8; ! public int JJTAUG_PLUS = 9; ! public int JJTAUG_MINUS = 10; ! public int JJTAUG_MULTIPLY = 11; ! public int JJTAUG_DIVIDE = 12; ! public int JJTAUG_FLOORDIVIDE = 13; ! public int JJTAUG_MODULO = 14; ! public int JJTAUG_AND = 15; ! public int JJTAUG_OR = 16; ! public int JJTAUG_XOR = 17; ! public int JJTAUG_LSHIFT = 18; ! public int JJTAUG_RSHIFT = 19; ! public int JJTAUG_POWER = 20; ! public int JJTEXPR_STMT = 21; ! public int JJTPRINTEXT_STMT = 22; ! public int JJTPRINT_STMT = 23; ! public int JJTDEL_STMT = 24; ! public int JJTPASS_STMT = 25; ! public int JJTBREAK_STMT = 26; ! public int JJTCONTINUE_STMT = 27; ! public int JJTRETURN_STMT = 28; ! public int JJTYIELD_STMT = 29; ! public int JJTRAISE_STMT = 30; ! public int JJTIMPORT = 31; ! public int JJTIMPORTFROM = 32; ! public int JJTDOTTED_AS_NAME = 33; ! public int JJTDOTTED_NAME = 34; ! public int JJTIMPORT_AS_NAME = 35; ! public int JJTGLOBAL_STMT = 36; ! public int JJTEXEC_STMT = 37; ! public int JJTASSERT_STMT = 38; ! public int JJTIF_STMT = 39; ! public int JJTWHILE_STMT = 40; ! public int JJTFOR_STMT = 41; ! public int JJTTRY_STMT = 42; ! public int JJTTRYFINALLY_STMT = 43; ! public int JJTEXCEPT_CLAUSE = 44; ! public int JJTSUITE = 45; ! public int JJTOR_BOOLEAN = 46; ! public int JJTAND_BOOLEAN = 47; ! public int JJTNOT_1OP = 48; ! public int JJTCOMPARISION = 49; ! public int JJTLESS_CMP = 50; ! public int JJTGREATER_CMP = 51; ! public int JJTEQUAL_CMP = 52; ! public int JJTGREATER_EQUAL_CMP = 53; ! public int JJTLESS_EQUAL_CMP = 54; ! public int JJTNOTEQUAL_CMP = 55; ! public int JJTIN_CMP = 56; ! public int JJTNOT_IN_CMP = 57; ! public int JJTIS_NOT_CMP = 58; ! public int JJTIS_CMP = 59; ! public int JJTOR_2OP = 60; ! public int JJTXOR_2OP = 61; ! public int JJTAND_2OP = 62; ! public int JJTLSHIFT_2OP = 63; ! public int JJTRSHIFT_2OP = 64; ! public int JJTADD_2OP = 65; ! public int JJTSUB_2OP = 66; ! public int JJTMUL_2OP = 67; ! public int JJTDIV_2OP = 68; ! public int JJTFLOORDIV_2OP = 69; ! public int JJTMOD_2OP = 70; ! public int JJTPOS_1OP = 71; ! public int JJTNEG_1OP = 72; ! public int JJTINVERT_1OP = 73; ! public int JJTPOW_2OP = 74; ! public int JJTCALL_OP = 75; ! public int JJTINDEX_OP = 76; ! public int JJTDOT_OP = 77; ! public int JJTLIST = 78; ! public int JJTDICTIONARY = 79; ! public int JJTSTR_1OP = 80; ! public int JJTSTRJOIN = 81; ! public int JJTLAMBDEF = 82; ! public int JJTSUBSCRIPTLIST = 83; ! public int JJTELLIPSES = 84; ! public int JJTSLICE = 85; ! public int JJTCOLON = 86; ! public int JJTCOMMA = 87; ! public int JJTLIST_FOR = 88; ! public int JJTCLASSDEF = 89; ! public int JJTEXTRAARGVALUELIST = 90; ! public int JJTEXTRAKEYWORDVALUELIST = 91; ! public int JJTKEYWORD = 92; ! public int JJTNUM = 93; ! public int JJTCOMPLEX = 94; ! public int JJTNAME = 95; ! public int JJTSTRING = 96; ! public int JJTUNICODE = 97; --- 9,107 ---- public int JJTEVAL_INPUT = 2; public int JJTFUNCDEF = 3; ! public int JJTDECORATORS = 4; ! public int JJTVOID = 5; ! public int JJTEXTRAARGLIST = 6; ! public int JJTEXTRAKEYWORDLIST = 7; ! public int JJTDEFAULTARG = 8; ! public int JJTTUPLE = 9; ! public int JJTAUG_PLUS = 10; ! public int JJTAUG_MINUS = 11; ! public int JJTAUG_MULTIPLY = 12; ! public int JJTAUG_DIVIDE = 13; ! public int JJTAUG_FLOORDIVIDE = 14; ! public int JJTAUG_MODULO = 15; ! public int JJTAUG_AND = 16; ! public int JJTAUG_OR = 17; ! public int JJTAUG_XOR = 18; ! public int JJTAUG_LSHIFT = 19; ! public int JJTAUG_RSHIFT = 20; ! public int JJTAUG_POWER = 21; ! public int JJTEXPR_STMT = 22; ! public int JJTPRINTEXT_STMT = 23; ! public int JJTPRINT_STMT = 24; ! public int JJTDEL_STMT = 25; ! public int JJTPASS_STMT = 26; ! public int JJTBREAK_STMT = 27; ! public int JJTCONTINUE_STMT = 28; ! public int JJTRETURN_STMT = 29; ! public int JJTYIELD_STMT = 30; ! public int JJTRAISE_STMT = 31; ! public int JJTIMPORT = 32; ! public int JJTIMPORTFROM = 33; ! public int JJTDOTTED_AS_NAME = 34; ! public int JJTDOTTED_NAME = 35; ! public int JJTIMPORT_AS_NAME = 36; ! public int JJTGLOBAL_STMT = 37; ! public int JJTEXEC_STMT = 38; ! public int JJTASSERT_STMT = 39; ! public int JJTIF_STMT = 40; ! public int JJTWHILE_STMT = 41; ! public int JJTFOR_STMT = 42; ! public int JJTTRY_STMT = 43; ! public int JJTTRYFINALLY_STMT = 44; ! public int JJTEXCEPT_CLAUSE = 45; ! public int JJTSUITE = 46; ! public int JJTOR_BOOLEAN = 47; ! public int JJTAND_BOOLEAN = 48; ! public int JJTNOT_1OP = 49; ! public int JJTCOMPARISION = 50; ! public int JJTLESS_CMP = 51; ! public int JJTGREATER_CMP = 52; ! public int JJTEQUAL_CMP = 53; ! public int JJTGREATER_EQUAL_CMP = 54; ! public int JJTLESS_EQUAL_CMP = 55; ! public int JJTNOTEQUAL_CMP = 56; ! public int JJTIN_CMP = 57; ! public int JJTNOT_IN_CMP = 58; ! public int JJTIS_NOT_CMP = 59; ! public int JJTIS_CMP = 60; ! public int JJTOR_2OP = 61; ! public int JJTXOR_2OP = 62; ! public int JJTAND_2OP = 63; ! public int JJTLSHIFT_2OP = 64; ! public int JJTRSHIFT_2OP = 65; ! public int JJTADD_2OP = 66; ! public int JJTSUB_2OP = 67; ! public int JJTMUL_2OP = 68; ! public int JJTDIV_2OP = 69; ! public int JJTFLOORDIV_2OP = 70; ! public int JJTMOD_2OP = 71; ! public int JJTPOS_1OP = 72; ! public int JJTNEG_1OP = 73; ! public int JJTINVERT_1OP = 74; ! public int JJTPOW_2OP = 75; ! public int JJTCALL_OP = 76; ! public int JJTINDEX_OP = 77; ! public int JJTDOT_OP = 78; ! public int JJTLIST = 79; ! public int JJTDICTIONARY = 80; ! public int JJTSTR_1OP = 81; ! public int JJTSTRJOIN = 82; ! public int JJTLAMBDEF = 83; ! public int JJTSUBSCRIPTLIST = 84; ! public int JJTELLIPSES = 85; ! public int JJTSLICE = 86; ! public int JJTCOLON = 87; ! public int JJTCOMMA = 88; ! public int JJTLIST_FOR = 89; ! public int JJTCLASSDEF = 90; ! public int JJTEXTRAARGVALUELIST = 91; ! public int JJTEXTRAKEYWORDVALUELIST = 92; ! public int JJTKEYWORD = 93; ! public int JJTNUM = 94; ! public int JJTCOMPLEX = 95; ! public int JJTNAME = 96; ! public int JJTSTRING = 97; ! public int JJTUNICODE = 98; *************** *** 110,113 **** --- 111,115 ---- "eval_input", "funcdef", + "decorators", "void", "ExtraArgList", Index: python.jjt =================================================================== RCS file: /cvsroot/pydev/org.python.pydev.parser/src/org/python/parser/python.jjt,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** python.jjt 28 Aug 2005 03:03:08 -0000 1.3 --- python.jjt 28 Aug 2005 20:20:02 -0000 1.4 *************** *** 453,456 **** --- 453,457 ---- | < ASSERT: "assert" > | < AS: "as" > + | < AT: "@" > } *************** *** 607,612 **** //funcdef: 'def' NAME parameters ':' suite void funcdef(): {} ! { <DEF> AnyName() parameters() <COLON> suite() } //parameters: '(' [varargslist] ')' void parameters() #void: {} --- 608,621 ---- //funcdef: 'def' NAME parameters ':' suite void funcdef(): {} ! { ! decorators() ! <DEF> AnyName() parameters() <COLON> suite() ! } + //@ call, name, attr ... <nl> + void decorators(): {} + { + (<AT> dotted_name() (<LPAREN> insidetuporcall() <RPAREN>)* <NEWLINE> )* + } //parameters: '(' [varargslist] ')' void parameters() #void: {} Index: TreeBuilder.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev.parser/src/org/python/parser/TreeBuilder.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** TreeBuilder.java 28 Aug 2005 01:59:45 -0000 1.3 --- TreeBuilder.java 28 Aug 2005 20:20:02 -0000 1.4 *************** *** 1,4 **** --- 1,7 ---- package org.python.parser; + import java.util.ArrayList; + import java.util.Iterator; + import org.python.parser.ast.Assert; import org.python.parser.ast.Assign; *************** *** 51,54 **** --- 54,58 ---- import org.python.parser.ast.argumentsType; import org.python.parser.ast.comprehensionType; + import org.python.parser.ast.decoratorsType; import org.python.parser.ast.excepthandlerType; import org.python.parser.ast.exprType; *************** *** 140,143 **** --- 144,148 ---- exprType[] exprs; + int l; switch (n.getId()) { case -1: *************** *** 155,158 **** --- 160,164 ---- //throw new RuntimeException("how to handle this? -- fabio") return new Num(n.getImage()); + case JJTUNICODE: case JJTSTRING: return new Str(n.getImage().toString()); *************** *** 237,246 **** case JJTCONTINUE_STMT: return new Continue(); case JJTFUNCDEF: body = popSuite(); ! argumentsType arguments = makeArguments(arity - 2); String name = makeIdentifier(); ! exprType[] decorators = new exprType[0]; ! return new FunctionDef(name, arguments, body, decorators); case JJTDEFAULTARG: value = (arity == 1) ? null : makeExpr(); --- 243,321 ---- case JJTCONTINUE_STMT: return new Continue(); + case JJTDECORATORS: + ArrayList list2 = new ArrayList(); + while(stack.nodeArity() > 0){ + ArrayList listArgs = new ArrayList(); + SimpleNode node = (SimpleNode) stack.popNode(); + while(isArg(node) || node instanceof comprehensionType){ + if(node instanceof comprehensionType){ + listArgs.add(node); + listArgs.add(stack.popNode()); //target + + }else{ + listArgs.add(node); + } + node = (SimpleNode) stack.popNode(); + } + listArgs.add(node); + list2.add(makeCallOrDecorator(listArgs, false)); + } + return new Decorators((decoratorsType[]) list2.toArray(new decoratorsType[0]), JJTDECORATORS); + case JJTCALL_OP: + exprType starargs = null; + exprType kwargs = null; + + l = arity - 1; + if (l > 0 && peekNode().getId() == JJTEXTRAKEYWORDVALUELIST) { + kwargs = ((ExtraArgValue) popNode()).value; + l--; + } + if (l > 0 && peekNode().getId() == JJTEXTRAARGVALUELIST) { + starargs = ((ExtraArgValue) popNode()).value; + l--; + } + + int nargs = l; + + SimpleNode[] tmparr = new SimpleNode[l]; + for (int i = l - 1; i >= 0; i--) { + tmparr[i] = popNode(); + if (tmparr[i] instanceof keywordType) { + nargs = i; + } + } + + exprType[] args = new exprType[nargs]; + for (int i = 0; i < nargs; i++) { + //what can happen is something like print sum(x for x in y), where we have already passed x in the args, and then get 'for x in y' + if(tmparr[i] instanceof comprehensionType){ + args = new exprType[]{ + new ListComp(args[0], new comprehensionType[]{ + (comprehensionType)tmparr[i] + }) + }; + }else{ + args[i] = makeExpr(tmparr[i]); + } + } + + keywordType[] keywords = new keywordType[l - nargs]; + for (int i = nargs; i < l; i++) { + if (!(tmparr[i] instanceof keywordType)) + throw new ParseException( + "non-keyword argument following keyword", tmparr[i]); + keywords[i - nargs] = (keywordType) tmparr[i]; + } + exprType func = makeExpr(); + return new Call(func, args, keywords, starargs, kwargs); case JJTFUNCDEF: + //get the decorators + //and clear them for the next call (they always must be before a function def) body = popSuite(); ! ! argumentsType arguments = makeArguments(stack.nodeArity() - 2); String name = makeIdentifier(); ! Decorators decs = (Decorators) popNode() ; ! return new FunctionDef(name, arguments, body, decs.exp); case JJTDEFAULTARG: value = (arity == 1) ? null : makeExpr(); *************** *** 293,297 **** orelse = popSuite(); } ! int l = arity - 1; excepthandlerType[] handlers = new excepthandlerType[l]; for (int i = l - 1; i >= 0; i--) { --- 368,372 ---- orelse = popSuite(); } ! l = arity - 1; excepthandlerType[] handlers = new excepthandlerType[l]; for (int i = l - 1; i >= 0; i--) { *************** *** 376,430 **** case JJTNOT_1OP: return new UnaryOp(UnaryOp.Not, makeExpr()); - // case JJTCALL_OP_COMP: - // throw new RuntimeException("err"); - case JJTCALL_OP: - //if (arity == 1) - // return new Call(makeExpr(), null, null, null, null); - exprType starargs = null; - exprType kwargs = null; - - l = arity - 1; - if (l > 0 && peekNode().getId() == JJTEXTRAKEYWORDVALUELIST) { - kwargs = ((ExtraArgValue) popNode()).value; - l--; - } - if (l > 0 && peekNode().getId() == JJTEXTRAARGVALUELIST) { - starargs = ((ExtraArgValue) popNode()).value; - l--; - } - - int nargs = l; - - SimpleNode[] tmparr = new SimpleNode[l]; - for (int i = l - 1; i >= 0; i--) { - tmparr[i] = popNode(); - if (tmparr[i] instanceof keywordType) { - nargs = i; - } - } - - exprType[] args = new exprType[nargs]; - for (int i = 0; i < nargs; i++) { - //what can happen is something like print sum(x for x in y), where we have already passed x in the args, and then get 'for x in y' - if(tmparr[i] instanceof comprehensionType){ - args = new exprType[]{ - new ListComp(args[0], new comprehensionType[]{ - (comprehensionType)tmparr[i] - }) - }; - }else{ - args[i] = makeExpr(tmparr[i]); - } - } - - keywordType[] keywords = new keywordType[l - nargs]; - for (int i = nargs; i < l; i++) { - if (!(tmparr[i] instanceof keywordType)) - throw new ParseException( - "non-keyword argument following keyword", tmparr[i]); - keywords[i - nargs] = (keywordType) tmparr[i]; - } - exprType func = makeExpr(); - return new Call(func, args, keywords, starargs, kwargs); case JJTEXTRAKEYWORDVALUELIST: return new ExtraArgValue(makeExpr(), JJTEXTRAKEYWORDVALUELIST); --- 451,454 ---- *************** *** 563,570 **** --- 587,639 ---- return n; default: + System.out.println("default "+n.getId()); return null; } } + + SimpleNode makeCallOrDecorator(java.util.List nodes, boolean isCall){ + exprType starargs = null; + exprType kwargs = null; + + exprType func = null; + ArrayList keywordsl = new ArrayList(); + ArrayList argsl = new ArrayList(); + for (Iterator iter = nodes.iterator(); iter.hasNext();) { + SimpleNode node = (SimpleNode) iter.next(); + + + if (node.getId() == JJTEXTRAKEYWORDVALUELIST) { + kwargs = ((ExtraArgValue) popNode()).value; + } + else if (node.getId() == JJTEXTRAARGVALUELIST) { + starargs = ((ExtraArgValue) popNode()).value; + + } else if(node instanceof keywordType){ + //keyword + keywordsl.add(node); + + } else if(isArg(node)){ + //default + argsl.add(node); + + } else if(node instanceof comprehensionType){ + //list comp (2 nodes: comp type and the elt -- what does elt mean by the way?) + argsl.add( + new ListComp((exprType)iter.next(), new comprehensionType[]{(comprehensionType)node})); + } else { + //name + func = (exprType) node; + } + + } + if(isCall){ + return new Call(func, (exprType[]) argsl.toArray(new exprType[0]), (keywordType[]) keywordsl.toArray(new keywordType[0]), starargs, kwargs); + } else { + return new decoratorsType(func, (exprType[]) argsl.toArray(new exprType[0]), (keywordType[]) keywordsl.toArray(new keywordType[0]), starargs, kwargs); + } + + } + private stmtType makeAugAssign(int op) throws Exception { exprType value = makeExpr(); *************** *** 596,599 **** --- 665,732 ---- } + + boolean isArg(SimpleNode n){ + if (n instanceof ExtraArg) + return true; + if (n instanceof DefaultArg) + return true; + if (n instanceof keywordType) + return true; + return false; + } + + String[] getVargAndKwarg(java.util.List args) throws Exception { + String varg = null; + String kwarg = null; + for (Iterator iter = args.iterator(); iter.hasNext();) { + SimpleNode node = (SimpleNode) iter.next(); + if(node.getId() == JJTEXTRAKEYWORDLIST){ + ExtraArg a = (ExtraArg)node; + kwarg = a.name; + + }else if(node.getId() == JJTEXTRAARGLIST){ + ExtraArg a = (ExtraArg)node; + varg = a.name; + } + } + return new String[]{varg, kwarg}; + } + + argumentsType makeArguments(java.util.List args) throws Exception { + java.util.List defArg = new ArrayList(); + for (Iterator iter = args.iterator(); iter.hasNext();) { + SimpleNode node = (SimpleNode) iter.next(); + if(node.getId() != JJTEXTRAKEYWORDLIST && node.getId() == JJTEXTRAARGLIST){ + defArg.add(node); + } + } + String[] vargAndKwarg = getVargAndKwarg(args); + String varg = vargAndKwarg[0]; + String kwarg = vargAndKwarg[1]; + + return makeArguments((DefaultArg[])defArg.toArray(new DefaultArg[0]), varg, kwarg); + } + + argumentsType makeArguments(DefaultArg[] def, String varg, String kwarg) throws Exception { + exprType fpargs[] = new exprType[def.length]; + exprType defaults[] = new exprType[def.length]; + int startofdefaults = 0; + for(int i = 0 ; i< def.length; i++){ + DefaultArg node = def[i]; + fpargs[i] = node.parameter; + ctx.setStore(fpargs[i]); + defaults[i] = node.value; + if (node.value != null) + startofdefaults = i; + } + + // System.out.println("start "+ startofdefaults + " " + l); + exprType[] newdefs = new exprType[def.length - startofdefaults]; + System.arraycopy(defaults, startofdefaults, newdefs, 0, newdefs.length); + + return new argumentsType(fpargs, varg, kwarg, newdefs); + + } + argumentsType makeArguments(int l) throws Exception { String kwarg = null; *************** *** 607,629 **** l--; } ! int startofdefaults = l; ! exprType fpargs[] = new exprType[l]; ! exprType defaults[] = new exprType[l]; for (int i = l-1; i >= 0; i--) { ! DefaultArg node = (DefaultArg) popNode(); ! fpargs[i] = node.parameter; ! ctx.setStore(fpargs[i]); ! defaults[i] = node.value; ! if (node.value != null) ! startofdefaults = i; } ! //System.out.println("start "+ startofdefaults + " " + l); ! exprType[] newdefs = new exprType[l-startofdefaults]; ! System.arraycopy(defaults, startofdefaults, newdefs, 0, newdefs.length); ! ! return new argumentsType(fpargs, stararg, kwarg, newdefs); } } class DefaultArg extends SimpleNode { public exprType parameter; --- 740,764 ---- l--; } ! ArrayList list = new ArrayList(); for (int i = l-1; i >= 0; i--) { ! list.add((DefaultArg) popNode()); } ! return makeArguments((DefaultArg[]) list.toArray(new DefaultArg[0]), stararg, kwarg); } } + class Decorators extends SimpleNode { + public decoratorsType[] exp; + private int id; + Decorators(decoratorsType[] exp, int id) { + this.exp = exp; + this.id = id; + } + public int getId() { + return id; + } + } + + class DefaultArg extends SimpleNode { public exprType parameter; |