用Perl编写C++编译器的部分代码

3
我正在尝试学习编译器和编程语言,不幸的是我的大学没有提供有关编译器的课程,因此我必须自己学习(感谢互联网)。
目前我正在尝试理解并实现我的语言的词法分析器,并且我需要使用正则表达式。
我习惯于快速编写Perl脚本正则表达式,我认为我可以将Perl嵌入到我的C++词法分析器中。现在的问题是:
  • 这会导致很重的开销吗?
  • 我应该尝试与BOOST(或任何其他适用于正则表达式的C++库)和解吗?
谢谢您阅读这篇文章 :)

3
为什么不使用老牌的lex/yacc?(或者说flex/bison) - Vlad
其实我对它们有所了解,但我想要深入理解编译器的内部机制...我也读过关于 Quex 的资料,看起来不错 :) - fat
我曾经看到过用Icon编写的词法分析器,它(像Perl一样)也具有非常好的字符串处理能力,而且对于正则表达式这样的强大工具的需求并不像你想象的那么强烈。我建议你找一本通常被大学用于编译器编写课程的书籍,比如《用C手工打造编译器》。我知道这本书会深入讲解编译器的工作原理。 - staticsan
目前我正在阅读《龙书》(编译器等等),我会尽快获取您的图书副本 :) - fat
1
@fatmatto,如果你想要深入理解,那么你就必须编写自己的正则表达式编译器。 - SK-logic
显示剩余2条评论
4个回答

8
Embedding Perl将仅用于正则表达式的项目,就像试图把大象塞进Miata以获得更多的行李空间一样。(Badump!)
使用Boost是处理正则表达式的一种方式,或者如果您在支持POSIX.2的环境中编写,请查看regcomp(),regexec()和regfree()函数。
在编写自己的词法分析器之后,可以使用一个名为lex的工具来调查,它几乎是开发词法分析器的黄金标准。 它有一个名为YACC的伴侣用于开发解析器。 这两个经过时间考验并生成紧凑且无错误的代码。(GNU-ish环境将这些程序称为flex和bison。)

6
没有理由不能这样做,成为一名优秀的程序员的一部分是使用正确的工具来完成工作,而perl在文本处理方面非常出色。
然而,你不应该考虑将基于perl的词法分析器嵌入到你的C++编译器中(希望是用C++编写的,而不是编译C++),而应该考虑在C++中编写一个perl模块,并让编译器驱动程序使用perl进行词法分析、填充数据结构,然后调用C++模块的函数来完成编译。

这个解决方案听起来很有意思,我也可以学习如何“组织”一个 Perl 模块。也许这是个愚蠢的问题,但为什么要说“不编译 C++”?性能问题还是其他原因? - fat
1
@fatmatto:编写一个可以解析C++的编译器是相当困难的。此外,在对C++进行词法分析时,您真的不需要使用正则表达式。 - MSalters
对不起,我误读了您的评论,谢谢您的解释:D 我想编译自己定义的语言,无论是什么,不是C ++ :) - fat
@fatmatto:虽然@MSalters不是我,但他确实正确地解释了我的意思。 - Ben Voigt
@Ben Voigt 对不起打扰了,您能解释一下“编译器驱动程序”是什么意思吗?它应该负责编译过程的哪个部分? - fat
@fatmatto:“编译器驱动程序”将处理命令行处理,然后调用其他子例程,例如“预处理器”,“解析器”,“词法分析器”,“调用解析器”,“优化器”,“输出生成器”。 - Ben Voigt

3
如果您只想要Perl风格的正则表达式,可以考虑使用libpcre库。它经过了充分的测试,非常易于移植和使用。强烈推荐此软件。(而且可能已经在您的计算机上了 :)

我错过了libpcre,但我找到了libPerl++,这就是我发帖的原因。你的建议看起来更符合我的问题,我会把这个libpcre加到待办列表中的 ;) - fat
PCRE 不支持 Perl 正则表达式的许多可能性。 - Alexandr Ciornii

1
请参阅perlfaq6中section的底部。它描述了如何使用//gc来创建一个称为词法分析器的标记生成器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接