网页资讯贴吧知道视频音乐图片地图文库
进入贴吧全吧搜索吧内搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
02月22日漏签0天
easyx吧 关注:9,014贴子:43,176
  • 看贴

  • 图片

  • 精品

  • 游戏

  • 16回复贴,共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为参考。
有建议还请不吝指教。


  • KrissiZH
  • 小吧主
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • aupaup123
  • 托儿所
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可以的,小伙子


  • 阿里嘎多丶丶丶
  • 托儿所
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主用的什么编译器


  • Yan18685836681
  • 托儿所
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
所有语言的编译器好像都是要把代码转成汇编指令然后再转成机器指令,撸主可以去看看汇编基础。


  • 柠檬加醋
  • 二年级
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看汇编之前 先去看看编译原理


  • 柠檬加醋
  • 二年级
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
从词法分析 语法分析 语意分析与中间代码生成 优化 到最终目标代码生成 这里面还是很复杂的


登录百度帐号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 16回复贴,共1页
<<返回easyx吧
分享到:
©2019 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示