2009/1/7 allen <allenogz@gmail.com>:
> 近几天在看编译原理,了解一些编译器怎么工作的,然后就想自己写个最简单的编译器
> 比如: 对C代码的分析
>
好极了,做小语言编译器是我的最爱 :D
>
> 我怎么抓到在while循环体内的变量? 比如以上的 some_variable
>
编译原理书中应该会告诉我们如何在解析过程中执行"动作",并取得当前产生式中各个"非终结符"的"值"。而这里的"值"可以是源代码中的串,不过更常见的是 parse tree 的子树,抑或是目标代码串 ^_^
在 Perl 中构造 C 解析器可以考虑使用 CPAN 上的 Parse::RecDescent 模块和 Parse::Yapp 模块。前者是 top-down 方式,且带回溯,而后者是 bottom-up 方式,LALR(1) 分析了 ^_^ 如果自己构造 rec-descent, LL(1), LR(1) 解析器也是挺有趣的,就是代码多一点,呵呵。
CPAN 上还有一个马马虎虎的 Perl 6 正则引擎 Pugs::Compiler::Rule,其自身是 top-down 方式的,但亦可以结合其内置的 precedence parser (基于 Parse::Yapp) 实现 top-down 和 bottom-up 在一遍解析中的融合,从而同时享受到两种解析策略各自的优点(在表达式以上使用 top-down 的方法更灵活,而在表达式以下,特别是运算符的处理上,bottom-up 和左递归更友好一些)。
Larry 还有一个更变态的 Perl 6 grammar engine 我还一直没敢玩。。。DFA/NFA 语义在那里融合,还有 top-down 和 bottom-up 。。。WOW
这是一个非常有趣、非常丰富的领域!
Happy parsing!
-agentzh
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina 论坛"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---
没有评论:
发表评论