C语言解释器的实现--序(零)

2023-11-10

在写CuteC文本编辑器的同时,为了使之有脚本执行能力。特意实现了一个简易的C语言解释器,所谓的解释器,就是它是解析执行脚本文件的,并不产生可执行的目标代码。它具备了C语言的几乎全部的语法。随着时间的推移,我打算把它作为一个独立的项目来开发了。在这个过程中,自己也学到了不少的知识,所以也打算跟大家分享。写这些东西,虽然是重复发明轮子的事,但也不至于是在浪费生命。程序员嘛,我总觉得应该是要理解我们每天所编译出来的程序是怎么被执行,应该明白我们敲打的每行代码的实际意义。
    我打算写一个系列的文章来说明这个解释器的实现过程,其中对于编译原理的理论知识不做太多的讲解,一是不容易提高大家的积极性,二是自己水平有限。所以我觉得大部分从例子出发,讲解一个个目标的实现过程,大家慢慢体会,估计收获会比较大。
    
    通过这一系列的文章,大家应该可以学到以下的知识。
    1.更深入的理解C的内部细节,对以后的开发总是有好处的。例如,你能很清楚C语言的类型定义,通过基本的类型为何能够定义出无穷的各种类型。
    2.了解表达式的解析,中间代码的产生。这点非常有意思,了解了这点,可以用同样的方法做很多事情,包括设计个计算器,解析复杂的配置文件,在软件中解析命令等等。
    3.对编译器有一个感性的认识,虽然离写出编译器还比较遥远,但对于语法解析,预编译,理解的就比较深入了。现在很多软件都有预编译的模块在里面,比如Pro*C, GSoap等等。
    4.我们产生的中间代码其实已经非常接近汇编代码,这对理解C的执行过程总是有好处的。
    
    总之,晒晒自己的成果,怎么说也是我亲亲苦苦写出来的,希望大家能找到点可以借鉴的东西吧~代码我还在努力的编写,过一段时间再放出来一个初级的版本。如果工作忙,那估计就要再等一段时间了。

    以前我发过上一个版本的解释器,可以在这篇文章中下载,不过我现在已经重写了解释器,所以要看结果可以先下载下来看看:)。



from: http://www.cnblogs.com/linxr/archive/2011/12/16/2290474.html


xrc C语言解释器  

http://download.csdn.net/detail/linxren/4204728




解释器 Tiny Compiler

解释器 Tiny Compiler
http://www.oschina.net/code/snippet_149334_5035

