你如何解析悬空的 else ?

2023-12-24

我正在为 C 语言编写一个编译器,我只剩下一个问题需要解决:如何处理悬空的 else。原来的规则是这样的:

A --> if (表达式) 语句 | if (表达式) 语句 else 语句

摆脱左递归后:

A --> if(表达式) 语句 B

B --> else 语句 |空的

问题是“else”位于 B 的第一组和后续组中。我认为这对于这样的示例是有意义的:

if(x>y)
     if(x == 10)
          printf("x is 10.\n");
else
     printf("x<y");

第一个 if 后跟一个 else,第二个 if 后跟同样的 else,因此规则的应用方式存在歧义。我知道我需要将 else 与最接近的 open if 配对,但我不确定如何将其转换为解析器的代码。当我满足规则A时,我会打电话给B,但是然后呢?如果我看到“else”作为下一个标记,我是使用 B --> else 语句还是 B --> EMPTY?


解析器是贪婪的。也就是说,一条语句直到它结束时才结束must结尾。如果某件事可以被解析为当前最内层语句的延续,那么它就是。所以内在ifelse遇到的原因是它可能包含以下内容else,因此确实如此。

当解析器遇到else,它有两个选择——结束内部语句或不结束内部语句。这样的选择总是有利于使声明尽可能大。因此就有了“贪婪”一词。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

你如何解析悬空的 else ? 的相关文章

  • 使用 C++ 拆分“[常规设置]”格式的节字符串

    我是 C 新手 我想读取包含部分和键值对的 ini 文件 根据部分 我想读取相应键的值 首先 我想阅读方括号内的部分 请帮忙 谢谢 对于真正的 INI 文件解析 我强烈建议iniparser库 http ndevilla free fr i
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 操作/Lambda 表达式内存管理问题

    我将一个操作存储在局部变量中 然后在该局部变量超出范围后使用 使用前是否有被清理的危险 这是一个例子 public List GetMaps Action
  • 无缝滚动瓷砖地图

    我正在开发一个自上而下的角色扮演游戏 并且想要实现无缝滚动地图 也就是说 当玩家探索世界时 地图之间没有加载屏幕 也没有通往下一个区域的 门 我有两种方法可以打破世界 在顶层 我有 区域 它只是 9 个 地图 的集合 这些区域仅由目录表示
  • StreamReader,C#,peek

    我有一个 StreamReader 它偶尔会检查它是否有更多内容可以从简单的文本文件中读取 它使用 peek 属性 问题是 当我使用 peek 时 位置发生了变化 尽管不应该发生 FileStream m fsReader new File
  • 在 C++ 中使用表达式模板进行符号微分

    如何在 C 中使用表达式模板实现符号微分 一般来说 您需要一种表示符号的方法 即编码的表达式模板 例如3 x x 42 以及一个可以计算导数的元函数 希望您对 C 中的元编程足够熟悉 知道这意味着什么和需要什么 但可以给您一个想法 This
  • WinForms - 表单大小错误

    我们有以下代码 private void MainForm Shown object sender EventArgs e RepositionForm private void RepositionForm Rectangle rect
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • 命名空间“Microsoft”中不存在类型或命名空间名称“Practices”

    我正在使用 Microsoft Visual Studio 2005 for c 我的代码中有以下命名空间 using Microsoft Practices EnterpriseLibrary using Microsoft Practi
  • 如何强制用户仅使用“new”创建从我派生的类的对象?

    为了实现引用计数 我们使用IUnknown http msdn microsoft com en us library ms680509 VS 85 aspx类接口和智能指针模板类 该接口具有所有引用计数方法的实现 包括Release vo
  • 数组与映射的性能

    我必须循环一个大数组中的元素子集 其中每个元素都指向另一个元素 问题来自于检测大图中的连接组件 我的算法如下 1 考虑第一个元素 2 将下一个元素视为前一个元素所指向的元素 3 循环直到没有发现新元素 4 考虑1 3中尚未考虑的下一个元素
  • TreeView:仅在子节点中存在复选框

    我需要一个树视图控件 根节点没有复选框 只有图像 所有子节点都有一个复选框 图像 C net 2 0 winforms 不是 wpf WinForms树视图默认不支持混合复选框 非复选框节点 您可以在树视图上全局启用复选框 并使用以下命令在
  • 非静态类中的静态方法和静态类中的静态方法有什么区别?

    我有两个班级A级和B级 static class ClassA static string SomeMethod return I am a Static Method class ClassB static string SomeMeth
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • 修改代码以从 Windows 中的 PE 可执行文件检索双重签名信息?

    我已经挣扎了一段时间想要修改这段代码示例 https support microsoft com en us help 323809 how to get information from authenticode signed execu
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所
  • 如何在用户空间程序中使用内核 libcrc32c (或相同的函数)?

    我想在我自己的用户空间程序中进行一些 CRC 检查 我发现内核加密库已经在系统中 并且支持 SSE4 2 我尝试直接 include

