[Jython-checkins] jython: unicode_literals support.

frank.wierzbicki jython-checkins at python.org
Wed Mar 7 05:07:30 CET 2012


http://hg.python.org/jython/rev/01869de23bfd
changeset:   6309:01869de23bfd
user:        Frank Wierzbicki <fwierzbicki at gmail.com>
date:        Tue Mar 06 20:07:15 2012 -0800
summary:
  unicode_literals support.

files:
  grammar/Python.g                         |  14 ++++++++---
  src/org/python/antlr/GrammarActions.java |   9 ++++---
  src/org/python/compiler/Future.java      |   2 +
  src/org/python/core/CodeFlag.java        |   6 ++++-
  src/org/python/core/FutureFeature.java   |   4 +++
  5 files changed, 26 insertions(+), 9 deletions(-)


diff --git a/grammar/Python.g b/grammar/Python.g
--- a/grammar/Python.g
+++ b/grammar/Python.g
@@ -166,6 +166,7 @@
     private String encoding;
 
     private boolean printStatement = true;
+    private boolean unicodeLiterals = false;
 
     public void setErrorHandler(ErrorHandler eh) {
         this.errorHandler = eh;
@@ -935,9 +936,14 @@
              if (dottedText != null && dottedText.equals("__future__")) {
                  List<alias> aliases = $i1.atypes;
                  for(alias a: aliases) {
-                     if (a != null && a.getInternalName().equals("print_function")) {
-                         printStatement = false;
-                         break;
+                     if (a != null) {
+                         if (a.getInternalName().equals("print_function")) {
+                             printStatement = false;
+                             break;
+                         } else if (a.getInternalName().equals("unicode_literals")) {
+                             unicodeLiterals = true;
+                             break;
+                         }
                      }
                  }
              }
@@ -1736,7 +1742,7 @@
        }
      | (S+=STRING)+
        {
-           etype = new Str(actions.extractStringToken($S), actions.extractStrings($S, encoding));
+           etype = new Str(actions.extractStringToken($S), actions.extractStrings($S, encoding, unicodeLiterals));
        }
      ;
 
diff --git a/src/org/python/antlr/GrammarActions.java b/src/org/python/antlr/GrammarActions.java
--- a/src/org/python/antlr/GrammarActions.java
+++ b/src/org/python/antlr/GrammarActions.java
@@ -429,14 +429,14 @@
         }
     }
 
-    PyString extractStrings(List s, String encoding) {
+    PyString extractStrings(List s, String encoding, boolean unicodeLiterals) {
         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, encoding);
+            StringPair sp = extractString(last, encoding, unicodeLiterals);
             if (sp.isUnicode()) {
                 ustring = true;
             }
@@ -448,12 +448,12 @@
         return new PyString(sb.toString());
     }
 
-    StringPair extractString(Token t, String encoding) {
+    StringPair extractString(Token t, String encoding, boolean unicodeLiterals) {
         String string = t.getText();
         char quoteChar = string.charAt(0);
         int start = 0;
         int end;
-        boolean ustring = false;
+        boolean ustring = unicodeLiterals;
 
         if (quoteChar == 'u' || quoteChar == 'U') {
             ustring = true;
@@ -462,6 +462,7 @@
         if (quoteChar == 'b' || quoteChar == 'B') {
             // In 2.x this is just a str, and the parser prevents a 'u' and a
             // 'b' in the same identifier, so just advance start.
+            ustring = false;
             start++;
         }
         quoteChar = string.charAt(start);
diff --git a/src/org/python/compiler/Future.java b/src/org/python/compiler/Future.java
--- a/src/org/python/compiler/Future.java
+++ b/src/org/python/compiler/Future.java
@@ -62,6 +62,8 @@
                 FutureFeature.absolute_import.addTo(features);
             if (cflags.isFlagSet(CodeFlag.CO_FUTURE_PRINT_FUNCTION))
                 FutureFeature.print_function.addTo(features);
+            if (cflags.isFlagSet(CodeFlag.CO_FUTURE_UNICODE_LITERALS))
+                FutureFeature.unicode_literals.addTo(features);
         }
         int beg = 0;
         List<stmt> suite = null;
diff --git a/src/org/python/core/CodeFlag.java b/src/org/python/core/CodeFlag.java
--- a/src/org/python/core/CodeFlag.java
+++ b/src/org/python/core/CodeFlag.java
@@ -54,7 +54,11 @@
     /**
      * print function.
      */
-    CO_FUTURE_PRINT_FUNCTION(0x10000);
+    CO_FUTURE_PRINT_FUNCTION(0x10000),
+    /**
+     * unicode literals.
+     */
+    CO_FUTURE_UNICODE_LITERALS(0x20000);
 
 
     public final int flag;
diff --git a/src/org/python/core/FutureFeature.java b/src/org/python/core/FutureFeature.java
--- a/src/org/python/core/FutureFeature.java
+++ b/src/org/python/core/FutureFeature.java
@@ -28,6 +28,10 @@
      */
     print_function(CodeFlag.CO_FUTURE_PRINT_FUNCTION),
     /**
+     * Enables unicode literals.
+     */
+    unicode_literals(CodeFlag.CO_FUTURE_UNICODE_LITERALS),
+    /**
      * Use braces for block delimiters instead of indentation.
      */
     braces {

-- 
Repository URL: http://hg.python.org/jython


More information about the Jython-checkins mailing list