From: <fwi...@us...> - 2011-03-12 19:36:35
|
Revision: 7218 http://jython.svn.sourceforge.net/jython/?rev=7218&view=rev Author: fwierzbicki Date: 2011-03-12 19:36:22 +0000 (Sat, 12 Mar 2011) Log Message: ----------- First cut at Python.g grammar + associated fixes. The with statement is on by default. Passes test_grammar from Python 2.6. Modified Paths: -------------- trunk/jython/Lib/test/test_func_syntax_jy.py trunk/jython/grammar/Python.g trunk/jython/src/org/python/Version.java trunk/jython/src/org/python/antlr/GrammarActions.java trunk/jython/src/org/python/core/Options.java trunk/jython/src/org/python/core/Py.java trunk/jython/src/org/python/core/PySystemState.java trunk/jython/src/org/python/core/exceptions.java trunk/jython/src/org/python/indexer/Builtins.java Modified: trunk/jython/Lib/test/test_func_syntax_jy.py =================================================================== --- trunk/jython/Lib/test/test_func_syntax_jy.py 2011-03-12 19:30:30 UTC (rev 7217) +++ trunk/jython/Lib/test/test_func_syntax_jy.py 2011-03-12 19:36:22 UTC (rev 7218) @@ -10,7 +10,7 @@ "parrot(voltage=.5, \'dead\')") def test_dup_keywords(self): - self.assertRaises(TypeError, eval, + self.assertRaises(SyntaxError, eval, "complex(imag=4, imag=2)") def test_main(): Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2011-03-12 19:30:30 UTC (rev 7217) +++ trunk/jython/grammar/Python.g 2011-03-12 19:36:22 UTC (rev 7218) @@ -991,12 +991,13 @@ : (AS | NAME) expr[expr_contextType.Store] { $etype = actions.castExpr($expr.tree); + actions.checkAssign($etype); } ; -//except_clause: 'except' [test [',' test]] +//except_clause: 'except' [test [('as' | ',') test]] except_clause - : EXCEPT (t1=test[expr_contextType.Load] (COMMA t2=test[expr_contextType.Store])?)? COLON suite[!$suite.isEmpty() && $suite::continueIllegal] + : 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)]) ; @@ -1639,7 +1640,9 @@ } ; -//arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | '**' test) +//arglist: (argument ',')* (argument [','] +// |'*' test (',' argument)* [',' '**' test] +// |'**' test) arglist returns [List args, List keywords, expr starargs, expr kwargs] @init { @@ -1647,9 +1650,9 @@ List kws = new ArrayList(); List gens = new ArrayList(); } - : argument[arguments, kws, gens, true] (COMMA argument[arguments, kws, gens, false])* + : argument[arguments, kws, gens, true, false] (COMMA argument[arguments, kws, gens, false, false])* (COMMA - ( STAR s=test[expr_contextType.Load] (COMMA DOUBLESTAR k=test[expr_contextType.Load])? + ( STAR s=test[expr_contextType.Load] (COMMA argument[arguments, kws, gens, false, true])* (COMMA DOUBLESTAR k=test[expr_contextType.Load])? | DOUBLESTAR k=test[expr_contextType.Load] )? )? @@ -1662,25 +1665,37 @@ $starargs=actions.castExpr($s.tree); $kwargs=actions.castExpr($k.tree); } - | STAR s=test[expr_contextType.Load] (COMMA DOUBLESTAR k=test[expr_contextType.Load])? + | STAR s=test[expr_contextType.Load] (COMMA argument[arguments, kws, gens, false, true])* (COMMA DOUBLESTAR k=test[expr_contextType.Load])? { $starargs=actions.castExpr($s.tree); - $kwargs=actions.castExpr($k.tree); + $keywords=kws; + $kwargs=actions.castExpr($k.tree); } | DOUBLESTAR k=test[expr_contextType.Load] { - $kwargs=actions.castExpr($k.tree); + $kwargs=actions.castExpr($k.tree); } ; //argument: test [gen_for] | test '=' test # Really [keyword '='] test argument - [List arguments, List kws, List gens, boolean first] returns [boolean genarg] + [List arguments, List kws, List gens, boolean first, boolean afterStar] returns [boolean genarg] : t1=test[expr_contextType.Load] ((ASSIGN t2=test[expr_contextType.Load]) { + expr newkey = actions.castExpr($t1.tree); + //Loop through all current keys and fail on duplicate. + for(Object o: $kws) { + List list = (List)o; + Object oldkey = list.get(0); + if (oldkey instanceof Name && newkey instanceof Name) { + if (((Name)oldkey).getId().equals(((Name)newkey).getId())) { + errorHandler.error("keyword arguments repeated", $t1.tree); + } + } + } List<expr> exprs = new ArrayList<expr>(); - exprs.add(actions.castExpr($t1.tree)); + exprs.add(newkey); exprs.add(actions.castExpr($t2.tree)); $kws.add(exprs); } @@ -1698,6 +1713,8 @@ { if (kws.size() > 0) { errorHandler.error("non-keyword arg after keyword arg", $t1.tree); + } else if (afterStar) { + errorHandler.error("only named arguments may follow *expression", $t1.tree); } $arguments.add($t1.tree); } @@ -1905,9 +1922,13 @@ INT : // Hex '0' ('x' | 'X') ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' )+ | // Octal - '0' ( '0' .. '7' )* - | '1'..'9' DIGITS* - ; + '0' ('o' | 'O') ( '0' .. '7' )* + | '0' ( '0' .. '7' )* + | // Binary + '0' ('b' | 'B') ( '0' .. '1' )* + | // Decimal + '1'..'9' DIGITS* +; COMPLEX : DIGITS+ ('j'|'J') @@ -1925,7 +1946,7 @@ * should make us exit loop not continue. */ STRING - : ('r'|'u'|'ur'|'R'|'U'|'UR'|'uR'|'Ur')? + : ('r'|'u'|'b'|'ur'|'R'|'U'|'B'|'UR'|'uR'|'Ur')? ( '\'\'\'' (options {greedy=false;}:TRIAPOS)* '\'\'\'' | '"""' (options {greedy=false;}:TRIQUOTE)* '"""' | '"' (ESC|~('\\'|'\n'|'"'))* '"' Modified: trunk/jython/src/org/python/Version.java =================================================================== --- trunk/jython/src/org/python/Version.java 2011-03-12 19:30:30 UTC (rev 7217) +++ trunk/jython/src/org/python/Version.java 2011-03-12 19:36:22 UTC (rev 7218) @@ -44,7 +44,7 @@ /** The flags that are set by default in a code object. */ private static final Collection<CodeFlag> defaultCodeFlags = Arrays.asList( - CodeFlag.CO_NESTED, CodeFlag.CO_GENERATOR_ALLOWED); + CodeFlag.CO_NESTED, CodeFlag.CO_GENERATOR_ALLOWED, CodeFlag.CO_FUTURE_WITH_STATEMENT); private static final String headURL = "$HeadURL$"; Modified: trunk/jython/src/org/python/antlr/GrammarActions.java =================================================================== --- trunk/jython/src/org/python/antlr/GrammarActions.java 2011-03-12 19:30:30 UTC (rev 7217) +++ trunk/jython/src/org/python/antlr/GrammarActions.java 2011-03-12 19:36:22 UTC (rev 7218) @@ -347,20 +347,22 @@ } List<keyword> makeKeywords(List args) { - List<keyword> k = new ArrayList<keyword>(); + List<keyword> keywords = new ArrayList<keyword>(); if (args != null) { - for(int i=0;i<args.size();i++) { - List e = (List)args.get(i); - checkAssign(castExpr(e.get(0))); - if (e.get(0) instanceof Name) { - Name arg = (Name)e.get(0); - k.add(new keyword(arg, arg.getInternalId(), castExpr(e.get(1)))); + for (Object o : args) { + List e = (List)o; + Object k = e.get(0); + Object v = e.get(1); + checkAssign(castExpr(k)); + if (k instanceof Name) { + Name arg = (Name)k; + keywords.add(new keyword(arg, arg.getInternalId(), castExpr(v))); } else { - errorHandler.error("keyword must be a name", (PythonTree)e.get(0)); + errorHandler.error("keyword must be a name", (PythonTree)k); } } } - return k; + return keywords; } Object makeFloat(Token t) { @@ -373,12 +375,21 @@ return Py.newImaginary(Double.valueOf(s)); } + //XXX: needs to handle NumberFormatException (on input like 0b2) and needs + // a better long guard than ndigits > 11 (this is much to short for + // binary for example) Object makeInt(Token t) { 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("0o") || s.startsWith("0O")) { + radix = 8; + s = s.substring(2, s.length()); + } else if (s.startsWith("0b") || s.startsWith("0B")) { + radix = 2; + s = s.substring(2, s.length()); } else if (s.startsWith("0")) { radix = 8; } Modified: trunk/jython/src/org/python/core/Options.java =================================================================== --- trunk/jython/src/org/python/core/Options.java 2011-03-12 19:30:30 UTC (rev 7217) +++ trunk/jython/src/org/python/core/Options.java 2011-03-12 19:36:22 UTC (rev 7218) @@ -75,7 +75,11 @@ /** Force stdin, stdout and stderr to be unbuffered, and opened in * binary mode */ public static boolean unbuffered = false; + + //XXX: place holder + public static int bytes_warning = 0; + /** * Enable division warning. The value maps to the registry values of * <ul> Modified: trunk/jython/src/org/python/core/Py.java =================================================================== --- trunk/jython/src/org/python/core/Py.java 2011-03-12 19:30:30 UTC (rev 7217) +++ trunk/jython/src/org/python/core/Py.java 2011-03-12 19:36:22 UTC (rev 7218) @@ -402,6 +402,11 @@ public static void UnicodeWarning(String message) { warning(UnicodeWarning, message); } + + public static PyObject BytesWarning; + public static void BytesWarning(String message) { + warning(BytesWarning, message); + } private static PyObject warnings_mod; @@ -775,6 +780,7 @@ FutureWarning = initExc("FutureWarning", exc, dict); ImportWarning = initExc("ImportWarning", exc, dict); UnicodeWarning = initExc("UnicodeWarning", exc, dict); + BytesWarning = initExc("BytesWarning", exc, dict); // Pre-initialize the PyJavaClass for OutOfMemoryError so when we need // it it creating the pieces for it won't cause an additional out of Modified: trunk/jython/src/org/python/core/PySystemState.java =================================================================== --- trunk/jython/src/org/python/core/PySystemState.java 2011-03-12 19:30:30 UTC (rev 7217) +++ trunk/jython/src/org/python/core/PySystemState.java 2011-03-12 19:36:22 UTC (rev 7218) @@ -65,6 +65,16 @@ public static PyTuple version_info; public final static int maxunicode = 1114111; + + //XXX: we should someday make this Long.MAX_VALUE, but see test_index.py + // for tests that would need to pass but today would not. + public final static int maxsize = Integer.MAX_VALUE; + + //XXX: place holder + public final static boolean py3kwarning = false; + + public final static Class flags = Options.class; + public static PyTuple subversion; /** * The copyright notice for this release. Modified: trunk/jython/src/org/python/core/exceptions.java =================================================================== --- trunk/jython/src/org/python/core/exceptions.java 2011-03-12 19:30:30 UTC (rev 7217) +++ trunk/jython/src/org/python/core/exceptions.java 2011-03-12 19:36:22 UTC (rev 7218) @@ -166,6 +166,10 @@ buildClass(dict, "UnicodeWarning", "Warning", "Base class for warnings about Unicode related problems, mostly\n" + "related to conversion problems."); + + buildClass(dict, "BytesWarning", "Warning", + "Base class for warnings about bytes and buffer related problems, mostly\n" + + "related to conversion from str or comparing to str."); // Initialize ZipImportError here, where it's safe to; it's // needed immediately Modified: trunk/jython/src/org/python/indexer/Builtins.java =================================================================== --- trunk/jython/src/org/python/indexer/Builtins.java 2011-03-12 19:30:30 UTC (rev 7217) +++ trunk/jython/src/org/python/indexer/Builtins.java 2011-03-12 19:36:22 UTC (rev 7218) @@ -99,8 +99,8 @@ Scope moduleTable; String[] builtin_exception_types = { - "ArithmeticError", "AssertionError", "AttributeError", - "BaseException", "Exception", "DeprecationWarning", "EOFError", + "ArithmeticError", "AssertionError", "AttributeError", "BaseException", + "BytesWarning", "Exception", "DeprecationWarning", "EOFError", "EnvironmentError", "FloatingPointError", "FutureWarning", "GeneratorExit", "IOError", "ImportError", "ImportWarning", "IndentationError", "IndexError", "KeyError", "KeyboardInterrupt", @@ -108,11 +108,10 @@ "NotImplementedError", "OSError", "OverflowError", "PendingDeprecationWarning", "ReferenceError", "RuntimeError", "RuntimeWarning", "StandardError", "StopIteration", "SyntaxError", - "SyntaxWarning", "SystemError", "SystemExit", "TabError", - "TypeError", "UnboundLocalError", "UnicodeDecodeError", - "UnicodeEncodeError", "UnicodeError", "UnicodeTranslateError", - "UnicodeWarning", "UserWarning", "ValueError", "Warning", - "ZeroDivisionError" + "SyntaxWarning", "SystemError", "SystemExit", "TabError", "TypeError", + "UnboundLocalError", "UnicodeDecodeError", "UnicodeEncodeError", + "UnicodeError", "UnicodeTranslateError", "UnicodeWarning", + "UserWarning", "ValueError", "Warning", "ZeroDivisionError" }; Set<NType> nativeTypes = new HashSet<NType>(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |