enable ur'abc' literals and b'abc'/br'abc' literals
authorStefan Behnel <scoder@users.berlios.de>
Sat, 17 May 2008 04:37:25 +0000 (06:37 +0200)
committerStefan Behnel <scoder@users.berlios.de>
Sat, 17 May 2008 04:37:25 +0000 (06:37 +0200)
Cython/Compiler/Lexicon.py
Cython/Compiler/Parsing.py
Cython/Compiler/Scanning.py
tests/run/append.pyx

index cd9cfdb9666e50ca64b430a05a56a2a1dde6eecc..0f8bc898b1110e68651322726f44e654a6a5e15f 100644 (file)
@@ -5,7 +5,8 @@
 #   to be rebuilt next time pyrexc is run.
 #
 
-string_prefixes = "cCrRuU"
+raw_prefixes = "rR"
+string_prefixes = "cCuUbB"
 
 def make_lexicon():
     from Cython.Plex import \
@@ -55,9 +56,8 @@ def make_lexicon():
         + Rep(non_dq | (Str('"') + non_dq) | (Str('""') + non_dq)) 
         + Str('"""')
     )
-    stringlit = Opt(Any(string_prefixes)) + (sq_string | dq_string | tsq_string| tdq_string)
     
-    beginstring = Opt(Any(string_prefixes)) + (Str("'") | Str('"') | Str("'''") | Str('"""'))
+    beginstring = Opt(Any(string_prefixes)) + Opt(Any(raw_prefixes)) + (Str("'") | Str('"') | Str("'''") | Str('"""'))
     two_oct = octdigit + octdigit
     three_oct = octdigit + octdigit + octdigit
     two_hex = hexdigit + hexdigit
index 69d458968dcec2a3962705d8997cfaf6aa6a4997..c52b19b9d239f0cfd07dab077a14d3c9901c8ffb 100644 (file)
@@ -512,7 +512,7 @@ def p_name(s, name):
 
 def p_cat_string_literal(s):
     # A sequence of one or more adjacent string literals.
-    # Returns (kind, value) where kind in ('', 'c', 'r', 'u')
+    # Returns (kind, value) where kind in ('b', 'c', 'u')
     kind, value = p_string_literal(s)
     if kind != 'c':
         strings = [value]
@@ -537,19 +537,23 @@ def p_opt_string_literal(s):
 
 def p_string_literal(s):
     # A single string or char literal.
-    # Returns (kind, value) where kind in ('', 'c', 'r', 'u')
+    # Returns (kind, value) where kind in ('b', 'c', 'u')
     # s.sy == 'BEGIN_STRING'
     pos = s.position()
-    #is_raw = s.systring[:1].lower() == "r"
+    is_raw = 0
     kind = s.systring[:1].lower()
-    if kind not in "cru":
+    if kind == 'r':
+        kind = ''
+        is_raw = 1
+    elif kind in 'ub':
+        is_raw = s.systring[1:2].lower() == 'r'
+    elif kind != 'c':
         kind = ''
     if Future.unicode_literals in s.context.future_directives:
         if kind == '':
             kind = 'u'
-        elif kind == 'u':
-            s.error("string literal must not start with 'u' when importing __future__.unicode_literals")
-            return ('u', '')
+    elif kind == '':
+        kind = 'b'
     chars = []
     while 1:
         s.next()
@@ -562,7 +566,7 @@ def p_string_literal(s):
             chars.append(systr)
         elif sy == 'ESCAPE':
             systr = s.systring
-            if kind == 'r':
+            if is_raw:
                 if systr == '\\\n':
                     chars.append(r'\\\n')
                 elif systr == r'\"':
index 67016d99032230c99b7b66b79ce452e7eddf2820..bb338a5eb182819b6cfc0502b4e58dd4db335e6f 100644 (file)
@@ -15,7 +15,7 @@ from Cython import Plex, Utils
 from Cython.Plex import Scanner
 from Cython.Plex.Errors import UnrecognizedInput
 from Errors import CompileError, error
-from Lexicon import string_prefixes, make_lexicon
+from Lexicon import string_prefixes, raw_prefixes, make_lexicon
 
 plex_version = getattr(Plex, '_version', None)
 #print "Plex version:", plex_version ###
@@ -262,6 +262,8 @@ class PyrexScanner(Scanner):
     def begin_string_action(self, text):
         if text[:1] in string_prefixes:
             text = text[1:]
+        if text[:1] in raw_prefixes:
+            text = text[1:]
         self.begin(self.string_states[text])
         self.produce('BEGIN_STRING')
     
index d8d72ce17ee84abe9f2e9ac9d43d5aa49125b0c5..29575aa3f17e9b6dba90c704cf5bed4ee4c4bb57 100644 (file)
@@ -25,11 +25,12 @@ class A:
     def append(self, x):
         print u"appending"
         return x
-        
+
 class B(list):
     def append(self, *args):
+        append = super(B, self).append
         for arg in args:
-            list.append(self, arg)
+            append(arg)
 
 def test_append(L):
     print L.append(1)