| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
| |
This means that CompCert must now be compiled in --table mode.
At this point, the error message for a syntax error is still just "syntax error".
|
| |
|
| |
|
|
|
|
|
| |
This affects in which states errors are detected,
but does not change the language that is accepted.
|
|
|
|
| |
This allows us to give a better error message in one state.
|
|
|
|
|
|
|
| |
For the first one, this is fine; the error is caught by a type check later on.
For the second one, it is temporary. More thought is needed about the syntax
of K&R functions anyway, as Jacques-Henri and I discovered that it is currently
broken (it mis-interprets some function definitions).
|
| |
|
|
|
|
|
|
| |
list.
This saves 7 states and 4 error states.
|
|
|
|
|
| |
This creates more states and does not change the number of error states.
It should make it easier to give a good error message in at least 2 states.
|
|
|
|
|
|
|
| |
[declaration_specifier_no_typedef_name*].
This replaces a right-recursive list with a left-recursive list.
This saves 2 states and 6 error states.
|
|
|
|
| |
This results in slightly fewer states.
|
|
|
|
| |
elegant manner.
|
|
|
|
|
|
| |
a left-recursive list.
This further reduces the number of states (and error states).
|
|
|
|
| |
This saves a few states.
|
|
|
|
|
|
|
|
|
|
|
| |
This parameter is passed down in [declaration_specifiers(declaration(phantom))].
This allows us to distinguish between three calling contexts for [declaration_specifiers]:
- we are definitely in a parameter declaration;
- we are definitely in a declaration (e.g., in a block);
- we are in a declaration or in a function definition (i.e., at the top level).
This allows us to give better error messages.
For instance, when inside a block, we know that this cannot be the beginning
of a function definition.
|
|
|
|
|
|
|
|
| |
This does not change the automaton at all.
It allows us to distinguish more easily between two contexts:
- the beginning of a declaration or function definition;
- the beginning of a parameter declaration.
This leads to better error messages.
|
|
|
|
|
|
|
| |
This allows distinguishing two uses of abstract_declarator, within a type_name
and within a parameter_declaration. This provides more static context and
allows giving a better syntax error message, as this allows us know what is
expected next: a closing parenthesis or a comma.
|
| |
|
| |
|
|
|
|
|
| |
These productions were used to give better error messages in some situations.
They are no longer useful, since we are building a whole new system for reporting errors.
|
| |
|
| |
|
|
|
|
|
| |
Having the file in memory will help build an error message.
Also, this may be slightly faster.
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
of [lex_start_p].
This is required for Menhir to pick up the correct start position of the token.
|
|
|
|
| |
This should save a lot of calls to the shell, menhir, and ocamlfind.
|
|
|
|
|
|
|
|
|
|
| |
"table" back-ends when compiling CompCert.
For now, MENHIR_TABLE is set to false, so CompCert is not affected.
Setting MENHIR_TABLE to true builds CompCert using Menhir's table back-end.
This causes a small but repeatable slowdown on "make test", about 2% (roughly 1 second out of 40).
I have tested building ccomp and ccomp.byte.
I have tested with an ocamlfind-installed menhir and with a manually-installed menhir.
|
|
|
|
|
|
|
| |
[declaration_specifiers_no_type?].
Inlining these options was not necessary.
This reduces the number of states in the automaton.
|
| |
|
| |
|
|
|
|
| |
This leads to a smaller automaton.
|
|
|
|
|
|
| |
declarators and FOR loops.
This leads to fewer automaton states, and potentially better error messages.
|
|
|
|
|
|
|
| |
This leads to a small savings in the number of states (which could
become greater in the future if we decide to parameterize expressions).
If desired, the old automaton could be recovered by marking the binary
operators as %inline.
|
|
|
|
| |
This is analogous to the previous commit.
|
|
|
|
|
|
|
|
|
|
|
| |
[struct_or_union_specifier].
The old version was strictly equivalent to using [ioption(other_identifier)].
The new version uses [option(other_identifier)] instead, that is, [other_identifier?].
Technically, this means that [set_id_type i OtherId] is called slightly earlier (at
the opening brace, instead of at the closing brace), but this does not make any
difference, since the re-classification of identifiers affects only the second
parsing phase.
|
|
|
|
|
|
|
| |
A TYPEDEF_NAME is already classified as a [TypedefId] by the lexer,
and similarly, a VAR_NAME is already classified as a [VarId].
Thus, the removed calls had no effect.
The remaining calls to [set_id_type] are useful, as they can re-classify a token.
|
|
|
|
|
|
| |
i OtherId].
This causes no change in the automaton.
|
|
|
|
| |
I missed this opportunity in the previous commit.
|
|
|
|
|
|
|
|
|
| |
The existing [option(X)] was marked %inline, and has been renamed [ioption(X)].
A new [option(X)], which is not marked %inline, has been introduced.
The grammar now uses [option] everywhere, except where [ioption] is necessary
in order to avoid conflicts.
This reduces the number of states in the automaton. The number of LR(0) cores
drops from 857 to 712.
|
| |
|
|
|
|
| |
This violates the 80-column width limit, but is really important.
|
|
|
|
|
|
|
| |
Passing --no-stdlib ensures that there is no dependency on Menhir's
standard library.
Passing -v, which is equivalent to --explain --dump, requests the
generation of pre_parser.automaton, a description of the automaton.
|
|
|
|
| |
handled as a function with void parameter.
|
|\ |
|
| | |
|