Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言的递归下降解析器_C_Parsing - Fatal编程技术网

C语言的递归下降解析器

C语言的递归下降解析器,c,parsing,C,Parsing,我正在寻找C的解析器。以下是我需要的: 用C编写(不是C++) 手写(未生成) BSD或类似许可证 能够非平凡地解析自身(可以是C的子集) 它可以是项目的一部分,只要它是解耦的,这样我就可以拉出解析器 有满足这些要求的现有解析器吗?GCC/c-parser.c中有一个解析器。怎么样?检查elsa,它使用广义LR算法 主要用于C++,但也解析C代码。 在“Elsa能解析多少C?”一节中,检查它的语法,该节说它能解析大多数C程序,包括Linux内核 它是根据BSD许可证发布的。您可以试试。它是根据较

我正在寻找C的解析器。以下是我需要的:

  • 用C编写(不是C++)
  • 手写(未生成)
  • BSD或类似许可证
  • 能够非平凡地解析自身(可以是C的子集)
  • 它可以是项目的一部分,只要它是解耦的,这样我就可以拉出解析器


    有满足这些要求的现有解析器吗?

    GCC/c-parser.c中有一个解析器。

    怎么样?

    检查elsa,它使用广义LR算法

    <>主要用于C++,但也解析C代码。

    在“Elsa能解析多少C?”一节中,检查它的语法,该节说它能解析大多数C程序,包括Linux内核


    它是根据BSD许可证发布的。

    您可以试试。它是根据较低的GPL授权的。

    如果您不需要C99,则是扣篮:

    • 它被记录在一本非常清晰、写得很好的书中
    • Dave Hanson的一篇文章和技术报告中详细介绍了用于具有优先权的运算符递归下降解析的技术
    • 清晰的手写ANSI C代码
    一个潜在的缺点是
    lcc
    解析器没有构建抽象语法树,而是直接从解析到中间代码


    如果您必须使用C99,那么我认为tinycc(tcc)是您最好的选择。

    这似乎完全符合您的要求。

    下面是我移植到C的递归下降解析器:

    此位置存在良好的c编译器。简单易懂。

    Elsa不完全是手写的;它使用Elkhound作为解析器生成器。主语法文件是一个.gr文件,它通过Elkhound生成一个解析器,该解析器实际上不满足许可要求。只是说说而已。你为什么关心解析器是如何构造的?更重要的是,如果您使用的是C的任意子集,那么为什么您希望使用一个比从规范文档生成的语法更难修改(“手写”)的语法分析器呢?更迂腐的是,C的子集有多小?从技术上讲,空语言可以解析自己:-}@Ira我很关心,因为我使用它作为类似C的领域特定语言的引导起点。它并不总是C,所以如果我生成它,我最终将不得不处理手工生成的代码。请考虑添加一个PultPT和一些示例代码,以便将来的搜索者可能会碰到这个答案,以防链接不总是有效。