解释器 Tiny Compiler
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言解释器的实现--序(零) 的相关文章

  • 复制构造函数(拷贝构造函数)

    也许很多C 的初学者都知道什么是构造函数 但是对复制构造函数 copy constructor 却还很陌生 对于我来说 在写代码的时候能用得上复制构造函数的机会并不多 不过这并不说明复制构造函数没什么用 其实复制构造函数能解决一些我们常常会
  • 更换编译器,CODE::BLOCKS 无法DEBUG 至断点

    想在LINUX下使用CODE BLOCKS 编写调试并编译连接ARM运行程序 IDE编译环境默认为 GNU GCC 编译器 修改如下 1 至Settings gt Compiler and debugger settings 将Setect
  • 微观的C/C++编译执行过程

    前言 相信能看到这篇文章的同学 是对C语言很热爱的人 最开始学习C语言的时候 我们大多数人都是用集成开发环境 VS VC devc 等 当我们把C语言源代码写好了之后 在集成开发工具中这里点一下 哪里点一下 代码就跑起来了 这种快乐的感觉的
  • CGAL的简介及安装设置

    一 CGAL库的介绍 CGAL Computational Geometry Algorithms Library 库 计算几何算法库 是一个大型的C 几何数据结构和算法库 包含Delaunay三角网 网格生成 布尔运算的多边形 各种几何处
  • vs编译与停止调试时卡顿、无响应的问题

    这是由于VS运行太久参数大量的缓存导致 1 单击 开始 选择 运行 或者win r快捷键 2 键入 devenv exe resetuserdata 此命令会运行几分钟时间 Visual Studio 清除设置并将其自身重置到其最初的状态
  • printf标识总结(转)

    printf标识总结 转 Dev C 下基本数据类型学习小结 环境 Dev C 4 9 6 0 gcc mingw32 使用 Wall编译选项 基本类型包括字节型 char 整型 int 和浮点型 float double 定义基本类型变量
  • GDB远程调试技术---基于mini2440

    GDB调试器提供了两种不同的调试代理用于支持远程调试 即gdbserver方式和stub 插桩 方式 这两种远程调试方式是有区别的 gdbserver本身的体积很小 能够在具有很少存储容量的目标系统上独立运行 因而非常适合于嵌入式环境 而s
  • 指针以及内存分配

    1 指针很灵活 这使得指针很难管理 在定义指针时 将在栈中开辟一块内存存放指针的地址 栈内的内存由系统分配和释放 指针的地址内存只是存放指针的地址 不存放指针指向的数据 值得注意的是 定义指针时指针会随机指向一块内存 如int p p会指向
  • warning: dereferencing type-punned pointer will break strict-aliasing rules(转)

    warning dereferencing type punned pointer will break strict aliasing rules 在 gcc 2 x 下编译没有任何 warning 信息的代码换到 gcc 3 x 版本下
  • 关于拷贝构造函数的一些摘要

    拷贝构造函数 经常被称作X X 是一种特殊的构造函数 他由编译器调用来完成一些基于同一类的其他对象的构件及初始化 它的唯一的一个参数 对象的引用 是不可变的 因为是const型的 这个函数经常用在函数调用期间于用户定义类型的值传递及返回 拷
  • 指针的删除

    1 在链表中 将某个指针delete 指向该指针的那个指针的next 不会自动赋值为NULL 需要手动赋值 2 删掉 某指针所指向的内存 该指针仍然可以使用 下面是一个带头指针的单向链表 void Stack Pop int value i
  • 关于C++对象模型(下)

    下篇主要讨论调用成员函数 访问成员变量的开销 及其特殊成员函数 数组 异常处理的讨论 这篇文章中出现的对象定义都出现在上篇中 全文在这里下载 文章内容转自 http tb blog csdn net TrackBack aspx PostI
  • bin、hex、elf、axf文件解析

    冰冻三尺非一日之寒 滴水穿石非一日之功 文章目录 引言 文件分类 1 bin文件 2 hex文件 3 axf文件 4 elf文件 总结 参考资料 深度理解编译过程 参考资料 深度理解编译文件 引言 bin hex elf axf作为嵌入式开
  • Cpp关键字破解(三)【volatile】篇

    关键字总结 volatile 文章目录 关键字总结 volatile 0 前言 1 概念 2 作用 3 使用场景 4 volatile成员函数 5 代码体验 0 前言 参考几位前辈博客 汇总整理了一下 C 中volatile关键字的使用详解
  • vscode运行cpp文件:检测到 #include 错误。请更新 includePath。已为此翻译单元(E:\C++ Code\test1\test1\test1.cpp)禁用波形曲线。

    刚为vscode配置好C 编译环境准备刷leetcode 结果写cpp文件时发现 include头文件总是报错 我就很迷惑了 include
  • 为什么栈的数组长度必须是一个常量?而堆的数组长度可以是变量。为什么栈的大小有限制?

    为什么栈的数组长度必须是一个常量 而堆的数组长度可以是变量 栈区数组长度使用变量会报错 其原因就在于栈是编译器管理的 在程序运行前就已经分配好了空间的大小 而使用变量 编译器无法知道该分配多大的内存空间 于是报错 但堆上的内存是动态创建的
  • C++头文件

    作为一个二手的 net程序员 你看到了C 头文件一定就犯迷糊了 这到底是个啥玩意 再我纠结了24个小时 google20次 度娘10下 看过10来骗文章以后 我可能稍微开窍了 我对C 头文件总结 与 net比较如下 一 C 头文件究竟是什么
  • C# 4.0的一些新特性

    vs2010正式版4月12日发布了 前几天我也下了一个 但这几天都没有时间好好试用一下 今天针对C 语言的新特性使用了一下 感觉还不错 有几个新特性和大家分享一下 希望我没有太火星 一 新关键词 dynamic 在新版本的C 中 dynam
  • 结构体对齐(内存对齐)

    本文转自 http www ksarea com articles 20071004 sizeof struct memory html 有的时候 在脑海中停顿了很久的 显而易见 的东西 其实根本上就是错误的 就拿下面的问题来看 struc
  • 模板类成员函数特化写法

    昨天有对模板类的函数成员特化需求 目的是为了对不同模板参数实现不同的操作 结果在写过程中碰到already defined的问题 貌似是模板新手最容易碰到的问题了 类外的成员函数和同在类外的特化版本成员函数冲突了 因为对模板用法不是很熟悉

