From: <fwi...@us...> - 2008-08-08 19:30:44
|
Revision: 5110 http://jython.svn.sourceforge.net/jython/?rev=5110&view=rev Author: fwierzbicki Date: 2008-08-08 19:30:38 +0000 (Fri, 08 Aug 2008) Log Message: ----------- Extracted the actions from the grammars into a single GrammarActions file. This will help if I ever get far enough on integrating the two grammars into one. Also started an ErrorStmt node to handle bogus statements in the walker. Modified Paths: -------------- branches/asm/grammar/Python.g branches/asm/grammar/PythonWalker.g Added Paths: ----------- branches/asm/src/org/python/antlr/GrammarActions.java branches/asm/src/org/python/antlr/ast/ErrorStmt.java Modified: branches/asm/grammar/Python.g =================================================================== --- branches/asm/grammar/Python.g 2008-08-08 19:24:38 UTC (rev 5109) +++ branches/asm/grammar/Python.g 2008-08-08 19:30:38 UTC (rev 5110) @@ -188,6 +188,8 @@ private boolean seenSingleOuterSuite = false; + private GrammarActions actions = new GrammarActions(); + public void setErrorHandler(ErrorHandler eh) { this.errorHandler = eh; } @@ -198,205 +200,6 @@ } } - private void throwGenExpNotSoleArg(PythonTree t) { - throw new ParseException("Generator expression must be parenthesized if not sole argument", t); - } - - private exprType[] makeExprs(List exprs) { - return makeExprs(exprs, 0); - } - - private exprType[] makeExprs(List exprs, int start) { - if (exprs != null) { - List<exprType> result = new ArrayList<exprType>(); - for (int i=start; i<exprs.size(); i++) { - exprType e = (exprType)exprs.get(i); - result.add(e); - } - return (exprType[])result.toArray(new exprType[result.size()]); - } - return new exprType[0]; - } - - private stmtType[] makeStmts(List stmts) { - if (stmts != null) { - List<stmtType> result = new ArrayList<stmtType>(); - for (int i=0; i<stmts.size(); i++) { - result.add((stmtType)stmts.get(i)); - } - return (stmtType[])result.toArray(new stmtType[result.size()]); - } - return new stmtType[0]; - } - - private exprType makeDottedAttr(Token nameToken, List attrs) { - exprType current = new Name(nameToken, nameToken.getText(), expr_contextType.Load); - for (int i=attrs.size() - 1; i > -1; i--) { - Token t = ((PythonTree)attrs.get(i)).token; - current = new Attribute(t, current, t.getText(), - expr_contextType.Load); - } - return current; - } - - private FunctionDef makeFunctionDef(PythonTree t, PythonTree nameToken, argumentsType args, List funcStatements, List decorators) { - argumentsType a; - debug("Matched FunctionDef"); - if (args != null) { - a = args; - } else { - a = new argumentsType(t, new exprType[0], null, null, new exprType[0]); - } - stmtType[] s = (stmtType[])funcStatements.toArray(new stmtType[funcStatements.size()]); - exprType[] d; - if (decorators != null) { - d = (exprType[])decorators.toArray(new exprType[decorators.size()]); - } else { - d = new exprType[0]; - } - return new FunctionDef(t, nameToken.getText(), a, s, d); - } - - private argumentsType makeArgumentsType(Token t, List params, Token snameToken, - Token knameToken, List defaults) { - debug("Matched Arguments"); - - exprType[] p = (exprType[])params.toArray(new exprType[params.size()]); - exprType[] d = (exprType[])defaults.toArray(new exprType[defaults.size()]); - String s; - String k; - if (snameToken == null) { - s = null; - } else { - s = snameToken.getText(); - } - if (knameToken == null) { - k = null; - } else { - k = knameToken.getText(); - } - return new argumentsType(t, p, s, k, d); - } - - - - Object makeFloat(Token t) { - debug("makeFloat matched " + t.getText()); - return Py.newFloat(Double.valueOf(t.getText())); - } - - Object makeComplex(Token t) { - String s = t.getText(); - s = s.substring(0, s.length() - 1); - return Py.newImaginary(Double.valueOf(s)); - } - - Object makeInt(Token t) { - debug("Num matched " + t.getText()); - String s = t.getText(); - int radix = 10; - if (s.startsWith("0x") || s.startsWith("0X")) { - radix = 16; - s = s.substring(2, s.length()); - } else if (s.startsWith("0")) { - radix = 8; - } - if (s.endsWith("L") || s.endsWith("l")) { - s = s.substring(0, s.length()-1); - return Py.newLong(new BigInteger(s, radix)); - } - int ndigits = s.length(); - int i=0; - while (i < ndigits && s.charAt(i) == '0') - i++; - if ((ndigits - i) > 11) { - return Py.newLong(new BigInteger(s, radix)); - } - - long l = Long.valueOf(s, radix).longValue(); - if (l > 0xffffffffl || (l > Integer.MAX_VALUE)) { - return Py.newLong(new BigInteger(s, radix)); - } - return Py.newInteger((int) l); - } - - class StringPair { - private String s; - private boolean unicode; - - StringPair(String s, boolean unicode) { - this.s = s; - this.unicode = unicode; - } - String getString() { - return s; - } - - boolean isUnicode() { - return unicode; - } - } - - PyString extractStrings(List s) { - boolean ustring = false; - Token last = null; - StringBuffer sb = new StringBuffer(); - Iterator iter = s.iterator(); - while (iter.hasNext()) { - last = (Token)iter.next(); - StringPair sp = extractString(last); - if (sp.isUnicode()) { - ustring = true; - } - sb.append(sp.getString()); - } - if (ustring) { - return new PyUnicode(sb.toString()); - } - return new PyString(sb.toString()); - } - - StringPair extractString(Token t) { - String s = t.getText(); - char quoteChar = s.charAt(0); - int start=0; - boolean ustring = false; - if (quoteChar == 'u' || quoteChar == 'U') { - ustring = true; - start++; - } - quoteChar = s.charAt(start); - boolean raw = false; - if (quoteChar == 'r' || quoteChar == 'R') { - raw = true; - start++; - } - int quotes = 3; - if (s.length() - start == 2) { - quotes = 1; - } - if (s.charAt(start) != s.charAt(start+1)) { - quotes = 1; - } - - if (raw) { - return new StringPair(s.substring(quotes+start, s.length()-quotes), ustring); - } else { - StringBuffer sb = new StringBuffer(s.length()); - char[] ca = s.toCharArray(); - int n = ca.length-quotes; - int i=quotes+start; - int last_i=i; - return new StringPair(PyString.decode_UnicodeEscape(s, i, n, "strict", ustring), ustring); - //return decode_UnicodeEscape(s, i, n, "strict", ustring); - } - } - - Token extractStringToken(List s) { - return (Token)s.get(s.size() - 1); - } - - protected void mismatch(IntStream input, int ttype, BitSet follow) throws RecognitionException { if (errorHandler.isRecoverable()) { super.mismatch(input, ttype, follow); @@ -989,12 +792,12 @@ | LCURLY (dictmaker)? RCURLY -> ^(Dict LCURLY ^(Elts dictmaker)?) | BACKQUOTE testlist[expr_contextType.Load] BACKQUOTE -> ^(Repr BACKQUOTE testlist) | NAME -> ^(NameTok NAME) - | INT -> ^(NumTok<Num>[$INT, makeInt($INT)]) - | LONGINT -> ^(NumTok<Num>[$LONGINT, makeInt($LONGINT)]) - | FLOAT -> ^(NumTok<Num>[$FLOAT, makeFloat($FLOAT)]) - | COMPLEX -> ^(NumTok<Num>[$COMPLEX, makeComplex($COMPLEX)]) + | INT -> ^(NumTok<Num>[$INT, actions.makeInt($INT)]) + | LONGINT -> ^(NumTok<Num>[$LONGINT, actions.makeInt($LONGINT)]) + | FLOAT -> ^(NumTok<Num>[$FLOAT, actions.makeFloat($FLOAT)]) + | COMPLEX -> ^(NumTok<Num>[$COMPLEX, actions.makeComplex($COMPLEX)]) | (S+=STRING)+ - -> ^(StrTok<Str>[extractStringToken($S), extractStrings($S)]) + -> ^(StrTok<Str>[actions.extractStringToken($S), actions.extractStrings($S)]) ; //listmaker: test ( list_for | (',' test)* [','] ) @@ -1080,11 +883,11 @@ )? )? { if ($a2 != null) { if ($a1.tree.getType() == GenFor) { - throwGenExpNotSoleArg($a1.tree); + actions.throwGenExpNotSoleArg($a1.tree); } for (int i=0;i<$a2.size();i++) { if (((PythonTree)$a2.get(i)).getType() == GenFor) { - throwGenExpNotSoleArg(((argument_return)$a2.get(i)).tree); + actions.throwGenExpNotSoleArg(((argument_return)$a2.get(i)).tree); } } } @@ -1101,7 +904,7 @@ : t1=test[expr_contextType.Load] ( (ASSIGN t2=test[expr_contextType.Load]) -> ^(Keyword ^(Arg $t1) ^(Value $t2)?) | gen_for { if (!first) { - throwGenExpNotSoleArg($gen_for.tree); + actions.throwGenExpNotSoleArg($gen_for.tree); } } -> ^(GenFor $t1 gen_for) Modified: branches/asm/grammar/PythonWalker.g =================================================================== --- branches/asm/grammar/PythonWalker.g 2008-08-08 19:24:38 UTC (rev 5109) +++ branches/asm/grammar/PythonWalker.g 2008-08-08 19:30:38 UTC (rev 5110) @@ -44,6 +44,7 @@ import org.python.antlr.ast.Delete; import org.python.antlr.ast.Dict; import org.python.antlr.ast.Ellipsis; +import org.python.antlr.ast.ErrorStmt; import org.python.antlr.ast.Exec; import org.python.antlr.ast.Expr; import org.python.antlr.ast.Expression; @@ -78,7 +79,6 @@ import org.python.antlr.ast.With; import org.python.antlr.ast.While; import org.python.antlr.ast.Yield; - import java.math.BigInteger; import java.util.Arrays; import java.util.Collections; @@ -91,12 +91,12 @@ @members { boolean debugOn = false; private ErrorHandler errorHandler; + private GrammarActions actions = new GrammarActions(); public void setErrorHandler(ErrorHandler eh) { this.errorHandler = eh; } - public void debug(String message) { if (debugOn) { System.out.println(message); @@ -111,7 +111,6 @@ throw e; } - String name = "Test"; //XXX: Not sure I need any below... @@ -121,177 +120,6 @@ boolean printResults = false; //CompilerFlags cflags = Py.getCompilerFlags(); - private modType makeMod(PythonTree t, List stmts) { - stmtType[] s; - if (stmts != null) { - s = (stmtType[])stmts.toArray(new stmtType[stmts.size()]); - } else { - s = new stmtType[0]; - } - return new Module(t, s); - } - - private modType makeExpression(PythonTree t, exprType e) { - return new Expression(t, e); - } - - private modType makeInteractive(PythonTree t, List stmts) { - stmtType[] s; - if (stmts == null) { - s = new stmtType[0]; - } else { - s = (stmtType[])stmts.toArray(new stmtType[stmts.size()]); - } - return new Interactive(t, s); - } - - private ClassDef makeClassDef(PythonTree t, PythonTree nameToken, List bases, List body) { - exprType[] b = (exprType[])bases.toArray(new exprType[bases.size()]); - stmtType[] s = (stmtType[])body.toArray(new stmtType[body.size()]); - return new ClassDef(t, nameToken.getText(), b, s); - } - - private FunctionDef makeFunctionDef(PythonTree t, PythonTree nameToken, argumentsType args, List funcStatements, List decorators) { - argumentsType a; - debug("Matched FunctionDef"); - if (args != null) { - a = args; - } else { - a = new argumentsType(t, new exprType[0], null, null, new exprType[0]); - } - stmtType[] s = (stmtType[])funcStatements.toArray(new stmtType[funcStatements.size()]); - exprType[] d; - if (decorators != null) { - d = (exprType[])decorators.toArray(new exprType[decorators.size()]); - } else { - d = new exprType[0]; - } - return new FunctionDef(t, nameToken.getText(), a, s, d); - } - - private argumentsType makeArgumentsType(PythonTree t, List params, PythonTree snameToken, - PythonTree knameToken, List defaults) { - debug("Matched Arguments"); - - exprType[] p = (exprType[])params.toArray(new exprType[params.size()]); - exprType[] d = (exprType[])defaults.toArray(new exprType[defaults.size()]); - String s; - String k; - if (snameToken == null) { - s = null; - } else { - s = snameToken.getText(); - } - if (knameToken == null) { - k = null; - } else { - k = knameToken.getText(); - } - return new argumentsType(t, p, s, k, d); - } - - private stmtType makeTryExcept(PythonTree t, List body, List handlers, List orelse, List finBody) { - stmtType[] b = (stmtType[])body.toArray(new stmtType[body.size()]); - excepthandlerType[] e = (excepthandlerType[])handlers.toArray(new excepthandlerType[handlers.size()]); - stmtType[] o; - if (orelse != null) { - o = (stmtType[])orelse.toArray(new stmtType[orelse.size()]); - } else { - o = new stmtType[0]; - } - - stmtType te = new TryExcept(t, b, e, o); - if (finBody == null) { - return te; - } - stmtType[] f = (stmtType[])finBody.toArray(new stmtType[finBody.size()]); - stmtType[] mainBody = new stmtType[]{te}; - return new TryFinally(t, mainBody, f); - } - - private TryFinally makeTryFinally(PythonTree t, List body, List finBody) { - stmtType[] b = (stmtType[])body.toArray(new stmtType[body.size()]); - stmtType[] f = (stmtType[])finBody.toArray(new stmtType[finBody.size()]); - return new TryFinally(t, b, f); - } - - private If makeIf(PythonTree t, exprType test, List body, List orelse) { - stmtType[] o; - if (orelse != null) { - o = (stmtType[])orelse.toArray(new stmtType[orelse.size()]); - } else { - o = new stmtType[0]; - } - stmtType[] b; - if (body != null) { - b = (stmtType[])body.toArray(new stmtType[body.size()]); - } else { - b = new stmtType[0]; - } - return new If(t, test, b, o); - } - - - private While makeWhile(PythonTree t, exprType test, List body, List orelse) { - stmtType[] o; - if (orelse != null) { - o = (stmtType[])orelse.toArray(new stmtType[orelse.size()]); - } else { - o = new stmtType[0]; - } - stmtType[] b = (stmtType[])body.toArray(new stmtType[body.size()]); - return new While(t, test, b, o); - } - - private For makeFor(PythonTree t, exprType target, exprType iter, List body, List orelse) { - stmtType[] o; - if (orelse != null) { - o = (stmtType[])orelse.toArray(new stmtType[orelse.size()]); - } else { - o = new stmtType[0]; - } - stmtType[] b = (stmtType[])body.toArray(new stmtType[body.size()]); - return new For(t, target, iter, b, o); - } - - private Call makeCall(PythonTree t, exprType func) { - return makeCall(t, func, null, null, null, null); - } - - private Call makeCall(PythonTree t, exprType func, List args, List keywords, exprType starargs, exprType kwargs) { - exprType[] a; - keywordType[] k; - if (args == null) { - a = new exprType[0]; - } else { - a = (exprType[])args.toArray(new exprType[args.size()]); - } - if (keywords == null) { - k = new keywordType[0]; - } else { - k = (keywordType[])keywords.toArray(new keywordType[keywords.size()]); - } - return new Call(t, func, a, k, starargs, kwargs); - } - - //FIXME: just calling __neg__ for now - can be better. Also does not parse expressions like - // --2 correctly (should give ^(USub -2) but gives 2). - private exprType negate(PythonTree t, exprType o) { - if (o instanceof Num) { - Num num = (Num)o; - if (num.n instanceof PyObject) { - num.n = ((PyObject)num.n).__neg__(); - } - return num; - } - return new UnaryOp(t, unaryopType.USub, o); - } - - private void checkAssign(exprType e) { - if (e instanceof Name && ((Name)e).id.equals("None")) { - throw new ParseException("assignment to None", e); - } - } } @rulecatch { @@ -303,24 +131,24 @@ expression returns [modType mod] - : ^(Expression test[expr_contextType.Load]) { $mod = makeExpression($Expression, $test.etype); } + : ^(Expression test[expr_contextType.Load]) { $mod = actions.makeExpression($Expression, $test.etype); } ; interactive returns [modType mod] - : ^(Interactive stmts?) { $mod = makeInteractive($Interactive, $stmts.stypes); } + : ^(Interactive stmts?) { $mod = actions.makeInteractive($Interactive, $stmts.stypes); } ; module returns [modType mod] : ^(Module - ( stmts {$mod = makeMod($Module, $stmts.stypes); } - | {$mod = makeMod($Module, null);} + ( stmts {$mod = actions.makeMod($Module, $stmts.stypes); } + | {$mod = actions.makeMod($Module, null);} ) ) ; funcdef : ^(DEF NAME ^(Arguments varargslist?) ^(Body stmts) ^(Decorators decorators?)) { - $stmts::statements.add(makeFunctionDef($DEF, $NAME, $varargslist.args, $stmts.stypes, $decorators.etypes)); + $stmts::statements.add(actions.makeFunctionDef($DEF, $NAME, $varargslist.args, $stmts.stypes, $decorators.etypes)); } ; @@ -330,19 +158,19 @@ List defaults = new ArrayList(); } : ^(Args defparameter[params, defaults]+) (^(StarArgs sname=NAME))? (^(KWArgs kname=NAME))? { - $args = makeArgumentsType($Args, params, $sname, $kname, defaults); + $args = actions.makeArgumentsType($Args, params, $sname, $kname, defaults); } | ^(StarArgs sname=NAME) (^(KWArgs kname=NAME))? { - $args = makeArgumentsType($StarArgs,params, $sname, $kname, defaults); + $args = actions.makeArgumentsType($StarArgs,params, $sname, $kname, defaults); } | ^(KWArgs NAME) { - $args = makeArgumentsType($KWArgs, params, null, $NAME, defaults); + $args = actions.makeArgumentsType($KWArgs, params, null, $NAME, defaults); } ; defparameter[List params, List defaults] : fpdef[expr_contextType.Param, null] (ASSIGN test[expr_contextType.Load])? { - checkAssign($fpdef.etype); + actions.checkAssign($fpdef.etype); params.add($fpdef.etype); if ($ASSIGN != null) { defaults.add($test.etype); @@ -399,9 +227,9 @@ } else { Call c; if ($Args == null) { - c = makeCall($Call, $dotted_attr.etype); + c = actions.makeCall($Call, $dotted_attr.etype); } else { - c = makeCall($Call, $dotted_attr.etype, $arglist.args, $arglist.keywords, $arglist.starargs, $arglist.kwargs); + c = actions.makeCall($Call, $dotted_attr.etype, $arglist.args, $arglist.keywords, $arglist.starargs, $arglist.kwargs); } c.setCharStopIndex($Call.getCharStopIndex()); decs.add(c); @@ -518,9 +346,9 @@ : ^(Call (^(Args arglist))? test[expr_contextType.Load]) { Call c; if ($Args == null) { - c = makeCall($test.marker, $test.etype); + c = actions.makeCall($test.marker, $test.etype); } else { - c = makeCall($test.marker, $test.etype, $arglist.args, $arglist.keywords, $arglist.starargs, $arglist.kwargs); + c = actions.makeCall($test.marker, $test.etype, $arglist.args, $arglist.keywords, $arglist.starargs, $arglist.kwargs); } c.setCharStopIndex($Call.getCharStopIndex()); $etype = c; @@ -538,7 +366,7 @@ target[List etypes] : ^(Target atom[expr_contextType.Store]) { - checkAssign($atom.etype); + actions.checkAssign($atom.etype); etypes.add($atom.etype); } ; @@ -848,7 +676,7 @@ if ($ORELSE != null) { o = $orelse.stypes; } - While w = makeWhile($WHILE, $test.etype, $body.stypes, o); + While w = actions.makeWhile($WHILE, $test.etype, $body.stypes, o); $stmts::statements.add(w); } ; @@ -859,7 +687,7 @@ if ($ORELSE != null) { o = $orelse.stypes; } - For f = makeFor($FOR, $targ.etype, $iter.etype, $body.stypes, o); + For f = actions.makeFor($FOR, $targ.etype, $iter.etype, $body.stypes, o); $stmts::statements.add(f); } ; @@ -877,11 +705,11 @@ if ($FINALLY != null) { f = $fin.stypes; } - stmtType te = makeTryExcept($TryExcept, $body.stypes, handlers, o, f); + stmtType te = actions.makeTryExcept($TryExcept, $body.stypes, handlers, o, f); $stmts::statements.add(te); } | ^(TryFinally ^(Body body=stmts) ^(FINALLY fin=stmts)) { - TryFinally tf = makeTryFinally($TryFinally, $body.stypes, $fin.stypes); + TryFinally tf = actions.makeTryFinally($TryFinally, $body.stypes, $fin.stypes); $stmts::statements.add(tf); } ; @@ -1184,7 +1012,7 @@ } | ^(USub tok=MINUS test[ctype]) { debug("USub matched " + $test.etype); - $etype = negate($tok, $test.etype); + $etype = actions.negate($tok, $test.etype); $marker = $tok; } | ^(UAdd tok=PLUS test[ctype]) { @@ -1309,7 +1137,7 @@ } else { b = new ArrayList(); } - $stmts::statements.add(makeClassDef($CLASS, $classname, b, $stmts.stypes)); + $stmts::statements.add(actions.makeClassDef($CLASS, $classname, b, $stmts.stypes)); } ; @@ -1388,7 +1216,7 @@ keyword[List kws] : ^(Keyword ^(Arg arg=test[expr_contextType.Load]) ^(Value val=test[expr_contextType.Load])) { - checkAssign($arg.etype); + actions.checkAssign($arg.etype); kws.add(new keywordType($Keyword, $arg.text, $val.etype)); } ; Added: branches/asm/src/org/python/antlr/GrammarActions.java =================================================================== --- branches/asm/src/org/python/antlr/GrammarActions.java (rev 0) +++ branches/asm/src/org/python/antlr/GrammarActions.java 2008-08-08 19:30:38 UTC (rev 5110) @@ -0,0 +1,458 @@ +package org.python.antlr; + +import org.antlr.runtime.CommonToken; +import org.antlr.runtime.Token; + +import org.python.core.Py; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.PyUnicode; +import org.python.antlr.ParseException; +import org.python.antlr.ast.aliasType; +import org.python.antlr.ast.argumentsType; +import org.python.antlr.ast.boolopType; +import org.python.antlr.ast.comprehensionType; +import org.python.antlr.ast.cmpopType; +import org.python.antlr.ast.excepthandlerType; +import org.python.antlr.ast.exprType; +import org.python.antlr.ast.expr_contextType; +import org.python.antlr.ast.keywordType; +import org.python.antlr.ast.modType; +import org.python.antlr.ast.operatorType; +import org.python.antlr.ast.sliceType; +import org.python.antlr.ast.stmtType; +import org.python.antlr.ast.unaryopType; +import org.python.antlr.ast.Assert; +import org.python.antlr.ast.Assign; +import org.python.antlr.ast.Attribute; +import org.python.antlr.ast.AugAssign; +import org.python.antlr.ast.BinOp; +import org.python.antlr.ast.BoolOp; +import org.python.antlr.ast.Break; +import org.python.antlr.ast.Call; +import org.python.antlr.ast.ClassDef; +import org.python.antlr.ast.Compare; +import org.python.antlr.ast.Continue; +import org.python.antlr.ast.Delete; +import org.python.antlr.ast.Dict; +import org.python.antlr.ast.Ellipsis; +import org.python.antlr.ast.ErrorStmt; +import org.python.antlr.ast.Exec; +import org.python.antlr.ast.Expr; +import org.python.antlr.ast.Expression; +import org.python.antlr.ast.ExtSlice; +import org.python.antlr.ast.For; +import org.python.antlr.ast.FunctionDef; +import org.python.antlr.ast.GeneratorExp; +import org.python.antlr.ast.Global; +import org.python.antlr.ast.If; +import org.python.antlr.ast.IfExp; +import org.python.antlr.ast.Index; +import org.python.antlr.ast.Import; +import org.python.antlr.ast.ImportFrom; +import org.python.antlr.ast.Interactive; +import org.python.antlr.ast.Lambda; +import org.python.antlr.ast.ListComp; +import org.python.antlr.ast.Module; +import org.python.antlr.ast.Name; +import org.python.antlr.ast.Num; +import org.python.antlr.ast.Slice; +import org.python.antlr.ast.Subscript; +import org.python.antlr.ast.TryExcept; +import org.python.antlr.ast.TryFinally; +import org.python.antlr.ast.Tuple; +import org.python.antlr.ast.Pass; +import org.python.antlr.ast.Print; +import org.python.antlr.ast.Raise; +import org.python.antlr.ast.Repr; +import org.python.antlr.ast.Return; +import org.python.antlr.ast.Str; +import org.python.antlr.ast.UnaryOp; +import org.python.antlr.ast.With; +import org.python.antlr.ast.While; +import org.python.antlr.ast.Yield; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.Set; + +public class GrammarActions { + public GrammarActions() { + } + + void debug(String x) { + if (false) { + System.out.println(x); + } + } + + void throwGenExpNotSoleArg(PythonTree t) { + throw new ParseException("Generator expression must be parenthesized if not sole argument", t); + } + + exprType[] makeExprs(List exprs) { + return makeExprs(exprs, 0); + } + + exprType[] makeExprs(List exprs, int start) { + if (exprs != null) { + List<exprType> result = new ArrayList<exprType>(); + for (int i=start; i<exprs.size(); i++) { + exprType e = (exprType)exprs.get(i); + result.add(e); + } + return (exprType[])result.toArray(new exprType[result.size()]); + } + return new exprType[0]; + } + + stmtType[] makeStmts(List stmts) { + if (stmts != null) { + List<stmtType> result = new ArrayList<stmtType>(); + for (int i=0; i<stmts.size(); i++) { + result.add((stmtType)stmts.get(i)); + } + return (stmtType[])result.toArray(new stmtType[result.size()]); + } + return new stmtType[0]; + } + + exprType makeDottedAttr(Token nameToken, List attrs) { + exprType current = new Name(nameToken, nameToken.getText(), expr_contextType.Load); + for (int i=attrs.size() - 1; i > -1; i--) { + Token t = ((PythonTree)attrs.get(i)).token; + current = new Attribute(t, current, t.getText(), + expr_contextType.Load); + } + return current; + } + + stmtType makeFunctionDef(PythonTree t, PythonTree nameToken, argumentsType args, List funcStatements, List decorators) { + /* + if (nameToken == null || funcStatements == null || decorators == null) { + return new ErrorStmt(t); + } + */ + argumentsType a; + debug("Matched FunctionDef"); + if (args != null) { + a = args; + } else { + a = new argumentsType(t, new exprType[0], null, null, new exprType[0]); + } + stmtType[] s = (stmtType[])funcStatements.toArray(new stmtType[funcStatements.size()]); + exprType[] d; + if (decorators != null) { + d = (exprType[])decorators.toArray(new exprType[decorators.size()]); + } else { + d = new exprType[0]; + } + return new FunctionDef(t, nameToken.getText(), a, s, d); + } + + argumentsType makeArgumentsType(Token t, List params, Token snameToken, + Token knameToken, List defaults) { + debug("Matched Arguments"); + + exprType[] p = (exprType[])params.toArray(new exprType[params.size()]); + exprType[] d = (exprType[])defaults.toArray(new exprType[defaults.size()]); + String s; + String k; + if (snameToken == null) { + s = null; + } else { + s = snameToken.getText(); + } + if (knameToken == null) { + k = null; + } else { + k = knameToken.getText(); + } + return new argumentsType(t, p, s, k, d); + } + + + + Object makeFloat(Token t) { + debug("makeFloat matched " + t.getText()); + return Py.newFloat(Double.valueOf(t.getText())); + } + + Object makeComplex(Token t) { + String s = t.getText(); + s = s.substring(0, s.length() - 1); + return Py.newImaginary(Double.valueOf(s)); + } + + Object makeInt(Token t) { + debug("Num matched " + t.getText()); + String s = t.getText(); + int radix = 10; + if (s.startsWith("0x") || s.startsWith("0X")) { + radix = 16; + s = s.substring(2, s.length()); + } else if (s.startsWith("0")) { + radix = 8; + } + if (s.endsWith("L") || s.endsWith("l")) { + s = s.substring(0, s.length()-1); + return Py.newLong(new BigInteger(s, radix)); + } + int ndigits = s.length(); + int i=0; + while (i < ndigits && s.charAt(i) == '0') + i++; + if ((ndigits - i) > 11) { + return Py.newLong(new BigInteger(s, radix)); + } + + long l = Long.valueOf(s, radix).longValue(); + if (l > 0xffffffffl || (l > Integer.MAX_VALUE)) { + return Py.newLong(new BigInteger(s, radix)); + } + return Py.newInteger((int) l); + } + + class StringPair { + private String s; + private boolean unicode; + + StringPair(String s, boolean unicode) { + this.s = s; + this.unicode = unicode; + } + String getString() { + return s; + } + + boolean isUnicode() { + return unicode; + } + } + + PyString extractStrings(List s) { + boolean ustring = false; + Token last = null; + StringBuffer sb = new StringBuffer(); + Iterator iter = s.iterator(); + while (iter.hasNext()) { + last = (Token)iter.next(); + StringPair sp = extractString(last); + if (sp.isUnicode()) { + ustring = true; + } + sb.append(sp.getString()); + } + if (ustring) { + return new PyUnicode(sb.toString()); + } + return new PyString(sb.toString()); + } + + StringPair extractString(Token t) { + String s = t.getText(); + char quoteChar = s.charAt(0); + int start=0; + boolean ustring = false; + if (quoteChar == 'u' || quoteChar == 'U') { + ustring = true; + start++; + } + quoteChar = s.charAt(start); + boolean raw = false; + if (quoteChar == 'r' || quoteChar == 'R') { + raw = true; + start++; + } + int quotes = 3; + if (s.length() - start == 2) { + quotes = 1; + } + if (s.charAt(start) != s.charAt(start+1)) { + quotes = 1; + } + + if (raw) { + return new StringPair(s.substring(quotes+start, s.length()-quotes), ustring); + } else { + StringBuffer sb = new StringBuffer(s.length()); + char[] ca = s.toCharArray(); + int n = ca.length-quotes; + int i=quotes+start; + int last_i=i; + return new StringPair(PyString.decode_UnicodeEscape(s, i, n, "strict", ustring), ustring); + //return decode_UnicodeEscape(s, i, n, "strict", ustring); + } + } + + Token extractStringToken(List s) { + return (Token)s.get(s.size() - 1); + } + + //FROM Walker: + modType makeMod(PythonTree t, List stmts) { + stmtType[] s; + if (stmts != null) { + s = (stmtType[])stmts.toArray(new stmtType[stmts.size()]); + } else { + s = new stmtType[0]; + } + return new Module(t, s); + } + + modType makeExpression(PythonTree t, exprType e) { + return new Expression(t, e); + } + + modType makeInteractive(PythonTree t, List stmts) { + stmtType[] s; + if (stmts == null) { + s = new stmtType[0]; + } else { + s = (stmtType[])stmts.toArray(new stmtType[stmts.size()]); + } + return new Interactive(t, s); + } + + stmtType makeClassDef(PythonTree t, PythonTree nameToken, List bases, List body) { + /* + if (nameToken == null || bases == null || body == null) { + return new ErrorStmt(t); + } + */ + exprType[] b = (exprType[])bases.toArray(new exprType[bases.size()]); + stmtType[] s = (stmtType[])body.toArray(new stmtType[body.size()]); + return new ClassDef(t, nameToken.getText(), b, s); + } + + argumentsType makeArgumentsType(PythonTree t, List params, PythonTree snameToken, + PythonTree knameToken, List defaults) { + debug("Matched Arguments"); + + exprType[] p = (exprType[])params.toArray(new exprType[params.size()]); + exprType[] d = (exprType[])defaults.toArray(new exprType[defaults.size()]); + String s; + String k; + if (snameToken == null) { + s = null; + } else { + s = snameToken.getText(); + } + if (knameToken == null) { + k = null; + } else { + k = knameToken.getText(); + } + return new argumentsType(t, p, s, k, d); + } + + stmtType makeTryExcept(PythonTree t, List body, List handlers, List orelse, List finBody) { + stmtType[] b = (stmtType[])body.toArray(new stmtType[body.size()]); + excepthandlerType[] e = (excepthandlerType[])handlers.toArray(new excepthandlerType[handlers.size()]); + stmtType[] o; + if (orelse != null) { + o = (stmtType[])orelse.toArray(new stmtType[orelse.size()]); + } else { + o = new stmtType[0]; + } + + stmtType te = new TryExcept(t, b, e, o); + if (finBody == null) { + return te; + } + stmtType[] f = (stmtType[])finBody.toArray(new stmtType[finBody.size()]); + stmtType[] mainBody = new stmtType[]{te}; + return new TryFinally(t, mainBody, f); + } + + TryFinally makeTryFinally(PythonTree t, List body, List finBody) { + stmtType[] b = (stmtType[])body.toArray(new stmtType[body.size()]); + stmtType[] f = (stmtType[])finBody.toArray(new stmtType[finBody.size()]); + return new TryFinally(t, b, f); + } + + If makeIf(PythonTree t, exprType test, List body, List orelse) { + stmtType[] o; + if (orelse != null) { + o = (stmtType[])orelse.toArray(new stmtType[orelse.size()]); + } else { + o = new stmtType[0]; + } + stmtType[] b; + if (body != null) { + b = (stmtType[])body.toArray(new stmtType[body.size()]); + } else { + b = new stmtType[0]; + } + return new If(t, test, b, o); + } + + + While makeWhile(PythonTree t, exprType test, List body, List orelse) { + stmtType[] o; + if (orelse != null) { + o = (stmtType[])orelse.toArray(new stmtType[orelse.size()]); + } else { + o = new stmtType[0]; + } + stmtType[] b = (stmtType[])body.toArray(new stmtType[body.size()]); + return new While(t, test, b, o); + } + + For makeFor(PythonTree t, exprType target, exprType iter, List body, List orelse) { + stmtType[] o; + if (orelse != null) { + o = (stmtType[])orelse.toArray(new stmtType[orelse.size()]); + } else { + o = new stmtType[0]; + } + stmtType[] b = (stmtType[])body.toArray(new stmtType[body.size()]); + return new For(t, target, iter, b, o); + } + + Call makeCall(PythonTree t, exprType func) { + return makeCall(t, func, null, null, null, null); + } + + Call makeCall(PythonTree t, exprType func, List args, List keywords, exprType starargs, exprType kwargs) { + exprType[] a; + keywordType[] k; + if (args == null) { + a = new exprType[0]; + } else { + a = (exprType[])args.toArray(new exprType[args.size()]); + } + if (keywords == null) { + k = new keywordType[0]; + } else { + k = (keywordType[])keywords.toArray(new keywordType[keywords.size()]); + } + return new Call(t, func, a, k, starargs, kwargs); + } + + //FIXME: just calling __neg__ for now - can be better. Also does not parse expressions like + // --2 correctly (should give ^(USub -2) but gives 2). + exprType negate(PythonTree t, exprType o) { + if (o instanceof Num) { + Num num = (Num)o; + if (num.n instanceof PyObject) { + num.n = ((PyObject)num.n).__neg__(); + } + return num; + } + return new UnaryOp(t, unaryopType.USub, o); + } + + void checkAssign(exprType e) { + if (e instanceof Name && ((Name)e).id.equals("None")) { + throw new ParseException("assignment to None", e); + } + } +} Added: branches/asm/src/org/python/antlr/ast/ErrorStmt.java =================================================================== --- branches/asm/src/org/python/antlr/ast/ErrorStmt.java (rev 0) +++ branches/asm/src/org/python/antlr/ast/ErrorStmt.java 2008-08-08 19:30:38 UTC (rev 5110) @@ -0,0 +1,32 @@ +package org.python.antlr.ast; +import org.python.antlr.PythonTree; +import org.antlr.runtime.CommonToken; +import org.antlr.runtime.Token; +import java.io.DataOutputStream; +import java.io.IOException; + +public class ErrorStmt extends stmtType { + + public static final String[] _fields = new String[] {}; + + public ErrorStmt(PythonTree tree) { + super(tree); + } + + public String toString() { + return "ErrorStmt"; + } + + public String toStringTree() { + return "ErrorStmt"; + } + + public int getLineno() { + return getLine(); + } + + public int getCol_offset() { + return getCharPositionInLine(); + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |