gcc语法解析如何解决dangling else的问题?

news2025/1/19 23:17:06

GCC上古版本(3.4)还有yacc,学习GCC如何实现if else 嵌套的问题。即:

问题

else后面的if到底是else if语义

if (xxx)
    a=1
else if (xxx) a=2

还是 else (语法块中的if else)。

if (xxx)
    a=1
else 
    if (xxx) a = 2 else a=2;

PostgreSQL的PLpgSQL中的if else

PostgreSQL中因为没有else if语法,只有elif,所以语法规则实现比较简单,没有dangling else的问题。

stmt_if			: K_IF expr_until_then proc_sect stmt_elsifs stmt_else K_END K_IF ';'
					{
						PLpgSQL_stmt_if *new;

						new = palloc0(sizeof(PLpgSQL_stmt_if));
						new->cmd_type	= PLPGSQL_STMT_IF;
						new->lineno		= plpgsql_location_to_lineno(@1);
						new->stmtid		= ++plpgsql_curr_compile->nstatements;
						new->cond		= $2;
						new->then_body	= $3;
						new->elsif_list = $4;
						new->else_body  = $5;

						$$ = (PLpgSQL_stmt *)new;
					}
				;

stmt_elsifs		:
					{
						$$ = NIL;
					}
				| stmt_elsifs K_ELSIF expr_until_then proc_sect
					{
						PLpgSQL_if_elsif *new;

						new = palloc0(sizeof(PLpgSQL_if_elsif));
						new->lineno = plpgsql_location_to_lineno(@2);
						new->cond   = $3;
						new->stmts  = $4;

						$$ = lappend($1, new);
					}
				;

stmt_else		:
					{
						$$ = NIL;
					}
				| K_ELSE proc_sect
					{
						$$ = $2;
					}
				;

GCC的解法

那么C语言中支持else if的语法:
c-parse


%token  IF ELSE

%nonassoc IF
%nonassoc ELSE

select_or_iter_stmt:
	  simple_if ELSE
		{ 
		    c_expand_start_else (); 
		    $<itype>1 = stmt_count; 
		}
	  c99_block_lineno_labeled_stmt
        { 
            c_finish_else ();
		    c_expand_end_cond ();
		    if (extra_warnings && stmt_count == $<itype>1)
		        warning ("empty body in an else-statement"); 
		 }
	| simple_if %prec IF
		{
		    c_expand_end_cond ();
		    if (extra_warnings && stmt_count++ == $<itype>1)
		        warning ("%Hempty body in an if-statement",&if_stmt_locus); 
		}
	| simple_if ELSE error
		{ c_expand_end_cond (); }

注意递归部分是simple_if:
在这里插入图片描述

  • c99_block_lineno_labeled_stmt代表语法块,可以包含if else。
  • 解决关键点:将simple_if非终结符的优先级降低到if,当出现else simple_if时,让simple_if去reduce。
  • 解决关键点:else的优先级比if要高,当else if出现时,发生shift/reduce冲突,根据优先级if会选择reduce。

《使用优先级解决shift/reduce冲突的经典例子(%prec UMINUS)》

在这里插入图片描述

手册中相关部分

https://www.gnu.org/software/bison/manual/bison.html#Shift_002fReduce

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/895838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Codeforces Round 881 Div.3

文章目录 贪心&#xff1a;A. Sasha and Array Coloring结论&#xff1a;B. Long Long性质&#xff1a;C. Sum in Binary Treedfs求叶子数量&#xff1a;D. Apple Tree二分与前缀和&#xff1a;E. Tracking Segments 贪心&#xff1a;A. Sasha and Array Coloring Problem - A…

作为10年的测试人员给学习软件测试的几点建议

下面几点给做测试的朋友参考一下&#xff1a; 1、钱肯定少过开发人员&#xff0c;除非你工作3&#xff0c;4年才能拿年薪10W以上。 2、加班的现象可以说是很普遍&#xff0c;周一到周五随时加班是很正常的&#xff0c;周末肯定有一天要加班。 3、不管怎么样努力和用什么测试效…

ROS局部路径规划器插件teb_local_planner流程梳理(上)

在我之前的文章《ROS导航包Navigation中的 Movebase节点路径规划相关流程梳理》中已经介绍过Move_base节点调用局部路径规划器插件的接口函数是computeVelocityCommands&#xff0c;接下来&#xff0c;我们就从这个函数入手梳理一下teb_local_planner功能包的工作流程。 ☆注&a…

Vue使用Element的表格Table显示树形数据,多选框全选无法选中全部节点

使用Element的组件Table表格&#xff0c;当使用树形数据再配合上多选框&#xff0c;如下&#xff1a; 会出现一种问题&#xff0c;点击左上方全选&#xff0c;只能够选中一级树节点&#xff0c;子节点无法被选中&#xff0c;如图所示&#xff1a; 想要实现点击全选就选中所有的…

强强联手:Eyeshot 2023.2 集成 CAD Exchanger SDK 3.21 Crack

Lab 中的新绘图模式和网格抽取、Eyeshot 集成以及从 CAD Exchanger 3.21.0 中的 CATIA 导入图形 PMI 通过探索新的绘图模式和可调整的网格抽取&#xff0c;更深入地了解实验室&#xff0c;见证与 devDept Eyeshot 的无缝集成&#xff0c;并直接从 CATIA 导入图形 PMI。 今年 8…

阿里云100元预算可选的云服务器配置2核2G3M带宽

