搜索
bottom↓
回复: 47

一个简单的C语言解释器

  [复制链接]

出0入0汤圆

发表于 2012-8-16 17:32:01 | 显示全部楼层 |阅读模式
本帖最后由 lcw_swust 于 2012-8-18 13:54 编辑

看到了坛子里的“MicroBASIC解释器”(http://www.amobbs.com/forum.php? ... 3%E9%87%8A%E5%99%A8
网上也有其它的关于解释器的资料,如
“用C语言写解释器”
http://blog.csdn.net/redraiment/article/category/606586
附件中有个资料,大家也可以去参考参考:Tbasic\自己动手编Basic解释器.doc
查看了诸多资料后,终于有了写一个C语言解释器的信心。
下面简单介绍一下这个解释器:

目标:单片机中运行C语言程序

省略:
        include文件,静态变量(用全局变量代替),强制类型转换,
        switch(if代替),GOTO,break,return,
        宏定义
实现:
        常量定义,全局变量定义,局部变量,指针,一维数组,
        函数调用,
        + - * /运算,位运算,关系运算   
        if语句if...else if...else...
        while语句while()...
        API调用(如串口发数)
注意:
        程序有漏洞,使用需小心。

工程编译后如图:(代码量稍微有点大)


KEIL调试效果如图:(view->serial window #1)

本程序已在STC12C5A60S2单片机上运行通过。
DEBUG开启后,串口发出的源代码如下:
unsigned char a=0xff,b=10,c='a';
char tab[2]={1,c};
char* p1="hello";
long lp1=1234;
void add(int* c,int a,int b)
{
*c=a+b;
}
void main(void){
int d;
prints(p1);
prints("
a=");
printn(a,3);
prints("
b=");
printn(b,3);
prints("
c=");
printn(c,3);
prints("
tab[0]=");
printn(tab[0],3);
prints("
tab[1]=");
printn(tab[1],3);
prints("
");
d=0; while(d<100)
{
  add(&d,d,10);
  prints("
d=");
  printn(d,5);
  delayms(1000);
}
}
工程源代码:


参考资料:





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-7-30 11:08:03 | 显示全部楼层
本帖最后由 lcw_swust 于 2013-7-30 11:21 编辑

前段时间在做编译器的时候,对此程序进行了精简,现在发上来


程序参考了别人的"little c 解释器",网上能查到源码,此处将源码以及KEIL下移植的工程发上来
(水平有限,移植后貌似运行不正常,但是语法没错,可以方便查阅代码)



对编译器有兴趣的同学可以看下:
http://www.amobbs.com/thread-5536737-1-1.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-8-16 17:36:15 | 显示全部楼层
lz很强啊?呵呵

出0入0汤圆

发表于 2012-8-16 17:46:35 | 显示全部楼层
真长 一点都看不懂

出0入0汤圆

发表于 2012-8-16 21:09:16 | 显示全部楼层
汗,郁闷了,,,没用过这东西!看不懂

出0入264汤圆

发表于 2012-8-16 21:32:04 来自手机 | 显示全部楼层
可以用在一些需要简单脚本的地方。

出0入0汤圆

发表于 2012-8-18 12:28:56 | 显示全部楼层
还是搞不懂这个东西的作用

出0入0汤圆

发表于 2012-8-18 13:37:08 | 显示全部楼层
学习编译原理很有用。

出0入0汤圆

发表于 2012-8-18 13:39:25 | 显示全部楼层
单片机 执行、C语言? 解释器? C语言是解释的么?

出0入0汤圆

发表于 2012-8-18 13:43:12 | 显示全部楼层
虽然我很菜,虽然看不懂,但是楼主很强大,顶起

出0入0汤圆

发表于 2012-8-18 13:44:40 | 显示全部楼层
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。
翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。
解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。

出0入0汤圆

 楼主| 发表于 2012-8-18 13:57:22 | 显示全部楼层
biqi 发表于 2012-8-18 12:28
还是搞不懂这个东西的作用


这个东西的作用就是,把单片机当作电脑,然后在这台电脑上写一段C代码,然后它能运行这段C代码

出0入0汤圆

发表于 2012-8-19 00:09:31 | 显示全部楼层
还是要慢慢学啊

出0入0汤圆

发表于 2012-8-19 05:27:25 来自手机 | 显示全部楼层
rtt的shell就有这个的实现

出0入0汤圆

发表于 2012-8-19 09:55:23 | 显示全部楼层
mark!                    

出0入0汤圆

发表于 2012-8-19 12:53:49 来自手机 | 显示全部楼层
这个不错啊 没听说过解释器呢

出0入0汤圆

发表于 2012-8-19 13:54:46 | 显示全部楼层
呵呵 这玩意第一次听说

出0入0汤圆

发表于 2012-8-19 16:31:41 | 显示全部楼层
。。。。

出0入0汤圆

发表于 2012-8-19 16:51:48 | 显示全部楼层
第一次听说  学习先

出0入0汤圆

发表于 2012-8-19 21:24:09 | 显示全部楼层
楼主厉害呀!!!!!!!!

出0入0汤圆

发表于 2013-7-26 14:01:12 | 显示全部楼层
解释器主要用于什么目的?

出0入0汤圆

 楼主| 发表于 2013-7-26 14:26:06 | 显示全部楼层
本帖最后由 lcw_swust 于 2013-7-26 14:28 编辑
john_8 发表于 2013-7-26 14:01
解释器主要用于什么目的?


说说我的目的:
单片机+12864LCD+键盘,
通过键盘在LCD内输入文本代码,可以让单片机运行输入的代码。
这就类似于在电脑上用VC编写程序,然后编译并运行。

出0入0汤圆

发表于 2013-7-26 20:40:19 来自手机 | 显示全部楼层
这个强,解释器,且是c解释器,顶

出0入0汤圆

发表于 2013-7-27 21:19:22 | 显示全部楼层
很好很强大,支持

出0入0汤圆

发表于 2013-7-27 21:40:18 | 显示全部楼层
正要一个呢,有更详细的资料吗?

出0入0汤圆

发表于 2013-7-27 21:52:37 | 显示全部楼层
收藏先,有时间再看。

话说如此强大的帖子,怎么这么少人顶呢?

出0入0汤圆

发表于 2013-7-27 23:48:11 来自手机 | 显示全部楼层
做个记号,仔细想想

出0入0汤圆

 楼主| 发表于 2013-7-28 11:01:51 | 显示全部楼层
osfg 发表于 2013-7-27 21:40
正要一个呢,有更详细的资料吗?

如果自己多花时间研究的话,相信帖子中的资料已经足够了。
这里还有个C语言的解释器,貌似叫 “little c” ,代码要简洁些:
http://www.pudn.com/downloads70/ ... r/detail251795.html
在我发的帖里还有一个由解释器改编成的编译器,有兴趣可以看看
http://www.amobbs.com/thread-5536737-1-1.html

出0入0汤圆

发表于 2013-7-28 15:13:49 | 显示全部楼层
lcw_swust 发表于 2013-7-28 11:01
如果自己多花时间研究的话,相信帖子中的资料已经足够了。
这里还有个C语言的解释器,貌似叫 “little c ...

好的,谢谢

出0入0汤圆

发表于 2013-7-29 09:03:32 | 显示全部楼层
好的,谢谢!!

出0入0汤圆

发表于 2013-7-29 09:34:57 | 显示全部楼层
学习了                  

出0入0汤圆

发表于 2013-7-29 09:36:55 | 显示全部楼层
绝对顶!!!!!!!!

出0入0汤圆

发表于 2013-7-29 14:17:50 | 显示全部楼层
马克下~~
回家研究去~

出0入0汤圆

发表于 2013-7-29 20:47:48 | 显示全部楼层
看了好几次这个帖子了,没明白干嘛用的,但我知道肯定是个好东西,求科普啊

出0入0汤圆

 楼主| 发表于 2013-7-30 09:37:46 | 显示全部楼层
weimas 发表于 2013-7-29 20:47
看了好几次这个帖子了,没明白干嘛用的,但我知道肯定是个好东西,求科普啊 ...

通常,为了让单片机执行C语言程序,我们是这样做的:
在电脑上运行编译器,将C语言程序编译成机器码(HEX文件),再通过烧写器烧写到单片机内。

现在,通过“解释器”,单片机可以直接运行C语言程序,省略了电脑和编译、烧写的过程 。
C语言程序可以存放于单片机内或外部的存储器中,也可以利用键盘来现场编写。

有了“解释器”,可以做出可编程的设备,供用户二次开发。

出0入0汤圆

发表于 2013-7-30 09:45:29 | 显示全部楼层
这个比较好玩啊~ 单片机 c语言解释器 很给力~mark

出0入0汤圆

发表于 2013-7-30 12:10:54 | 显示全部楼层
记录一下,我也写过一个类C脚本解释器,很有用的东西

出0入0汤圆

发表于 2013-7-30 12:43:21 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2013-7-30 20:22:06 | 显示全部楼层
很好很强大。先收藏着,等c语言功底再好点再研究。

出0入0汤圆

发表于 2014-2-9 12:07:30 | 显示全部楼层
mark,  good

出0入0汤圆

发表于 2014-5-17 17:07:17 | 显示全部楼层
没有用过,可以逆向编译吗?

出0入0汤圆

 楼主| 发表于 2014-5-17 17:50:00 | 显示全部楼层
fuze2009 发表于 2014-5-17 17:07
没有用过,可以逆向编译吗?

逆向编译是什么?

出0入4汤圆

发表于 2014-5-17 18:35:14 | 显示全部楼层
很好很强大。先收藏着

出0入0汤圆

发表于 2014-5-18 02:16:36 | 显示全部楼层
单片机讲究的是效率!
这种解释器,做个实验玩玩还是可以的
做项目的话,呵呵

出0入0汤圆

发表于 2020-5-27 14:13:23 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2020-5-27 22:07:59 | 显示全部楼层
好奇怎么知道结束源程序本来编辑有没有错误,是上位机先检查完,错误再把源代码发给下位机的吗

出0入0汤圆

发表于 2020-10-16 19:53:50 | 显示全部楼层
看了代码,想问个问题:解释时有做优先级处理吗?如:加减乘除运算

出0入0汤圆

发表于 2020-10-17 08:42:08 | 显示全部楼层
约定个被解释的C语言最小集语法,这个解释器再完善一下就可以实用了。希望楼主加油出新版本
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 17:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表