随机推荐

  • 统计软件与数据分析Lesson9----爬虫解析库Beautiful Soup

    统计软件与数据分析Lesson9 爬虫解析库Beautiful Soup知识点总结 1 requests 模块 1 1 查看requests功能函数 1 2 发送请求 1 3 传递URL参数 1 4 获取响应内容 2 Beautiful S
  • Chrome NET::ERR_CERT_AUTHORITY_INVALID 错误分析及处理

    Chrome NET ERR CERT AUTHORITY INVALID 错误分析及处理 1 问题描述 今天用Apache搭建好PC端服务器后 用Chrome测试 打开http localhost 时出现了如下的错误 错误代码 NET E
  • js实现前端分页页码管理

    用JS实现前端分页页码管理 可以很美观的区分页码显示 这也是参考大多数网站的分页页码展示 能够有很好的用户体验 这也是有业务需要就写了一下 还是新手 经验不足 欢迎指出批评 首先先看效果图 这是初始页面 也就是第一页 的界面 如果为第一页时
  • Python怎么合并两个矩阵?Python矩阵合并需要使用什么方法

    python之中的第三方库numpy可以构建出来矩阵这种行列格式且对称的数据结构 而在之前的文章之中小编给大家介绍了矩阵是如何通过添加的方式来扩展行列的 而本次要来给大家分享的就是一个和它相似的内容 矩阵合并的方法以及详细代码示例 一起往下
  • Hive优化

    1 Fetch抓取 目的 让hive sql 能不走MR 尽量不走MR 通过hive的参数来配置 决定哪些sql可以不走MR set hive fetch task conversion 可选值 none minimal more 默认值
  • Java实现PDF导出/预览

    网上有很多关于PDF导出的文章 但是个人感觉实现的过于复杂 又是模板又是html的 有的还需要字体模板的支持 本片文章只是实现简单的PDF表格导出 可以实现PDF动态表格导出 预览 这类文章网上很少 就给你们整理一篇吧 实现思路 本地创建P
  • 自己写的跨数据库的表同步工具

    阅读本文大概需要 3 6 分钟 近期在做数据集市 遇到的痛点如下 1 数据采集过程繁琐 重复的脚本编写太多 从不同的数据库抽取数据 需要为不同的数据库写卸数脚本 再传输到数据集市文件服务器 再入库 每一环节都需要调度 2 不同的数据库写不同
  • Linux安装unrar

    Linux中unrar的安装 下载unrar wget https www rarlab com rar rarlinux x64 6 0 2 tar gz 解压文件 tar xf rarlinux x64 6 0 2 tar gz 安装
  • win10安装protobuf

    Win10安装protobuf 准备 安装VS 下载protobuf 安装cmake 下载gmock 安装 Cmake构建配置 使用VS编译protobuf 准备 安装VS 下载protobuf 下载地址 https github com
  • flutter app启动页的强制获取配置前先检查是否有网络

    判断网络状态 connectivity plus 2 3 9 late StreamSubscription
  • Java8 stream流的操作 map和list转换

    Java8 stream流的操作 1 将map的所有value转换成list 创建map并塞两个值 Map
  • Linux shell命令行可选参数的getopts命令使用例子

    Linux shell命令行可选参数的getopts命令使用例子 一 概述 getopts option DESCPRITION VARIABLE option 表示为某个脚本可以使用的选项 冒号如果某个选项 option 后面出现了冒号
  • pytorch余弦退火学习率CosineAnnealingLR的使用

    一 背景 再次使用CosineAnnealingLR的时候出现了一点疑惑 这里记录一下 其使用方法和参数含义 后面的代码基于 pytorch 版本 1 1 不同版本可能代码略有差距 但是含义是差不多的 二 余弦退火的目的和用法 2 1 为啥
  • flutter video_player视频播放器的横竖屏切换

    参考 需要使用到的库 import package flutter services dart 用到的方法 实现全屏功能代码 一般写在按钮或者初始化函数里 SystemChrome setPreferredOrientations Devi
  • linux添加静态路由

    linux下静态路由修改命令 方法一 添加路由 route add net 192 168 0 0 24 gw 192 168 0 1 route add host 192 168 1 1 dev 192 168 0 1 删除路由 rout
  • 推荐系统的学习历程(二)

    前面都是大二上学期的事情了 到了大二的下学期 老师急着要成果 我之前做的铺垫也可以得到一点体现了 经过了一个寒假的读论文 我也开始对这个算法有了不错的理解 发现这不过是统计学 高等数学 线性代数的简单应用而已 看过很多文献对这些算法的改进
  • java基础编程

    目录 一 java语言概述 1 适用的领域 2 特点 3 环境搭建 二 基本语法 1 关键字和标识符 1 1关键字 1 2保留字 1 3标识符 2 变量的使用 2 1分类 2 2定义变量的格式 2 3注意 2 4基本数据类型变量间的运算规则
  • 一类6维Lorenz型超混沌系统的有限时间驱动-响应同步

    本文基于Lypunov稳定性定理 通过构造Lyapunov函数以及设计提出一非线性反馈控制输入器 u u u 进而实现一类六维Lorenz型混沌系统的有限时间同步 本文所基于的一类六维Lorenz型超混沌系统可表示如下
  • C语言中定义字符串的几种方式

    1 什么是字符串 所谓字符串本质上就是以 0作为 结尾的特殊字符数组 2 定义字符串的过程中有哪些注意点 由于字符串本质上其实就是以 0作为 结尾的特殊字符数组 所以定义字符串时 必须保证字符串存储的最后一个元素为 0 当我们没有给定字符串
  • C语言解释器的实现--序(零)

    在写CuteC文本编辑器的同时 为了使之有脚本执行能力 特意实现了一个简易的C语言解释器 所谓的解释器 就是它是解析执行脚本文件的 并不产生可执行的目标代码 它具备了C语言的几乎全部的语法 随着时间的推移 我打算把它作为一个独立的项目来开发