(Arne Babenhauserheide)
2013-08-08: FIX: comments containing a closing parenthesis could break the v0.3.1 FIX: comments containing a closing parenthesis could break the parser → the linebreak-killing-code in brackets had to be aware of comments.
diff --git a/.bugs/bugs b/.bugs/bugs
--- a/.bugs/bugs
+++ b/.bugs/bugs
@@ -2,4 +2,4 @@ fails when I add stuff at the end of end
implement wisp in wisp | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:6299306916706410702029289bf32edab1e7f17c, time:1367113341.49
inline ' : should be '( | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:72d534a8b23b4cb168017f1bb7d8816f0ea170c4, time:1366497335.26
make this work: let : : origfile ( open-file : nth 1 : command-line ) r | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:d6de2074a5017f1f29f34d142ce797981ed270a0, time:1366529287.67
-comments containing a closing parenthesis can break the parser. | owner:, open:True, id:d9147504868960e5fbc2648474d48ce5c9bd1a02, time:1374838747.22
+comments containing a closing parenthesis can break the parser. | owner:, open:False, id:d9147504868960e5fbc2648474d48ce5c9bd1a02, time:1374838747.22
diff --git a/tests/quotecolon.w b/tests/quotecolon.w
new file mode 100755
--- /dev/null
+++ b/tests/quotecolon.w
@@ -0,0 +1,10 @@
+#!/home/arne/wisp/wisp-multiline.sh
+; !#
+define a 1 ; test whether ' : correctly gets turned into '(
+; and whether brackets in commments are treated correctly.
+
+define a ' : 1 2 3
+
+define
+ a b
+ c
diff --git a/wisp.py b/wisp.py
--- a/wisp.py
+++ b/wisp.py
@@ -47,8 +47,8 @@ def replaceinwisp(code, string, replacem
strlen = len(string)
for n in range(len(code) - strlen):
i = code[n]
- # comments start with a ; - but only in regular wisp code.
- if not incomment and not instring and not inbrackets and i == ";" and not code[n-2:n] == "#\\":
+ # comments start with a ; - but only in regular wisp code or in brackets.
+ if not incomment and not instring and i == ";" and not code[n-2:n] == "#\\":
incomment = not incomment
# a linebreak ends the comment
if incomment:
@@ -219,9 +219,20 @@ def nostringbreaks(code):
def nobracketbreaks(code):
"""remove linebreaks inside brackets (will be readded at the end)."""
instring = False
+ incomment = False
inbracket = 0
nostringbreaks = []
for n, char in enumerate(code):
+ # comments start with a ; - but only in regular wisp code or in brackets.
+ if not incomment and not instring and char == ";" and not code[n-2:n] == "#\\":
+ incomment = not incomment
+ # a linebreak ends the comment
+ if incomment:
+ if char == "\n":
+ incomment = not incomment
+ # all processing stops in comments
+ nostringbreaks.append(char)
+ continue
if char == '"' and not code[n-1:n] == "\\":
instring = not instring
if char == '(' and not instring and not code[n-2:n] == "#\\":