阿里云服务器100元可以买到哪些配置&#xff1f;如果是一年时长&#xff0c;轻量应用服务器2核2G3M带宽一年108元&#xff0c;系统盘为50GB高效云盘。以前阿里云服务器ECS卖过35元一年、69元、88元、89元和99元的都有过&#xff0c;但是现在整体费用上涨&#xff0c;入门级云服…

超实用的40道JAVA经典算法题(含答案)

作为一名Java程序员&#xff0c;想要拿到一份满意的offer&#xff0c;就必须做好充足的准备。众所周知&#xff0c;算法可以说是大厂面试Java程序员的必问题。好的算法可以让性能得到万倍提升&#xff0c;做到毫秒级处理千万数据的程度。因此&#xff0c;算法的重要性不言而喻&…

【云原生,k8s】Helm应用包管理器介绍

目录 一、为什么需要Helm&#xff1f; &#xff08;一&#xff09;Helm介绍 &#xff08;二&#xff09;Helm有3个重要概念&#xff1a; &#xff08;三&#xff09;Helm特点 二、Helm V3变化 &#xff08;一&#xff09;架构变化 &#xff08;二&#xff09;自动创建名…

ICCV23 | Ada3D:利用动态推理挖掘3D感知任务中数据冗余性

​ 论文地址&#xff1a;https://arxiv.org/abs/2307.08209 项目主页&#xff1a;https://a-suozhang.xyz/ada3d.github.io/ 01. 背景与动因 3D检测(3D Detection)任务是自动驾驶任务中的重要任务。由于自动驾驶任务的安全性至关重要(safety-critic)&#xff0c;对感知算法的延…

CodeSite for .NET Crack

CodeSite for .NET Crack CodeSite for.NET与Visual Studio集成&#xff0c;通过实时查看器日志记录系统提供对代码执行的更深入了解&#xff0c;该系统有助于在本地或远程执行代码时快速查找问题。超越传统的断点调试&#xff0c;在应用程序继续运行时记录应用程序的执行&…

强训第34天

选择 A B D 由协议处理粘包问题 C C C host字段表示要访问的IP地址 Connection为Close&#xff0c;为短连接 A RTT报文往返时间&#xff0c;根据窗口大小和拥塞控制可以得知发了1 2 4 8 总共16个接收缓存并且没由进行数据提取&#xff0c;则剩余接收量为16-151&#xff0c;会经…

k8s简介、虚拟机快速搭建k8s集群、集群管理方式及K8S工作原理和组件介绍

文章目录 1、k8s简介1.1、部署方式的变迁1.2、定义1.3、Kubernetes提供的功能 2、虚拟机快速搭建k8s集群2.1、虚拟机配置&#xff08;centos7 2G内存2个处理器&#xff09;2.2、基础环境准备2.3、docker安装&#xff08;易踩坑&#xff09;2.4、安装k8s组件2.5、master节点部署…

Power BI 之 初相识

一、简介 传统数据分析工具入Excel等分析大数据量存在一些弊端&#xff0c;一是无法应对多数据源&#xff0c;二是数据量大容易卡死&#xff0c;三是无法根据数据源动态变化&#xff0c;导致每天重复分析数据&#xff0c;无法关注数据价值本身。 Power BI&#xff08;简写PBI…

隧道代理技术解析:为批量数据采集提供强大支持

嘿&#xff01;作为一名专业的爬虫程序员&#xff0c;我今天要和大家分享一个强大的技术&#xff0c;它能够为批量数据采集提供强大的支持——隧道代理技术。如果你在进行大规模数据采集任务时遇到了IP封禁和限制的问题&#xff0c;那么这项技术将是你的救星。废话不多说&#…

案例-基于MVC和三层架构实现商品表的增删改查

文章目录 0. 项目介绍1. 环境准备2. 查看所有2.1 编写BrandMapper接口2.2 编写服务类&#xff0c;创建BrandService&#xff0c;用于调用该方法2.5 编写Servlet2.4 编写brand.jsp页面2.5 测试 3.添加3.1 编写BrandMapper接口 添加方法3.2 编写服务3.3 改写Brand.jsp页面&#x…

【使用群晖远程链接drive挂载电脑硬盘】

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

用pytorch实现AlexNet

AlexNet经典网络由Alex Krizhevsky、Hinton等人在2012年提出&#xff0c;发表在NIPS&#xff0c;论文名为《ImageNet Classification with Deep Convolutional Neural Networks》&#xff0c;论文见&#xff1a;http://www.cs.toronto.edu/~hinton/absps/imagenet.pdf &#xf…

原型设计必备,10个简单好用的界面工具推荐

在数字产品和应用设计过程中,使用简单实用的界面原型设计工具至关重要。它可以将设计理念快速转换为交互原型,便于团队成员之间的沟通和协作。对设计新人来说,选择一个上手快速、功能强大的界面原型设计工具尤其关键。本文将推荐10款常用的界面原型设计工具,帮助初学者找到适合…

解决C/C++/QT url中含有特殊字符转码的问题

一、http请求链接中的特殊字符处理 解决包括Postman 中的post、get等链接请求中的特殊字符(如:*,#,{},[],^,%,(,?,!..等等)的情况 1、场景: 特殊字符存在,报400错误 2、原因 如果请求的参数带有一些特殊字符,如 +,%,=等,如果没有进行URL编码可能在发送请求的时候,后…

WinPlan经营大脑垂直大模型行业报告

一、引言 在当前高度信息化的时代,企业经营管理决策的重要性已经得到了广泛的认可。然而,在实际操作中,许多企业仍然在凭经验、拍脑袋进行经营决策,缺乏数据工具与专职分析团队,导致决策难、效率低等问题。针对这一问题,近年来,一种名为“WinPlan”的经营决策产品逐渐崭…