【问题标题】:Writing part of a compiler (written in c++) in Perl用 Perl 编写编译器的一部分(用 C++ 编写)
【发布时间】:2011-03-21 00:04:15
【问题描述】:

我正在努力学习更多关于编译器和编程语言的知识,很遗憾我的大学没有提供关于编译器的课程,所以我必须自己做(感谢互联网)。

目前我尝试理解并为我的语言实现词法分析器,我需要正则表达式。

我习惯于快速编写 perl 正则表达式脚本,并且我认为 我可以将 Perl 嵌入到我的 C++ 词法分析器中。现在的问题是:

  • 会不会造成很大的开销?
  • 我应该尝试与 BOOST(或任何其他 c++ 库好的 gor regex)和平相处吗?

感谢您阅读本文:)

【问题讨论】:

  • 为什么不是旧的好 lex/yacc? (嗯,弯曲/野牛)
  • 实际上我知道它们,但我想对编译器内部有一个“深入”的了解。我也读过关于 Quex 的文章,看起来也不错:)
  • 我见过一个用 Icon 编写的词法分析器,它(如 Perl)也具有非常好的字符串处理能力,并且对正则表达式等功能的需求远没有你想象的那么强烈.我建议您找一本大学通常用于编译器编写课程的书,例如“Crafting a Compiler in C”。我知道人们非常了解编译器的工作原理。
  • 目前我正在阅读龙书(编译器等),我会尽快获取您的书的副本 :)
  • @fatmatto,如果你想深入了解,你一定要编写自己的正则表达式编译器。

标签: c++ perl compiler-construction programming-languages lexer


【解决方案1】:

在你的项目中嵌入 Perl 只是为了做正则表达式就像试图把一头大象塞进一个 Miata 以获得更多的树干空间。 (坏蛋!)

Boost 是处理正则表达式的一种方法,或者如果您在支持 POSIX.2 的环境中编写代码,请查看 regcomp()regexec()regfree() 函数。

编写自己的词法分析器后,请研究一个名为lex 的工具,它几乎是开发词法分析器的黄金标准。它有一个名为YACC 的合作伙伴来开发解析器。两者都经过时间测试并生成紧凑、无错误的代码。 (GNU-ish 环境将这些程序称为 flexbison。)

【讨论】:

    【解决方案2】:

    没有理由你不能,成为一名优秀程序员的一部分是使用正确的工具来完成这项工作,而 perl 非常擅长文本处理。

    但是,与其考虑将基于 perl 的词法分析器填充到 C++ 编译器中(我希望用 C++ 编写,而不是编译 C++),不如考虑用 C++ 编写 perl 模块,然后编写编译器驱动程序在perl中,进行词法分析,填写数据结构,然后调用C++模块的函数完成编译。

    【讨论】:

    • 这个解决方案听起来很有趣,我还可以学习如何“组织”一个 perl 模块。也许是一个愚蠢的问题,但为什么要说“不编译 c++”?性能问题还是其他问题?
    • @fatmatto:编写一个可以解析 C++ 的编译器非常困难。此外,你真的不需要正则表达式来 lex C++。
    • 很抱歉我误读了您的评论,感谢您解释说:D 我想编译我自己定义的语言,而不是 c++ :)
    • @fatmatto:虽然@MSalters 不是我,但他确实正确地解释了我的意思。
    • @Ben Voigt 很抱歉打扰您,但您能解释一下您对“编译器驱动程序”的确切含义吗?它应该处理编译器过程的哪一部分?
    【解决方案3】:

    如果您真正想要的是 Perl 风格的正则表达式,请查看 libpcre 库。它经过了很好的测试,非常便携,并且根据我的经验易于使用。推荐软件。 (可能已经在你的机器上。:)

    【讨论】:

    • 我错过了 libpcre,但我找到了 libPerl++,这就是我发表这篇文章的原因。你的建议对我的问题看起来更具体,我会将这个 libpcre 添加到待办事项列表中;)
    • PCRE 不支持 Perl 正则表达式的许多可能性
    【解决方案4】:

    请参阅“正则表达式中的 \G 有什么好处?”的底部。 section perlfaq6。它描述了如何使用 //gc 来创建分词器,也就是词法分析器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2020-09-22
      相关资源
      最近更新 更多