vickenty / lang-c

Lightweight C parser for Rust
Apache License 2.0
202 stars 30 forks source link

K&R support seems broken #7

Closed p2mate closed 5 years ago

p2mate commented 5 years ago

The following simple program using K&R function definitions results in an error using lang-c. It compiles fine with gcc however.

extern int puts(char *);

int main(argc, argv)
int argc;
char **argv;
{
        puts("Hello!");

        return 0;
}

Rust test program:

/* Test program to show bug in K&R parsing.
 * 
 * Input program:
 *
 * extern int puts(char *);
 *
 * int main(argc, argv)
 * int argc;
 * char **argv;
 * {
 *      puts("Hello!");
 *
 *      return 0;
 * }
 *
 * Output:
 * Err(SyntaxError(SyntaxError { source: "# 1 \"kr.c\"\n# 1 \"<built-in>\"\n# 1 \"<command-line>\"\n# 31 \"<command-line>\"\n# 1 \"/usr/include/stdc-predef.h\" 1 3 4\n# 32 \"<command-line>\" 2\n# 1 \"kr.c\"\nextern int puts(char *);\n\nint main(argc, argv)\nint argc;\nchar **argv;\n{\n puts(\"Hello!\");\n\n return 0;\n}\n", line: 10, column: 14, offset: 184, expected: {"[_a-zA-Z]", "[_a-zA-Z0-9]", ")"} }))
 *
 */

extern crate lang_c;
use lang_c::driver::{Config, parse}; 

fn main() {
    let config = Config::default();
    println!("{:?}", parse(&config, "kr.c"));
}

Output:

Err(SyntaxError(SyntaxError { source: "# 1 \"kr.c\"\n# 1 \"\"\n# 1 \"\"\n# 31 \"\"\n# 1 \"/usr/include/stdc-predef.h\" 1 3 4\n# 32 \"\" 2\n# 1 \"kr.c\"\nextern int puts(char *);\n\nint main(argc, argv)\nint argc;\nchar **argv;\n{\n puts(\"Hello!\");\n\n return 0;\n}\n", line: 10, column: 14, offset: 184, expected: {"[_a-zA-Z]", "[_a-zA-Z0-9]", ")"} }))

vickenty commented 5 years ago

Thanks!