网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
04月19日
漏签
0
天
easyx吧
关注:
10,878
贴子:
46,618
看贴
图片
吧主推荐
游戏
7
回复贴,共
1
页
<<返回easyx吧
>0< 加载中...
C语言的解析(编译器原理)
取消只看楼主
收藏
回复
guohechaiqiao9
五年级
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
本人高二学生,最近心血来潮,研究了C语言代码的解释执行。想和各位大神交流下心得。如有谬误,还请指正。
guohechaiqiao9
五年级
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
首先我讲下我对C语言语句的思考。
我认为C语言所有的语句,归根结底都是表达式。
a+b是一个表达式, max(a,b)是一个表达式,a=b+3是一个表达式,a>5也是一个表达式。
什么是表达式呢,就是用运算符连接起来的,运算得到一个结果的式子。
guohechaiqiao9
五年级
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
运算符是表达式的核心组成部分。在一个表达式中,运算符有优先级的区别。
举一个例子 算算式 10+20*30,我们是先算20*30,再把这个结果和10相加。
优先级高的运算符,我们先算。
这个经验,其实就告诉了我们处理表达式的方法。我们每次只处理优先级最低的运算符,
然后把另外的部分处理好后合并起来,这是一种分治的想法,通过递归实现。
比如算式 (10+20*30)*40中,我们先处理括号外面的乘号,于是递归求(10+20*30)的值
和40的值,最后乘起来就好了。
guohechaiqiao9
五年级
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
有哪些运算符,又分几个优先级呢?
不考虑位运算,?:等偏语法糖的运算符,我把C语言的运算符大概分这么几类。
1.算术运算符 + - * / % (加,减,乘,除,取模)
2.逻辑运算符 && || !(与,或,非)
3.比较大小运算符 < <= > >= != ==
4.赋值运算符 =
优先级是这么排的(由低到高)
=
||
&&
== !=
< <= > >=
+ -
* / %
!
guohechaiqiao9
五年级
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
上一楼我列的运算符,从另一个角度看,其实可以只分成2类。
无论是逻辑运算符还是比较大小的运算符,返回布尔值真假。
如果把它们的返回值理解成0 1,他们只是特殊的算术运算符。
只有赋值运算符,它的性质明显与算术运算符不同。
赋值运算符的右侧参数是一个数值,而左侧则是地址,效果是将右侧值写入左侧,
返回值是右侧的值。
算术运算符的参数,全部都是数值,效果只有返回运算结果。
综上所述,所有算术运算符的解析,都是大同小异的 ,而赋值运算符需要特殊处理。
guohechaiqiao9
五年级
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
表达式另一个组成部分是数值。表达式中的数值,有些是变量,有些是常量。
变量的管理,会给我们实现时造成一些困扰。
因为一个变量写在代码里虽然处处一样,但意思大不相同。
举个例子
int a=100;
a=a-5;
a=a-5这个表达式形式很简单,但大有玄机,左侧的a表示的是变量a的地址,右侧的a表示的是变量a的值。如何实现变量的存储管理与维护,其实有一定难度。
guohechaiqiao9
五年级
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
如果要实现一个完整的编译器,要考虑的问题非常之多,
比如不同类型变量之间的类型转换等。
表达式中还有很多常量,将它们和变量分开处理的话,麻烦而容易出错。
我简述一下我如何实现变量的。
变量是一个结构体,有一个值成员和一个类型成员。
用一个stl map把变量名字和变量对应起来。
常量也用变量的形式保存,不过用类型来区分常量或者变量。
常量的值就是值,变量的值是保存数值的地址。
变量当算术运算的参数时,先转换成常量再参加运算。
变量作为赋值运算的左边时,采用地址模式,将右侧表达式计算出数值后写入左侧,
返回右侧的数值。
guohechaiqiao9
五年级
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这是我自己编写的解释器的代码,能解释执行阉割版c语言脚本。
https://pan.baidu.com/s/1pLOEocz
编译cpp后请输入脚本的名字执行,input.csp为参考。
有建议还请不吝指教。
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示