【问题标题】:Parsing source code解析源代码
【发布时间】:2023-07-20 06:15:01
【问题描述】:

我需要解析不同文件的源代码,每个文件都用不同的语言编写,我想用 C 来做。

为此,我正在考虑使用yacc / lex,但我发现它们很难理解,可能是由于完全缺乏体面的文档(要么是这样,要么它们真的很神秘)。

所以我的问题是:我在哪里可以找到yacc / lex 的一些好的文档,最好是教程风格的介绍?或者,有没有更好的方法在 C 中做到这一点?也许我可以用其他东西代替yacc / lex,甚至可以用不同的语言编写?

【问题讨论】:

  • 我想你会发现,与为真正的语言构建一个解析器相比,学习如何使用 yacc 和 lex 是一件小事,更不用说多个解析器了。最好简单地获取已经构建的解析器;参见 www.antlr.org 作为一个选项。
  • yacc/lex/bison/等。几乎死了。我看不出学习它们的意义,除非它是纯粹的教育追求。有很多解析器生成器更适合这项任务:en.wikipedia.org/wiki/Comparison_of_parser_generators
  • @Gene Bushuyev,我对这个领域很陌生。我看到很多选择,但我不知道该寻找什么。我很可能会解析 PHP、HTML、CSS 和 JavaScript,而我实现应用程序所使用的语言很可能是 C 或 Java。我应该看哪些?
  • @Radu:这是我个人经验的看法,其他人可能不同意,我不会争论。我不喜欢带有自己的语法然后为目标语言生成代码的解析器生成器。它们是维护的噩梦,词法结构和代码之间几乎没有相似之处,调试、扩展困难,以及大量浪费的开发时间。我不再使用构建解析树的解析器,将遍历和语义留给你——性能差、缺乏表现力、复杂的遍历代码。

标签: c parsing yacc lex


【解决方案1】:

yacclex 是非常强大的工具,围绕编译器构造理论构建。为了能够完全理解它们,您可能需要一些形式语言、自动机理论和编译器构造方面的基础知识。

dragon book 是该主题的经典之作。

【讨论】:

  • 经典不好,我会说。
  • 阅读附录 A 并忽略其余部分。
  • Neil Butterworth:可能有点跑题了,但有没有比 Dragon Book 更喜欢的书?
【解决方案2】:

Kernighan 和 Pike 的Unix 编程环境 的后半部分是对使用 lex 和 yacc 编写解释器的扩展介绍。 lex 覆盖范围有点小,因为他们大多使用自定义扫描仪。

【讨论】:

    【解决方案3】:

    如果您喜欢数学(此答案中最重要的子句),请编写您自己的编译器-编译器,然后用它编写您的编译器。我这样做了一次,因为我厌倦了为我开始作为递归下降编译器的编译器的所有产品编写所有函数,因为 2004 年的可用选择并不让我满意,而且因为我有空闲时间找工作的时候。我只在一个项目上使用了compiler编译器,不一定经过彻底测试,所以不在github上。我对自己设计的语法文件语法非常满意。

    如果我今天有这样的需要,我可能会做出不同的决定。较新的尖端 CC 在过去 8 年中似乎发生了很大变化。

    【讨论】: