Rust module for parsing C code. Port of Haskell's language-c, semi-automatically translated using Corollary.
This port is a work in progress. A lot of work remains to parse anything but very simple C files; while most source code has been translated from Haskell, errors in translation prevent it from matching language-c's functionality yet. Here are the next steps for achieving parity, in order:
- Building up an equivalent test bed to language-c's, then automatically cross-check
- Fix errors in the ported code to support those test cases
- Converting portions of the code into Rust idioms without breaking tests
- Figure out a porting story for the alex/happy generated parser output
parser-c requires nightly (for now). See tests/ for some working examples, or try this example:
extern crate parser_c;
use parser_c::parse;
const INPUT: &'static str = r#"
int main() {
    printf("hello world!\n");
    return 0;
}
"#;
fn main() {
    match parse(INPUT, "simple.c") {
        Err(err) => {
            panic!("error: {}", err);
        }
        Ok(ast) => {
            println!("success: {:#?}", ast);
        }
    }
}Result is:
success: Right(
    CTranslationUnit(
        [
            CFDefExt(
                CFunctionDef(
                    [
                        CTypeSpec(
                            CIntType(
                                ..
                            )
                        )
                    ],
                    CDeclarator(
                        Some(
                            Ident(
                                "main",
                                124382170,
                                ..
                            )
                        ),
                        ...
Clone this crate:
git clone https://github.com/tcr/parser-c --init --recursive
Hacking on the lexer and parser requires to build and run the Haskell dependencies using:
./regen.sh
The test suite is being ported at the moment. It is in a separate crate, because it requires a build script with prerequisites, so to run it, use this script:
./test.sh
MIT