随机推荐

  • Windsor MixIn 是单例吗?

    我有一个 MixIn 需要某种状态才能运行 我正在这样注册 container Register Component For Of ICat ImplementedBy Of Cat LifeStyle Transient Proxy Mi
  • java有“Linked ConcurrentHashMap”数据结构吗?

    我需要一个 LinkedHashMap 并且线程安全的数据结构 我怎样才能做到这一点 您可以将映射包装在 Collections synchronizedMap 中以获取维护插入顺序的同步哈希映射 这不像 ConcurrentHashMap
  • 使用正则表达式过滤对象数组

    我有一个这样的数据数组 const data Date 2018010101 color blue Date 2018010102 color blue Date 2018010103 color red Date 2018010104 c
  • Angular - 类型“string”不可分配给类型“boolean”

    角度 4 3 1角度 CLI 1 2 3打字稿 2 3 4 组件打字稿文件 public saveName string public overwrite boolean 以下标记失败并显示类型 string 不可分配给类型 boolean
  • 向 JNA 类 Java (Kernel32) 添加另一个方法

    我试图使用 WIN32 dll 中的方法 未包含在 JNA 中 方法是获取产品信息 我在单独的项目和工作中尝试这个 public interface Kernel32 extends Library public boolean GetPr
  • SQL Server DACPAC 部署删除用户/角色/权限

    我正在使用 DACPAC 部署 Azure SQL Server 数据库 每次我部署时 它都会删除我的用户 角色和权限 即使我在我正在使用的发布配置文件中明确告诉它不要这样做 发布配置文件定义为
  • Amazon S3 WebDAV 访问

    我想在不使用第三方软件的情况下访问我的 Amazon S3 存储桶 而只需通过大多数操作系统中提供的 WebDAV 功能即可 有没有办法做到这一点 对我来说重要的是不需要第三方软件 有多种方法可以做到这一点 不知道你的情况如何 所以这里是
  • 在 TypeScript 中使用元组(类型推断)

    给出这个稍微人为的例子 List Of Names map name index gt name index 2 map name num gt 为什么 name 和 num 位于 type 的最后一行string number显然推断为字
  • 我可以在不安装 Visual Studio 的情况下使用 mstest.exe 吗?

    我想使用 mstest exe 在生成服务器上运行单元测试 但我不想在生成服务器上安装 Visual Studio 我可以只安装 MSTest 而不使用 Visual Studio 吗 无需 Visual Studio 即可运行 mstes
  • PHP:将文档/文本解析为句子

    我正在寻找类似的 PHP 版本 http journals ecs soton ac uk java tutorial intl collat ion textBound html http journals ecs soton ac uk
  • vim:执行编辑器命令列表

    vim 有没有办法给出编辑器命令列表 我想执行一系列 全局 命令 并且这些命令有一些模式 因此 我理想地希望生成命令列表 使用正则表达式搜索和替换 然后运行它们 而不必键入每个命令 谢谢 高拉夫 更新 s buffer register g
  • 是否可以在 Mountain Lion 上当前的 Xcode 4.6.1 工具链中启用 _LIBCPP_DEBUG2?

    这个线程 http comments gmane org gmane comp compilers clang devel 16838是对 clang 的 libc 调试模式的早期讨论 该模式通过定义来启用 LIBCPP DEBUG2在编译
  • 在 R 中添加新行

    我需要在后面添加一个新行 我的数据如下所示 1 60112 486 100 xxx BS 1 1 486 100 yyy TE I need 1 60112 486 100 xxx BS 1 1 486 100 yyy TE 我怎样才能实现
  • 无法达到最佳性能

    我正在努力达到每个人的最佳表现SM从下面的代码 峰值位于 25 GFlops GTX275 GT200 Arch 之间 此代码最多提供 8 GFlops global void new ker float x int index threa
  • 适用于 GAE 的 Python 无头浏览器

    我正在尝试将 Angular js 客户端与 Google Appengine 上的 webapp2 一起使用 为了解决 SEO 问题 我们的想法是使用无头浏览器在服务器端运行 javascript 并将生成的 html 提供给爬虫 有没有
  • 如何覆盖 Nixos configuration.nix 中的 2(两个)包

    我的configuration nix 中有一些需要覆盖的包 所以我写的代码如下 nixpkgs config allowUnfree true packageOverrides pkgs rec mumble pulse audio mu
  • 在 JavaScript 中获取字体规格?

    我目前正在开发一个使用 HTML5 画布作为渲染目标的 JavaScript 项目 为了使我的代码能够很好地与我提供的 严格指定的 接口配合使用 我需要能够获取一种字体并提取该字体的上升和下降高度 这将使客户能够更准确地定位文本 我知道我可
  • 如何去掉多余的双引号?

    在格式错误的 csv 文件中 有一行数据带有额外的双引号 例如最后一行 Name Comment Peter Nice singer Paul Love folk songs 如何删除周围的双引号folk并将字符串替换为 Name Comm
  • 在 3NF 中找到关系,但在 BCNF 中找不到关系

    我一直在阅读许多不同的资料来了解如何区分 3NF BCNF 中的关系 到目前为止 这是我的理解 我将使用这种关系作为例子 R A B C D E and F A gt B B C gt E E D gt A 首先我们必须找到关系的关键 我用
  • 你如何解析悬空的 else ?

    我正在为 C 语言编写一个编译器 我只剩下一个问题需要解决 如何处理悬空的 else 原来的规则是这样的 A gt if 表达式 语句 if 表达式 语句 else 语句 摆脱左递归后 A gt if 表达式 语句 B B gt else