4 个版本 (2 个破坏性更新)

使用旧的 Rust 2015

0.3.0 2017 年 8 月 2 日
0.2.1 2017 年 7 月 5 日
0.2.0 2017 年 7 月 5 日
0.0.1 2017 年 6 月 6 日

#2366 in Rust 模式

每月 23 次下载

MIT 许可证

4MB
134K SLoC

Haskell 61K SLoC // 0.1% comments Rust 60K SLoC // 0.0% comments Happy 7.5K SLoC Alex 3.5K SLoC C 788 SLoC // 0.1% comments Cabal 496 SLoC // 0.0% comments M4 258 SLoC // 0.2% comments Shell 245 SLoC // 0.2% comments RPM Specfile 96 SLoC Ruby 33 SLoC SWIG 2 SLoC

包含 (模糊的 autoconf 代码, 1KB) deps/happy-rust/doc/configure.ac, (模糊的 autoconf 代码, 1KB) deps/alex-rust/doc/configure.ac

parser-c

Gitter https://img.shields.io/crates/v/parser-c.svg

Rust 模块用于解析 C 代码。Haskell 的 language-c 的移植,使用 Corollary 半自动翻译。

此移植正在进行中。 解析除非常简单的 C 文件之外的所有文件都需要大量工作;虽然大部分源代码已从 Haskell 翻译过来,但翻译错误阻止了它与 language-c 的功能相匹配。以下是实现等价的下一步步骤,按顺序

  1. 构建与 language-c 相当的测试平台,然后自动交叉检查
  2. 修复移植代码中的错误以支持这些测试用例
  3. 在不破坏测试的情况下将代码的部分转换为 Rust 习惯用法
  4. 确定对 alex/happy 生成的解析器输出的移植方案

parser-c 需要 nightly(目前如此)。查看 tests/ 中的某些工作示例,或尝试此示例

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);
        }
    }
}

结果是

success: Right(
    CTranslationUnit(
        [
            CFDefExt(
                CFunctionDef(
                    [
                        CTypeSpec(
                            CIntType(
                                ..
                            )
                        )
                    ],
                    CDeclarator(
                        Some(
                            Ident(
                                "main",
                                124382170,
                                ..
                            )
                        ),
                        ...

开发

克隆此crate并安装其 Haskell 依赖项

git clone https://github.com/tcr/parser-c --init --recursive
stack install alex happy

许可证

MIT

依赖项

~5.5MB
~127K SLoC