用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言

用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言
用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(2)- 简介和设计
用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(3)- 词法分析
用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法
用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现
用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(6)- 语义分析:符号表和变量、函数

项目github地址及源码:
https://github.com/yunwei37/tryC

一个小目标

这一系列教程希望面向初学者,使用c语言手工实现一个简单的解释器来玩,不需要您掌握除了c语言以外的其他前置知识,也不需要您学习过编译原理的相关知识(当然如果能对简单的数据结构有所了解的话会更好,比如树、栈等)。

写一个能执行代码的解释器不仅是一件很有(zhuang)趣(bi)的事情,大概也可以作为刚学习完c语言的一个练手的小项目啦

不同于大部分常见的其他只支持四则运算的所谓”手工解释器“教程,我们希望在代码结构尽量清晰的600行代码中,手工(不借助lex/yacc等工具)完成一个脚本语言“try”,实现以下功能:

  • 选择和循环的流程控制语句
  • 支持的数据类型:双精度浮点数、字符型、字符串、浮点数数组
  • 支持函数和变量的定义、函数的递归调用、嵌套作用域

(如果看不懂下面这段也没关系,可以略过啦)

这个小玩意采用递归下降法进行语法分析,同时不显式构建语法树,不生成中间代码或目标代码,在语法分析的同时进行解释执行;

解释器可运行的代码示例

递归计算文波那契数列 1 - 15,将结果存入数组中,并打印:

# Fibonacci sequence
func fun{ if(x <= 2){  return(1);  }y = 0;x = x - 1;y = fun(x);x = x - 1;return(y + fun(x));
};# save the Fibonacci sequence of 1 to 15 in an array
array arr(15);
x = 1;
while( x <= 15 ){arr[x - 1] = fun(x);x = x + 1;
}puts("Fibonacci sequence:");
# print the Fibonacci sequence of 1 to 15
i = 0;
while(i < 15){           print(arr[i]);i=i+1;
}

(起名困难x)这个小玩意我们就随便叫它tryC吧,当做是一个小的尝试。

本人水平有限,如有疏漏之处,还请多多指教。

部分语言规则:

  • 注释在一行内,以‘#’开头;
  • 语句以‘;’结尾
  • 赋值语句类型:
    x = 123.4;
    x = 'c';
    x = "hello world!";
    
  • 循环语句:
    while( bool ){statements
    }
    
  • 选择语句:
    if( bool ){statements
    }if( bool ){statements
    }else{statements
    }
    
  • 定义函数:函数参数在定义中不出现,在调用中获取;返回值为double
    func function_name{...return(expression);
    }
  • 定义数组:
    array array_name(array_length);        
  • 输入输出:
    puts(string);
    print(num);
    read(num);
    

写在前面

关于写这玩意的缘由(写的很乱可以不看系列)

之前大一学c语言的时候,老师要求实现一个四则运算的计算器,于是我想…要是能给计算器加上函数和变量的定义就好啦…那大概能算一个简单的解释器?我应该怎样去实现它呢?就去查了不少资料七拼八凑加上自己脑补搓了一个出来…虽然能跑起来但是代码混乱不堪一塌糊涂,不过也挺好玩的。

这里的部分是过了一年之后大二学编译原理的时候,把当时的代码用相对比较规范完善的方式重写了一遍,也因此希望把它整理成一个简单的教程,让c语言的初学者也可以愉快地搓一个解释器玩;或者让学过编译原理的同学,能够把理论和实践联系起来,(不要像我一样被一大堆的理论迷惑住或吓跑),对于如何构造一个解释器有个直观感性的认识,并且发现它并不像想象的那么困难。

需要了解的前置知识

  • c语言的指针、函数指针、结构体等
  • 递归的思想

心理准备

  • 写一个600行的解释器虽然不算什么大工程,但相关的原理还是稍微有些复杂的,可能需要多花一些时间理解程序的运行过程;

  • 代码可能难以调试,尤其在没有生成中间代码的情况下;

参考资料

  • 《编译原理及其实践》

  • c4
    用四个函数和很少的代码就完成了功能相当完善的 C 语言编译器, 并且能够自举;我自己写作的时候也借鉴了c4的许多实现思想;

  • 手把手教你构建 C 语言编译器
    对c4的一个重写版,附有详细的中文教程

  • Let’s Build a Compiler, by Jack Crenshaw
    一个英文的初学者教程,讲解如何实现一个编译器

