From f8be3f5f2937b053b9cb75ada7937a6c1b20f019 Mon Sep 17 00:00:00 2001 From: François Pottier Date: Fri, 23 Oct 2015 13:34:43 +0200 Subject: Install the new system for reporting syntax errors. This requires the development version of Menhir, to be released soon. In summary: handcrafted.messages is new. It contains a mapping of erroneous sentences to error messages, together with a lot of comments. Makefile.extr is new. It contains a rule to generate cparser/pre_parser_messages.ml based on this mapping. cparser/ErrorReports.{ml,mli} are new. They construct syntax error messages, based on the compiled mapping. cparser/Lexer.mll is modified. The last two tokens that have been read are stored in a buffer. ErrorReports is called to construct a syntax error message. cparser/GNUmakefile is new. It offers several commands for working on the pre-parser. cparser/deLexer.ml is new. It is a script (it is not linked into CompCert). It translates the symbolic name of a token to an example of this token in concrete C syntax. It is used by [make -C cparser concrete] to produce the .c files in tests/generated/. cparser/tests/generated/Makefile is new. It runs ccomp, clang and gcc on each of the generated C files, so as to allow a comparison of the error messages. --- cparser/tests/generated/Makefile | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 cparser/tests/generated/Makefile (limited to 'cparser/tests') diff --git a/cparser/tests/generated/Makefile b/cparser/tests/generated/Makefile new file mode 100644 index 00000000..12a65e11 --- /dev/null +++ b/cparser/tests/generated/Makefile @@ -0,0 +1,38 @@ +.PHONY: all clean + +SOURCES := $(wildcard *.c) +TARGETS := \ + $(patsubst %.c,%.ccomp.err,$(SOURCES)) \ + $(patsubst %.c,%.gcc.err,$(SOURCES)) \ + $(patsubst %.c,%.clang.err,$(SOURCES)) + +CCOMP := ../../../ccomp +GCC := gcc +CLANG := clang + +all: $(TARGETS) + +clean: + @ rm -f *.err *~ + +%.ccomp.err: %.c $(CCOMP) + @ echo $(CCOMP) -c $< + @ if $(CCOMP) -c $< 2>$@ ; then \ + echo "UNEXPECTED SUCCESS: $(CCOMP) -c $< SUCCEEDED!" ; \ + fi + @ if grep "unknown syntax error" $@ ; then \ + echo "UNKNOWN SYNTAX ERROR!" ; \ + fi + +%.gcc.err: %.c + @ echo $(GCC) -c $< + @ if $(GCC) -c $< 2>$@ ; then \ + echo "UNEXPECTED SUCCESS: $(GCC) -c $< SUCCEEDED!" ; \ + fi + +%.clang.err: %.c + @ echo $(CLANG) -c $< + @ if $(CLANG) -c $< 2>$@ ; then \ + echo "UNEXPECTED SUCCESS: $(CLANG) -c $< SUCCEEDED!" ; \ + fi + -- cgit From dd95046b3d6bb6603529e20f2d15b14fe4144a94 Mon Sep 17 00:00:00 2001 From: François Pottier Date: Fri, 23 Oct 2015 13:45:27 +0200 Subject: Added some handwritten .c files in tests/handwritten/. --- cparser/tests/handwritten/conditional-0.c | 4 ++++ cparser/tests/handwritten/conditional-1.c | 4 ++++ cparser/tests/handwritten/dubious-enum.c | 7 +++++++ cparser/tests/handwritten/missing-assignment.c | 4 ++++ .../handwritten/missing-closing-brace-at-end-of-function.c | 10 ++++++++++ cparser/tests/handwritten/missing-loop-body.c | 5 +++++ cparser/tests/handwritten/missing-operator.c | 5 +++++ cparser/tests/handwritten/missing-semicolon.c | 5 +++++ cparser/tests/handwritten/too-many-closing-parens.c | 4 ++++ cparser/tests/handwritten/unclosed-paren.c | 5 +++++ cparser/tests/handwritten/variable-type-confusion.c | 6 ++++++ 11 files changed, 59 insertions(+) create mode 100644 cparser/tests/handwritten/conditional-0.c create mode 100644 cparser/tests/handwritten/conditional-1.c create mode 100644 cparser/tests/handwritten/dubious-enum.c create mode 100644 cparser/tests/handwritten/missing-assignment.c create mode 100644 cparser/tests/handwritten/missing-closing-brace-at-end-of-function.c create mode 100644 cparser/tests/handwritten/missing-loop-body.c create mode 100644 cparser/tests/handwritten/missing-operator.c create mode 100644 cparser/tests/handwritten/missing-semicolon.c create mode 100644 cparser/tests/handwritten/too-many-closing-parens.c create mode 100644 cparser/tests/handwritten/unclosed-paren.c create mode 100644 cparser/tests/handwritten/variable-type-confusion.c (limited to 'cparser/tests') diff --git a/cparser/tests/handwritten/conditional-0.c b/cparser/tests/handwritten/conditional-0.c new file mode 100644 index 00000000..4aeb4659 --- /dev/null +++ b/cparser/tests/handwritten/conditional-0.c @@ -0,0 +1,4 @@ +int main (int x, int y) +{ + return x == 0 ? x : y == 0 : y; +} diff --git a/cparser/tests/handwritten/conditional-1.c b/cparser/tests/handwritten/conditional-1.c new file mode 100644 index 00000000..c6a5210a --- /dev/null +++ b/cparser/tests/handwritten/conditional-1.c @@ -0,0 +1,4 @@ +int main (int x, int y) +{ + return x == 0 ? x : y == 0 ? y; +} diff --git a/cparser/tests/handwritten/dubious-enum.c b/cparser/tests/handwritten/dubious-enum.c new file mode 100644 index 00000000..12ee6683 --- /dev/null +++ b/cparser/tests/handwritten/dubious-enum.c @@ -0,0 +1,7 @@ +int f (void) +{ + int x = sizeof(enum e; + /* Maybe a closing parenthesis is missing, + maybe also "enum e" could be continued with an opening brace. + Our message ignores the latter possibility. */ +} diff --git a/cparser/tests/handwritten/missing-assignment.c b/cparser/tests/handwritten/missing-assignment.c new file mode 100644 index 00000000..2fce2cbf --- /dev/null +++ b/cparser/tests/handwritten/missing-assignment.c @@ -0,0 +1,4 @@ +int main (void) +{ + int x = 10, y 8; +} diff --git a/cparser/tests/handwritten/missing-closing-brace-at-end-of-function.c b/cparser/tests/handwritten/missing-closing-brace-at-end-of-function.c new file mode 100644 index 00000000..dfb3691d --- /dev/null +++ b/cparser/tests/handwritten/missing-closing-brace-at-end-of-function.c @@ -0,0 +1,10 @@ +int main (void) +{ + int x = 0; + x++; + /* missing closing brace, here */ + /* unfortunately, the error is detected only after the declaration of f */ + +void f (void) +{ +} diff --git a/cparser/tests/handwritten/missing-loop-body.c b/cparser/tests/handwritten/missing-loop-body.c new file mode 100644 index 00000000..44781564 --- /dev/null +++ b/cparser/tests/handwritten/missing-loop-body.c @@ -0,0 +1,5 @@ +int main (void) +{ + int x = 10; + while (x--) /* missing loop body */ +} diff --git a/cparser/tests/handwritten/missing-operator.c b/cparser/tests/handwritten/missing-operator.c new file mode 100644 index 00000000..d93e91f4 --- /dev/null +++ b/cparser/tests/handwritten/missing-operator.c @@ -0,0 +1,5 @@ +int main (void) +{ + int y = 7, z = 8; + int x = (3 * (2 x) - y * y); +} diff --git a/cparser/tests/handwritten/missing-semicolon.c b/cparser/tests/handwritten/missing-semicolon.c new file mode 100644 index 00000000..a655ca3b --- /dev/null +++ b/cparser/tests/handwritten/missing-semicolon.c @@ -0,0 +1,5 @@ +int main (void) +{ + int y = 7, z = 8 + int x = (3 * (2 + x) - y * y); +} diff --git a/cparser/tests/handwritten/too-many-closing-parens.c b/cparser/tests/handwritten/too-many-closing-parens.c new file mode 100644 index 00000000..68fe0b62 --- /dev/null +++ b/cparser/tests/handwritten/too-many-closing-parens.c @@ -0,0 +1,4 @@ +int main (void) +{ + int x = main()); +} diff --git a/cparser/tests/handwritten/unclosed-paren.c b/cparser/tests/handwritten/unclosed-paren.c new file mode 100644 index 00000000..b0ef6747 --- /dev/null +++ b/cparser/tests/handwritten/unclosed-paren.c @@ -0,0 +1,5 @@ +int main (void) +{ + int y = 7; + int x = (3 * (2 + x) - y * y; +} diff --git a/cparser/tests/handwritten/variable-type-confusion.c b/cparser/tests/handwritten/variable-type-confusion.c new file mode 100644 index 00000000..0957ca9d --- /dev/null +++ b/cparser/tests/handwritten/variable-type-confusion.c @@ -0,0 +1,6 @@ +typedef int t; +typedef int u; +int f (void) { + t = 3; +} + -- cgit From 1f74fdf503d3c501d2e261e76337452f6401d63a Mon Sep 17 00:00:00 2001 From: François Pottier Date: Fri, 23 Oct 2015 13:59:40 +0200 Subject: Added copyright banners to the new files. --- cparser/tests/generated/Makefile | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'cparser/tests') diff --git a/cparser/tests/generated/Makefile b/cparser/tests/generated/Makefile index 12a65e11..fb6e7610 100644 --- a/cparser/tests/generated/Makefile +++ b/cparser/tests/generated/Makefile @@ -1,3 +1,15 @@ +####################################################################### +# # +# The Compcert verified compiler # +# # +# François Pottier, INRIA Paris-Rocquencourt # +# # +# Copyright Institut National de Recherche en Informatique et en # +# Automatique. All rights reserved. This file is distributed # +# under the terms of the INRIA Non-Commercial License Agreement. # +# # +####################################################################### + .PHONY: all clean SOURCES := $(wildcard *.c) -- cgit