词法分析中的“贪心法”

简介: 词法分析中的“贪心法”


陷进问题引入

#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++)的结果不能作为自增++的操作数,因此报错。


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

相关文章
【编译原理】语法分析:从顶向下、最左推导
【编译原理】语法分析:从顶向下、最左推导
|
9月前
|
算法
基础算法(贪心 合并 位运算)
基础算法(贪心 合并 位运算)
46 0
|
10月前
|
机器学习/深度学习 Go C语言
921. 使括号有效的最少添加:简单贪心思想
这是 力扣上的 921. 使括号有效的最少添加,难度为 中等。
|
10月前
|
算法 搜索推荐 编译器
字符串算法
字符串算法是指用于处理字符串的算法。在计算机科学和软件开发中,字符串算法是非常重要的,它们被广泛应用于文本编辑、搜索引擎、编译器、数据库系统等各个领域。以下是一些常见的字符串算法及其实现方法和示例代码:
73 1
|
11月前
|
机器学习/深度学习 算法 Python
Python实现回溯算法求解括号生成
Python实现回溯算法求解括号生成
41 0
|
算法
基础算法练习200题08、百鸡问题(循环+逻辑判断+穷举)
基础算法练习200题08、百鸡问题(循环+逻辑判断+穷举)
91 0
基础算法练习200题08、百鸡问题(循环+逻辑判断+穷举)
|
算法
【算法设计与分析】动态规划法与分治法、贪心法的区别
【算法设计与分析】动态规划法与分治法、贪心法的区别
177 0
再学一道算法题: 二分法求多项式单根
再学一道算法题: 二分法求多项式单根
再学一道算法题: 二分法求多项式单根
|
算法 索引
白话版 动态规划法
关于动态规划法的解释, 大多都是基于背包问题的, 但背包问题背负了很多算法的解释工作,经常让初学者混淆,刚刚刷leetcode的时候,发现了一个很不错的关于动态规划算法的例题,特来分享一下! Leetcode120 这是一个典型的动态规划问题: 在走第N步的之前, 第1步到第N-1步已经达到了最优.
934 0