用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言相关推荐

  1. 手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果

    七夕来咯!又到了给重要的人送惊喜的时刻. 今年,除了将心意融入花和礼物,作为程序员,用自己的代码本事手搓一个技术感十足"七夕限定"惊喜,我觉得,这是不亚于车马慢时代手写信的古典主义 ...

  2. 【c语言】求一个3行4列矩阵的外框的元素值之和

    /*求一个3行4列矩阵的外框的元素值之和. 注意:矩阵四个角上的元素不能重复加. 例如:矩阵元素为1,2,3,4,5,6,7,8,9,10,11,12时,四框元素值之和应为65*/ #include ...

  3. python写一个类600行代码_带你领略算法的魅力,一个600行代码的分词功能实现(二)...

    从大学毕业到工作的开始几年,一直觉得大学期间学的线性代数,离散数学,概率论简直是浪费时间. 那时候实际做的代码,大部分都是数据进销存.数据输入到数据库介质中的转换,CS,BS架构都写过一些.总觉得现实 ...

  4. C语言程序设计 | 打印一个n行的菱形

    开始编写程序前,我们需要先找到菱形的规律. 1.菱形的行数k为奇数,除中间一行外上下对称,我们可以将中间行归到上半部分,上半部分行数为k=k/2+1,下半部分为k=k/2. 2.菱形每一行的*数量递增 ...

  5. python写一个类600行代码_带你领略算法的魅力,一个600行代码的分词功能实现(一)...

    为什么要说分词呢?其实这个话题挺大的.所以准备分几篇来写,这次先写第一篇. 写给别人看,也写给自己.毕竟,自己在思特奇也做了好久了,写点有意思的东西,结交一些有兴趣的朋友. 一是确实最近的一些实践给了 ...

  6. android:手搓一个即时消息聊天框(包含消息记录)

    先看一下效果 1.后端 要实现这个,先说一下后端要实现的接口 1.创建会话id 传入"发送id"和"接收id"给服务端,服务端去创建"会话id&quo ...

  7. node 压缩图片_手搓一个TinyPng压缩图片的WebpackPlugin

    作者: JowayYoung 转发链接:https://mp.weixin.qq.com/s/eqsZwZPCX-GZyB-EOm3TwQ 前言 曾经发表过一篇性能优化的文章<「实践」细聊前端性 ...

  8. node 压缩图片_嗯,手搓一个TinyPng压缩图片的WebpackPlugin也SoEasy啦

    作者:JowayYoung 仓库:Github.CodePen 博客:掘金.思否.知乎.简书.头条.CSDN 公众号:IQ前端 联系我:关注公众号后有我的微信哟 特别声明:原创不易,未经授权不得对此文 ...

  9. 从零开始手搓一个STM32与机智云的小项目——硬件介绍

    文章目录 前言 硬件简介 选型 1.主控 2.电源 3.电机驱动 4.舵机驱动 5.USB转TTL 6.其他模块 原理图绘制 1.STM32最小系统 1.电源输入 2.晶振选择 3.复位电路 4.BO ...

最新文章

  1. 一图看懂新一代人工智能知识体系大全
  2. Rushcrm:客户关系管理适合的才是好的
  3. 用Red5搭建支持WEB播放的实时监控视频
  4. Delphi中调用API函数经验点滴(二)
  5. python判断一个日期对应的节假日名
  6. 定义域可以写成不等式吗_高一数学第一次月考考点之抽象函数定义域详解
  7. jquery_ui_api中文
  8. 迁安职中计算机专业,迁安职业技术教育中心2021年招生简章
  9. 阿里矢量图标库 - 如何修改和使用自定义字体名称
  10. Unity3D数字孪生笔记——Unity脚本篇
  11. 批量转换epub书籍为mobi电子书
  12. cpu(处理器)、内存、硬盘之间的关系
  13. Linux内核性能测试工具全景图
  14. 互联网让中国零售业弯道超车:近创新比黑科技重要
  15. 计算机慢的解决方法,几种电脑变慢的解决方法
  16. 浅识WebGL和Three.js
  17. 检查oracle当前性能,高效进行Oracle日常巡检:数据库性能与安全检查
  18. 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)
  19. 首席财务官如何看待云计算和人工智能的财务报告
  20. nplayer链接onedrive失败的原因

热门文章

  1. mysql 表情符号 用什么类型_使MySQL能够存储emoji表情字符的设置教程
  2. ADC中PPM rms dBFS
  3. ionic4开发微信小程序_15个适用于Ionic应用程序开发人员的资源
  4. javacv开发详解之19:如何使用批量的多张图片制作apng动态图,再也不用担心不会制作动态图了
  5. 同步四进制可逆加减法计数器分析
  6. 这个AI算法,可以帮“元宇宙”虚拟人进行虚拟更换衣服
  7. 此计算机上无法找到autocad2017,win7系统安装autocad2017提示“无法定位inf文件ACAD.inf”如何解决...
  8. Linux实现ppp拨号4G模块联网全球APN之中国(China)
  9. 如何应用好计算机教学设计,计算机教学设计
  10. latex公式换行后保证括弧大小相同