随笔分类 - 《手写PHP编译器》
摘要:上篇文章,我们讲解了如何从yaphp源代码生成AST。这篇文章,我们来讲解如何从AST生成opcode。 一句话总结起来就是,我们对AST进行深度遍历,然后以每一个子AST来生成一条opline,最终得到op_array。我们来看一下具体如何去实现它。 首先,我们需要定义一下和op_array相关的
阅读全文
摘要:到目前为止,我们已经实现了yaphp源代码到AST的生成工作。但是,我们对echo语句的实现还是简单处理了,之前的实现如下: statement: T_ECHO expr ';' { $$ = $2; } ; 可以看到,这里实际上我们没有体现出T_ECHO的功能,我们仅仅处理了expr。所以,这里我
阅读全文
摘要:细心的小伙伴会发现,在我们实现算数表达式的时候,直接在语法分析的过程(也就是调用bison的阶段)对表达式进行了求值。现在,我们来引入抽象语法树的概念。在php-src里面,对应的就是zend_ast结构了。 我们先来编写一下zend_language_parser.y文件,以让我们对整个过程有一个
阅读全文
摘要:这篇文章,我们来用flex和bison实现算数表达式。 几乎所有的编译原理教程都会以这个为例子进行讲解,因为算数表达式的例子是比较复杂一点的,主要是因为它的语法会比其他语法难一点,这其中会涉及到递归,优先级等问题。而关于优先级问题,我们可以使用bison自带的功能来解决,但是,我们也会去讲如何自己手
阅读全文
摘要:准备工作 在写代码之前,我们很有必要先把编译C++代码的工作做好。主要涉及到以下几个方面: 编写CMakeLists 编写一个编译的脚本 编写CMakeLists 因为CMakeLists.txt的内容比较简单,所以我直接贴出我们的CMakeLists.txt文件的内容: cmake_minimum
阅读全文
摘要:从今天开始,我打算写一个全新的教程,手把手去实现一个五脏俱全的PHP,教程风格类似于去年我写的手把手编写PHP协程扩展那样,但是会有一点不同,这个教程可能就不会那么直接上那么多代码了,重点是讲解实现的思路。 这个编译器语法会尽可能的和PHP保持一致。并且我希望它是一门静态强类型的语言,你可以在定义一
阅读全文

浙公网安备 33010602011771号