词法分析中的“贪心法”

news/2025/2/12 1:03:02/

词法分析中的“贪心法”

  • 陷进问题引入
  • 贪心法的解释
  • 一个小题目

陷进问题引入

#include <stdio.h>
int main()
{int a = 1;int b = 2;int* c = &b;printf("%d", a/*c);return 0;
}
  • 问: 上面代码输出什么?
      有人说是0, 也有人说程序出错,说0的是想着a除(c), 说程序出错的是因为将 / 看做注释符号,因此程序出错。也就是当出现/这种多字符符号时,编译器是将其当成单字符‘ / ’ 和“ * ”两个字符,还是当成‘ / ’多字符。那如此有争议性的问题,是否有一个规则来解决其中的二义性呢?
      这就是词法分析的贪心法,口语化也可以说作“大嘴法”。

贪心法的解释

  编译器分辨符号的方法是:从左到右一个字符一个字符的读入如果这个字符可能组成一个符号,那么再读入下一个字符,判断已经读入的字符组成的字符串是否可能组成一个符号,如果可能,继续读入下一个字符,重复上述判断,直到读入的字符已经不再可能组成一个有意义的符号,才停止判断。

  需要注意的是,除了字符串与字符常量,符号的中间不能有空白(空格符,制表符和换行符)。例如:
a---ba -- - b的含义相同。
a---ba - -- b的含义不相同。


所以,a/*c 会出现程序报错的情况,因为当出现 /* 后,后面一直没有接受到注释结束符号 */ 。

一个小题目

请问 a+++++b 的含义是什么?
按照贪心法的解释来推断,得到 ((a++)++) + b。那么放到编译器里是什么样的呢?

#include <stdio.h>
int main()
{int a = 1;int b = 2;printf("%d", a+++++b);return 0;
}

运行后如下:
在这里插入图片描述
原因是(a++)的结果不能作为自增++的操作数,因此报错。


  😄 创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看😄


http://www.ppmy.cn/news/1125980.html

相关文章

Linux编译链接选项静态库--whole-archive,--no-whole-archive

文章目录 背景定位思路静态库链接选项参考 背景 在使用cmake构建工程时&#xff0c;目标可执行程序可以正常构建&#xff0c;但是运行不符合预期。可执行程序依赖libtool.a静态库&#xff0c;静态库有个全局map&#xff0c;map中存放注册的回调函数。在可执行程序运行时发现ma…

基于微信小程序的电影院订票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&…

Linux离线安装telnet

TELNET rmp地址 链接: https://pan.baidu.com/s/1Yl3zt1p3zjp2fYTwByf7dQ?pwdgdcg 提取码: gdcg 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 命令 rpm -ivh xinetd-2.3.15-14.el7.x86_64.rpm rpm -ivh telnet-0.17-65.el7_8.x86_64.rpm rpm -ivh telnet-…

Django — 类视图和中间件

目录 一、类视图1、基于类的结构2、常见的类视图基类3、类视图的优点4、代码案例 二、中间件1、定义2、工作原理3、自带中间件4、中间件开发流程5、自定义中间件6、案例 一、类视图 类视图&#xff08;Class-Based Views&#xff09;是 Django 中用于处理 HTTP 请求和生成 HTT…

微信小程序通过官方内置函数实现WebSocket

目前微信小程序做WebSocket并不需要第三方依赖 官方有提供wx.connectSocket方法来实现建立链接的方式 参考代码如下 // 在页面的逻辑代码中调用 wx.connectSocket 连接 WebSocket wx.connectSocket({url: wss://example.com/socket, // WebSocket 服务器的地址success: funct…

计算机网络相关知识点(二)

TCP如何保证传输过程的可靠性&#xff1f; 校验和&#xff1a;发送方在发送数据之前计算校验和&#xff0c;接收方收到数据之后同样需要计算&#xff0c;如果不一致&#xff0c;那么代表传输有问题。 确认应答序&#xff0c;序列号&#xff1a;TCP进行传输时数据都进行了编号…

深入理解C语言(1):数据在内存中的存储

文章主题&#xff1a;数据在内存中的存储&#x1f30f;所属专栏&#xff1a;深入理解C语言&#x1f4d4;作者简介&#xff1a;更新有关深入理解C语言知识的博主一枚&#xff0c;记录分享自己对C语言的深入解读。&#x1f606;个人主页&#xff1a;[₽]的个人主页&#x1f3c4;&…

Mybatis 日志(Log4j2)

之前我们介绍了使用JDK Log、Apache Commons Logging打印Mybatis运行时的日志&#xff1b;本篇我们介绍使用Log4j2打印Mybatis运行时的日志。 如何您对Mybatis中使用JDK Log、Apache Commons Logging打印Mybatis运行时的日志不太了解&#xff0c;可以参考&#xff1a; Mybati…