# C11parser
**Repository Path**: input-output/C11parser
## Basic Information
- **Project Name**: C11parser
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: BSD-3-Clause
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-09-01
- **Last Updated**: 2024-06-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
C11parser
=========
##### A correct C89/C90/C99/C11/C18 parser written using Menhir and OCaml
The operation and design of this parser are described in detail in the
following journal paper (in process of review for publication):
> A simple, possibly correct LR parser for C11
> Jacques-Henri Jourdan and François Pottier
> 2017
How to use the parser?
----------------------
You need to have installed
- [OCaml](https://ocaml.org/docs/install.html) (known to work with 4.05.0),
- the [Menhir](http://gallium.inria.fr/~fpottier/menhir/) parser generator
(known to work with 20181113) and
- [ocamlbuild](https://github.com/ocaml/ocamlbuild) (known to work with 0.12.0)
In order to build it, you can just type `make`.
The executable that is produced takes a preprocessed C file in its
standard input and raises an exception in the case of a parse
error.
The following command-line options are available:
- `-std {c89|c90|c99|c11|c18}`
Sets which grammar to use.
`c89` and `c90` tells the parser to use the old grammar, where
declaration were not required to have a type specifier, in which
case "int" was used (it still recognizes C99, C11 and C18 constructs).
`c99`, `c11` and `c18` use the new, simpler grammar: Declarations are
required to have a type specifier, and the scoping rules are
different.
- `-c99-scoping`
Use the C99/C11/C18 scoping rules even though the old C89/C90 grammar
is used. This is always set when using the new grammar.
- `-atomic-permissive-syntax`
The C18 standard forbids the use of an opening parenthesis
immediately following an atomic type qualifier. This is intended
to avoid a possible ambiguity with _Atomic used in a type
specifier. This parser disambiguates this apparent conflict so
that this restriction can be lifted safely.
If you want to use this parser in a C front-end, you should fill the
semantic actions of .mly files with your own code for building your
AST:
- The file `parser.mly` contains a C99/C11/C18 compliant parser. It
mostly follows the grammar of the C18 standard.
- The file `parser_ansi_compatible.mly` is compliant with C89, C99,
C11 and C18 (depending on the options given in `options.ml`). It
is significantly more complex than `parser.mly`.
The test suite
--------------
We provide, in the `tests/` directory, a series of tests that are
particularly difficult to handle in a correct C parser. They are all
valid C18 fragments, except for:
- The files whose name end with `.fail.c`
- `atomic_parenthesis.c`, which represents an unnecessary restriction
in the syntax presented in the C18 standard.
In order to run the test suite, you need the
[cram](https://bitheap.org/cram/) tool, available on most major linux
distributions. Then, simply type `make test`.