Implement comment handling in the lexer (with test).
authorCarl Worth <cworth@cworth.org>
Tue, 1 Jun 2010 19:18:43 +0000 (12:18 -0700)
committerCarl Worth <cworth@cworth.org>
Tue, 1 Jun 2010 19:18:43 +0000 (12:18 -0700)
We support both single-line (//) and multi-line (/* ... */) comments
and add a test for this, (trying to stress the rules just a bit by
embedding one comment delimiter into a comment delimited with the
other style, etc.).

To keep the test suite passing we do now discard any output lines from
glcpp that consist only of spacing, (in addition to blank lines as
previously). We also discard any initial whitespace from gcc output.
In neither case should the absence or presence of this whitespace
affect correctness.

glcpp-lex.l
tests/063-comments.c [new file with mode: 0644]
tests/glcpp-test

index a51d9e185fc6f7d834ae6f5d4bb5d610829efb98..0954ab7e83d3fdc0af583aea44210e375a59da17 100644 (file)
@@ -47,6 +47,17 @@ HEXADECIMAL_INTEGER  0[xX][0-9a-fA-F]+[uU]?
 
 %%
 
+       /* Single-line comments */
+"//"[^\n]+\n {
+       return NEWLINE;
+}
+
+       /* Multi-line comments */
+[/][*]([^*]*[*]+[^/])*[^*]*[*]*[/] {
+       if (yyextra->space_tokens)
+               return SPACE;
+}
+
 {HASH}if/.*\n {
        yyextra->lexing_if = 1;
        yyextra->space_tokens = 0;
diff --git a/tests/063-comments.c b/tests/063-comments.c
new file mode 100644 (file)
index 0000000..4cda522
--- /dev/null
@@ -0,0 +1,15 @@
+/* this is a comment */
+// so is this
+// */
+f = g/**//h;
+/*//*/l();
+m = n//**/o
++ p;
+/* this
+comment spans
+multiple lines and
+contains *** stars
+and slashes / *** /
+and other stuff.
+****/
+more code here
index ba398af0d5422244fcd92153e424cf4391684e5c..24110333a5e388e1c9d9167915360e140b9bc53b 100755 (executable)
@@ -3,8 +3,8 @@
 for test in *.c; do
     echo "Testing $test"
     ../glcpp < $test > $test.glcpp
-    grep -v '^$' < $test.glcpp > $test.out || true
+    grep -v '^ *$' < $test.glcpp > $test.out || true
     gcc -E $test -o $test.gcc
-    grep -v '^#' < $test.gcc | grep -v '^$' > $test.expected || true
+    grep -v '^#' < $test.gcc | grep -v '^$' | sed -r -e 's/^ +/ /' > $test.expected || true
     diff -u $test.expected $test.out
 done