LCC编译器的源程序分析(24)条件表达式
编译器 分析 条件 表达式 24 源程序 LCC
2023-09-14 09:10:39 时间
C语言里条件表达式语句如下:
表达式1 ?表达式2 :表达式3
条件运算符要求有三个操作对象,称为三元运算符,它是C语言中唯一的一个三目运算符。比如计算两个值的最大值,就可以写成下面这样:
int nMax = a > b ? a:b;
下面就来看LCC是怎么样处理条件表达式的,它的代码如下:
#001 static Tree expr2(void)
#002 {
#003
Tree p = expr3(4);
#004
第3行里是先处理表达式1(a > b),它是调用expr3函数来实现的,然后返回表达式树p。
#005
if (t == '?')
#006
{
#007
Tree l, r;
#008
Coordinate pts[2];
#009
if (Aflag > 1 && isfunc(p->type))
#010
warning("%s used in a conditional expression/n",
#011
funcname(p));
#012
#013
p = pointer(p);
#014
t = gettok();
#015
pts[0] = src;
#016
l = pointer(expr(':'));
#017
pts[1] = src;
#018
r = pointer(expr2());
#019
#020
if (generic(p->op) != CNST && events.points)
#021
{
#022
apply(events.points, &pts[0], &l);
#023
apply(events.points, &pts[1], &r);
#024
}
#025
#026
p = condtree(p, l, r);
#027
}
#028
#029
return p;
#030 }
第5行是判断这个表达式是否条件表达式。
第16行是递归调用expr函数来处理表达式2(a:),然后返回左子树l。
第18行是递归调用expr2处理表达式3(b),然后返回右子树r。
第26行是构造条件树节点。
通过上面短短
30
行程序就可以处理条件表达式了。
相关文章
- RVDS编译器
- 华为方舟编译器开源官网正式上线
- GCC编译器使用
- atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结
- 最小的js编译器
- 如何写一个简单的编译器?
- 编译器神vim改头换面
- 基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#)
- LCC编译器的源程序分析(69)全局变量的初始化
- LCC编译器的源程序分析(26)逗号表达式
- LCC编译器的源程序分析(30)while循环语句
- LCC编译器的源程序分析(11)声明与符号表
- LCC编译器的源程序分析(9)声明分析
- LCC编译器的源程序分析(55)最终代码的生成
- LCC编译器的源程序分析(52)寄存器溢出
- LCC编译器的源程序分析(57)不同目标代码生成的接口结构
- LCC编译器的源程序分析(3)选择不同的目标代码接口
- LCC编译器的源程序分析(1)C编译器的目标
- 动态初始化和用户定义分区的新编译器警告
- 支持DevOps和功能安全/信息安全的静态代码分析器 Klocwork——Klocwork的主要功能特性:提供⽹⻚端集中式分析与管理平台;⽀持的IDE;⽀持的编译器;⽀持的操作系统| 资质认证