Treating cython: comments as regular comments when not at top
authorDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Tue, 5 Aug 2008 12:25:31 +0000 (14:25 +0200)
committerDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Tue, 5 Aug 2008 12:25:31 +0000 (14:25 +0200)
Cython/Compiler/Lexicon.py
Cython/Compiler/Parsing.py
Cython/Compiler/Scanning.py
tests/compile/c_options.pyx
tests/errors/e_options.pyx

index f1282c87b3cc9fb6b24608a415e8a32341b83ea9..8fe3724ff974f90115a7ceaa3f8e58de474ef4cc 100644 (file)
@@ -97,13 +97,13 @@ def make_lexicon():
         #(stringlit, 'STRING'),
         (beginstring, Method('begin_string_action')),
         
-        (option_comment, 'option_comment'),
+        (option_comment, Method('option_comment')),
         (comment, IGNORE),
         (spaces, IGNORE),
         (escaped_newline, IGNORE),
         
         State('INDENT', [
-            (option_comment + lineterm, 'option_comment'),
+            (option_comment + lineterm, Method('option_comment')),
             (Opt(spaces) + Opt(comment) + lineterm, IGNORE),
             (indentation, Method('indentation_action')),
             (Eof, Method('eof_action'))
index 908a91c69a965b1ba41cfb6c24e6e5ef4c2c9f00..731116b2a17aae851f3172d7cd10f0a2088b46c6 100644 (file)
@@ -507,8 +507,6 @@ def p_atom(s):
     elif sy == 'NULL':
         s.next()
         return ExprNodes.NullNode(pos)
-    elif sy == 'option_comment':
-        s.error("#cython option comments only allowed at beginning of file")
     else:
         s.error("Expected an identifier or literal")
 
@@ -2342,6 +2340,7 @@ def p_module(s, pxd, full_module_name):
         level = 'module'
 
     option_comments = p_option_comments(s)
+    s.parse_option_comments = False
     body = p_statement_list(s, Ctx(level = level), first_statement = 1)
     if s.sy != 'EOF':
         s.error("Syntax error in statement [%s,%s]" % (
index ee01e08f9867667d86c83ebbc79d3073e89dd6b2..bdf7eb4be3fde5befa5d87a079b7ee76dcfa0072 100644 (file)
@@ -303,6 +303,7 @@ class PyrexScanner(Scanner):
             self.compile_time_env = initial_compile_time_env()
             self.compile_time_eval = 1
             self.compile_time_expr = 0
+        self.parse_option_comments = True
         self.source_encoding = source_encoding
         self.trace = trace_scanner
         self.indentation_stack = [0]
@@ -311,6 +312,13 @@ class PyrexScanner(Scanner):
         self.begin('INDENT')
         self.sy = ''
         self.next()
+
+    def option_comment(self, text):
+        # #cython:-comments should be treated as literals until
+        # parse_option_comments is set to False, at which point
+        # they should be ignored.
+        if self.parse_option_comments:
+            self.produce('option_comment', text)    
     
     def current_level(self):
         return self.indentation_stack[-1]
index e653a2846d6fd7b612c298375398954cb071511c..8f7dac7c2294caa2767730f052eec748f576f825 100644 (file)
@@ -10,6 +10,9 @@ def f(object[int, 2] buf):
 
 @cy.boundscheck(True)
 def g(object[int, 2] buf):
+    # Please leave this comment, 
+#cython: this should have no special meaning
+    # even if the above line doesn't follow indentation.
     print buf[3, 2]
 
 def h(object[int, 2] buf):
index a100e4cc5f4bc848474bf807aa61c3afd82e28ba..0c82adc8ae4323b712097dfdaa99ecf7ab0529db 100644 (file)
@@ -17,6 +17,5 @@ _ERRORS = u"""
 2:0: Expected "=" in option "nonexistant"
 3:0: Unknown option: "some"
 10:0: Must pass a boolean value for option "boundscheck"
-14:0: #cython option comments only allowed at beginning of file
 """