改革语法以删除移位,减少 if-then-else 中的冲突

2023-12-01

如何消除给定语法的 bison 的移位归约冲突?

 selection-stmt -> if ( expression ) statement |
                      if ( expression ) statement else statement

提供修改后的语法的解决方案将受到高度赞赏。


有一个更简单的解决方案。如果你知道 LR 解析器是如何工作的,那么你就知道冲突发生在这里:

if ( expression ) statement * else statement

其中星号标记光标的当前位置。解析器必须回答的问题是“我应该移动,还是应该减少”。通常,您想要绑定else到最近的if,这意味着您想要移动else现在令牌。现在减少意味着您想要else等待与“长辈”绑定if.

现在你想“告诉”你的解析器生成器“当令牌之间存在移位/归约冲突时"else"以及规则“stm -> if ( exp ) stm”,则令牌必须获胜”。为此,请为规则的优先级“命名”(例如,"then"),并指定"then"优先级低于"else"。就像是:

// Precedences go increasing, so "then" < "else".
%nonassoc "then"
%nonassoc "else"
%%
stm: "if" "(" exp ")" stm            %prec "then"
   | "if" "(" exp ")" stm "else" stm

使用 Bison 语法。

我对此感到不安%nonassoc在这里,因为它确实这么说"then" and "else"是非结合性的,这在大多数语法中都是如此,但我只是想给它们优先级,而不是结合性。野牛提供%precedence为此:

// Precedences go increasing, so "then" < "else".
%precedence "then"
%precedence "else"
%%
stm: "if" "(" exp ")" stm            %prec "then"
   | "if" "(" exp ")" stm "else" stm

事实上,我最喜欢的答案甚至是给出"then" and "else"相同的优先级。当优先级相等时,为了打破想要移动的标记和想要减少的规则之间的联系,Bison/Yacc 将考虑关联性。在这里,您想要促进右结合性(更准确地说,您想要促进“移位”),所以:

%right "then" "else" // Same precedence, but "shift" wins.

就足够了。

根据野牛手册 (3.8.1),“但这两种解决方案都不是完美的。”

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

改革语法以删除移位,减少 if-then-else 中的冲突 的相关文章

  • 简易编译器实现(二)使用Bison创建语法分析器

    你也可以通过我的独立博客 www huliujia com 获取本篇文章 简易编译器实现 一 使用Flex创建词法分析器一文介绍了编译器的概念和七个阶段 并说明了如何使用Flex创建词法分析器 本篇文章介绍如何使用Bison创建语法分析器
  • 使用 Flex/Bison 的解释器 REPL

    我已经为类 C 语言编写了一个解释器 使用 Flex 和 Bison 作为扫描器 解析器 执行完整的程序文件时它工作正常 现在我正在尝试在解释器中实现 REPL 以供交互式使用 我希望它像 Ruby 或 ML 中的命令行解释器一样工作 显示
  • 如何为 flex 和 bison 编写工作 cmake 文件?

    我正在编写一个小型解析器 但在使用 cmake 时遇到问题 我的目的是 flex F l gt F cc bison B y gt B cc my program cc F cc B cc gt 库 我的第一次尝试 FIND PACKAGE
  • 与包含 Flex 和 Bison 的项目链接 LLVM 时遇到问题

    我一直在学习使用 Flex Bison 和 LLVM 编写编译器的教程 http gnuu org 2009 09 18 writing your own toy compiler 并尝试编译最终的二进制文件失败 并出现许多以下 未定义的引
  • Flex 换行扫描野牛

    我想使用相同的 flex bison 扫描仪 解析器作为解释器并加载要解释的文件 在这两种情况下我都无法让换行符解析正常工作 解释器 有一个提示 我可以输入按 ENTER 终止的命令 文件 这是一个示例输入文件 切 begin print
  • Bison 减少/减少与强制转换和表达式括号的冲突

    我正在野牛中构建语法 并且我已将最后一个减少 减少错误的范围缩小到以下测试用例 include
  • YAML 解析 - lex 还是手工?

    我正在尝试编写一个简单的 YAML 解析器 我从 yaml org 阅读了规范 在开始之前 我想知道是否编写一个手卷解析器更好 或者 使用lex flex bison 我看了看libyaml C 库 好像没用lex yacc YAML 不包
  • bison/flex 中的简单 XML 解析器

    我想创建简单的 xml 解析器使用野牛 弯曲 我不需要验证 评论 争论 只需要
  • 需要帮助确定“默认操作类型冲突”的原因

    我一直在做一项学校作业 但很难弄清楚哪个问题导致了 默认操作类型冲突 下面的多个警告 任何帮助将不胜感激 收到的警告 parser y 62 9 23 warning type clash on default action
  • 对“yylex”的未定义引用

    我正在尝试使用 flex 和 bison 解析一个输入文件 但在编译程序时遇到一个困难 我附上了我的 Flex 和 Bison 代码以及我收到的错误 请帮我解决这些错误 lex l include
  • 在 Bison 中为 && 和 || 启动短路规则运营

    我正在使用 C C 在 Bison 和 Flex 中编写一个简单的计算器 逻辑在 Bison 中完成 C C 部分负责数据结构 例如 STL 等 我有以下问题 在我的计算器中美元符号 表示 i 和 i 前缀和后缀 例如 int y 3 gt
  • 为什么 %prec 在此 bison 语法中不起作用?

    考虑以下 Bison 语法 这是从我正在研究的一个更大的语法中剥离出来的 token ident left left CALLPREC start add expr ident call add call expr prec CALLPRE
  • 编写编译器……什么是对的,什么是错的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 野牛规格和优先顺序

    给定 Bison 规范 right TOK ADD TOK MUL 我想知道 TOK ADD 和 TOK MUL 的优先顺序是什么 另外如果我有野牛规格 left TOKMUL TOKADD left TOKDIV left TOKSUB
  • Flex/Bison IDE? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个良好的开发环境 可以在 Flex 或 Bison 或两者上工作 是否有任何 IDE 具有
  • Flex 和 Bison 彼此需要什么?

    当 Flex 和 Bison 一起使用时 为什么 Flex 文件需要 includebison 创建的 C 头文件 编译需要 bison 和 flex 创建的 C 源文件 bison 和 flex 创建的 C 源文件相互需要什么 bison
  • 如何将 C++ flex 与 C++ Bison 连接起来?

    我正在尝试将 C flex 与 C bison 连接起来 但我被难住了 Bison 3 8 1 手册有一个带有 C Flex 的 C Bison 示例 Flex 2 6 4 没有示例 我试图解决的问题是如何向 C 或 C Bison 提供指
  • 无法弄清楚为什么 Bison 抛出“由于冲突,规则在解析器中无用”

    我正在为一种非常简单的编程语言编写 BNF 语法 并使用 Flex 和 Bison 进行编译 我只有 3 种变量和常量类型 实数 整数 字符串 我的 l 文件具有 ID 的标记定义 如下所示 DIGIT 0 9 LETTER a zA Z
  • Flex Bison Scanner解析的单元测试,如何驱动测试用例

    我有一个关于如何在单元测试中 驱动 基于 Flex Bison 的解析器扫描仪的问题 最终的解决方案将是可用的命令解析器或远程登录到目标板 我有一个使用标准输入的完全工作的 Flex Bison 实现 现在我的重点是为命令解析器运行单元测试
  • Bison:奇怪的转变-减少冲突

    我尝试在自定义语法中实现函数调用 加上类似的数组访问运算符 expression OTHER EXPRESSION RULES expression PARENTHESIS OPEN expressions PARENTHESIS CLOS

随机推荐