summaryrefslogtreecommitdiff
path: root/ply
diff options
context:
space:
mode:
authorDavid Beazley <dave@dabeaz.com>2012-10-15 07:00:21 -0500
committerDavid Beazley <dave@dabeaz.com>2012-10-15 07:00:21 -0500
commit6437a744b6c5cf885cb7e4a01efc9c1b17582675 (patch)
treee2a58a7a43684f7ee7ef3d9610ede6a9fb72d3b2 /ply
parentd761e0a914110e0eda798913723ac16ae8aff90f (diff)
downloadply-6437a744b6c5cf885cb7e4a01efc9c1b17582675.tar.gz
Fixed whitespace handling in comments
Diffstat (limited to 'ply')
-rw-r--r--ply/cpp.py20
1 files changed, 15 insertions, 5 deletions
diff --git a/ply/cpp.py b/ply/cpp.py
index 5cad682..f4ddd27 100644
--- a/ply/cpp.py
+++ b/ply/cpp.py
@@ -15,7 +15,7 @@ from __future__ import generators
# -----------------------------------------------------------------------------
tokens = (
- 'CPP_ID','CPP_INTEGER', 'CPP_FLOAT', 'CPP_STRING', 'CPP_CHAR', 'CPP_WS', 'CPP_COMMENT', 'CPP_POUND','CPP_DPOUND'
+ 'CPP_ID','CPP_INTEGER', 'CPP_FLOAT', 'CPP_STRING', 'CPP_CHAR', 'CPP_WS', 'CPP_COMMENT1', 'CPP_COMMENT2', 'CPP_POUND','CPP_DPOUND'
)
literals = "+-*/%|&~^<>=!?()[]{}.,;:\\\'\""
@@ -55,10 +55,19 @@ def t_CPP_CHAR(t):
return t
# Comment
-def t_CPP_COMMENT(t):
- r'(/\*(.|\n)*?\*/)|(//.*?\n)'
- t.lexer.lineno += t.value.count("\n")
+def t_CPP_COMMENT1(t):
+ r'(/\*(.|\n)*?\*/)'
+ ncr = t.value.count("\n")
+ t.lexer.lineno += ncr
+ # replace with one space or a number of '\n'
+ t.type = 'CPP_WS'; t.value = '\n' * ncr if ncr else ' '
return t
+
+# Line comment
+def t_CPP_COMMENT2(t):
+ r'(//.*?(\n|$))'
+ # replace with '/n'
+ t.type = 'CPP_WS'; t.value = '\n'
def t_error(t):
t.type = t.value[0]
@@ -614,8 +623,9 @@ class Preprocessor(object):
if tok.value == '#':
# Preprocessor directive
+ # insert necessary whitespace instead of eaten tokens
for tok in x:
- if tok in self.t_WS and '\n' in tok.value:
+ if tok.type in self.t_WS and '\n' in tok.value:
chunk.append(tok)
dirtokens = self.tokenstrip(x[i+1:])