#parser #haskell #ported #helper #macro #parser-c #language-c

nightly macro parser-c-macro

parser-c的辅助宏

2个不稳定版本

使用旧的Rust 2015

0.3.0 2017年8月2日
0.1.0 2017年7月5日

#29#ported

每月21 次下载
parser-c 中使用

MIT/Apache

6KB
101

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

git clone https://github.com/tcr/parser-c --init --recursive

对词法分析和解析器进行黑客攻击需要使用构建和运行Haskell依赖项

./regen.sh

测试套件目前正在移植。它在一个单独的crate中,因为它需要一个带有先决条件的构建脚本,因此要运行它,请使用此脚本

./test.sh

许可证

MIT

依赖项

~4MB
~91K SLoC