如何使用 Bison 实现“隐式乘法”规则?

2023-12-11

我正在为数学表达式解析器编写 Bison 文件。到目前为止,一切都很好,但我面临着隐式乘法的问题。

你看,我想支持这样的表达2x sin(4x) cos(4x)。它应该像这样解析2 * x * sin(4 * x) * cos(4 * x)。这里没什么太糟糕的,但请考虑以下一组规则:

expr
    : /* snip */
    | '-' expr      { /* negate expression */ }
    | expr '-' expr { /* subtract expressions */ }
    | expr expr     { /* multiply expressions */ }

隐含的乘法规则会导致减法规则产生歧义:是x - log(x)的减法log(x) to x或乘以x by -log(x)?

我准备好接受一个简单的解决方案,比如“这是一个乘法,除非它是减法”,但我不知道如何告诉 Bison。


隐式乘法规则会导致减法规则产生歧义:x - log(x) 是 log(x) 与 x 的减法还是 x 与 -log(x) 的乘法?

甚至,是吗x - l * o * g * x?或者也许只是x - log * x?

所以这不是一个简单的问题。假设你只要看一眼就能知道log它是一个函数。然后,您可以在词法分析器中消除歧义,然后您会看到“如果有疑问,看起来像中缀运算符的运算符就是中缀运算符”。这是一个快速解决方案:

term   : ID
       | NUMBER
       | '(' expr ')'      { $$ = $2; }
       | FUNC '(' expr ')' { $$ = new_expr($1, 'c', $3); }
       ;

factor : term
       | term factor       { $$ = new_expr($1, '*', $2); }
       ;

prefix : factor
       | '-' factor        { $$ = new_expr(0, '-', $2); }
       ;

muldiv : prefix
       | muldiv '/' prefix { $$ = new_expr($1, '/', $3); }
       | muldiv '*' prefix { $$ = new_expr($1, '*', $3); }
       ;

expr   : muldiv
       | expr '+' muldiv { $$ = new_expr($1, '+', $3); }
       | expr '-' muldiv { $$ = new_expr($1, '-', $3); }
       ;

这个特定的语法不允许 --x,尽管它非常满意 y--x,这意味着 y-(-x)。如果你想接受--x,你可以改变第二个prefix生产至'-' prefix.

就我个人而言,我更希望能够输入sin 2x and log 3n但这开始变得有点棘手。什么是sin 2x cos 2x意思是?大概意思就是(sin(2*x))*(cos(2*x))。但确实log nlog n并不意味着log(n*log(n))?这一切都可以实现;它只需要考虑所有的可能性。

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

如何使用 Bison 实现“隐式乘法”规则? 的相关文章

  • flex&bison编写语法分析器

    使用flex和bison 对c语言代码块进行词法分析 识别词法错误 按照c 语法规则进行文法分析 并形成c语言代码块的语法树 syntax tree 并将语法树按照特定的格式打印出来 如何编译 两种方法 1 使用make命令 先将要执行的所
  • 编译原理_计算器_flex、bison实现(详细辅助理解)

    编译原理 计算器 flex bison实现 详细辅助理解 个人博客 https www yuque com ngp blog tuanh6 https www yuque com ngp blog tuanh6 P S 这篇文章只能助你理解
  • GCC 在 bison 生成的头文件中显示“数字常量之前的语法错误”

    当我使用 bison parser y d t 编译 y 文件 然后将 parser tab h 文件包含在我的 Flex 文件中时 gcc 说 错误 数字常量之前有语法错误 它引用第 32 行 这是 yytokentype 枚举中的第一行
  • 如何在 Flex/bison 中实现 If 语句

    我没有收到错误消息 请您帮帮我 这是 l 和 y 文件 谢谢 include ifanw tab h extern int yylval return EQ return NE lt return LT lt return LE gt re
  • 使用 Flex/Bison 的解释器 REPL

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

    与任何解释相比 我真的更喜欢一个工作示例 到目前为止 我在 Bison 文档网站上读到的内容与 Flex 所说的内容相矛盾 一说要申报yylex as int yylex yyscan t yyscanner 另一位希望它是 int yyl
  • 如何为 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 换行扫描野牛

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

    我试图用 flex 和 bison 制作一个计算器 但在编译过程中发现了一个错误 这是错误 C GnuWin32 src gt gcc lex yy c y tab c o tugas tugas y 51 error conflictin
  • bison/flex 中的简单 XML 解析器

    我想创建简单的 xml 解析器使用野牛 弯曲 我不需要验证 评论 争论 只需要
  • 将 Flex/Bison 与外部程序集成

    我正在开发一个智能代理模型 该模型需要事件列表作为输入 这些事件来自另一个模型的输出 位于 大 文本文件中 文本文件是所有事件的列表 包括我不关心的不必要事件 因此我使用 flex 编写了一个扫描器 可以找到有用的位 智能代理模型的框架已经
  • 我的 Flex 文件输出错误

    我编写了一个 l 文件并希望输出 c17 isc 中的内容 但有一个错误我不知道为什么 我已经给出了我打算读取的文件 flex文件和执行结果 这是 c17 isc 文件 内容的意思是 number gate name gate type o
  • 使用 qt:如何在控制台应用程序之上构建 GUI?

    我有一个从 bison 解析器 生成的控制台应用程序 我想为其构建一个简单的 GUI 这样我就可以将此 gui 的输入发送到控制台 并将控制台的输出获取到 gui 中 我尝试使用 java process 类来做到这一点 但它对我不起作用
  • 向 bison/jison 计算器语言添加函数

    我正在尝试扩展吉森计算器示例 http zaach github io jison try 具有一些简单的功能 我对解析和 bison jison 相当陌生 但这是我到目前为止所拥有的一些内容 lexical grammar lex var
  • 使用 Flex 和 Bison 编译时未定义对“_yyerror”的引用

    我正在尝试为迷你 Pascal 语言制作一个编译器 我为此使用了 Flex 和 Bison 并且出现了这个错误 我的 Flex 文件 include y tab h include
  • 如何解决2+2和2++2冲突

    在更大的程序中 我给出了以下内容 flex bison In flex pn dig 0 9 exp e E dig printf detected n return PLUS SIGN pn dig printf digit detect
  • 对“yylex()”的未定义引用

    我正在尝试使用 flex 和 bison 创建一种简单的脚本语言 现在 我只是想让计算器工作 但我无法编译它 当我运行这个 makefile 时 OBJECTS hug tab o hug yy o PROGRAM hug exe CPP
  • 如何将flex和bison与Qt项目集成?

    我正在 git 源代码控制下使用 Qt4 制作 GUI 程序 Github页面 https github com vinayak garg dic sim 项目的一小部分需要扫描和解析 所以我想在项目中使用flex和bison 我能想到3种
  • BISON + FLEX 语法 - 为什么标记被连接在一起

    我想了解为什么 BISON 按照以下规则连接两个标记 stmt declaration assignment exp ID lt this rule fprintf stderr n my id is s 1 如果你检查输出就会明白我的意思
  • Bison/Flex 中哪里可以释放内存?

    我使用 Bison 和 Flex 的时间或多或少有 1 个月 所以如果我没有看到明显的东西 但我不认为是 我很抱歉 我在使用 Flex Bison 释放内存时遇到问题 我的代码如下所示 parser l DATE yylval str st

随机推荐

  • SVG 在 Firefox 中完全不可见

    在将其标记为重复之前 我们已经确保宽度和高度设置正确 我将其描述为不可见 因为尽管它占用了正确的空间 甚至以正确的尺寸加载到图像上 但图像的内容在网站 网络选项卡以及直接查看 SVG 时都是空的 基本上 无论我们如何显示或查看它 实际的 S
  • OpenGL-ES 2.0 中未声明 glMapBuffer

    我正在 ubuntu 10 10 中通过使用 kronos 和 pvrsd kNow 代码进行 Opengl es 2 0 include
  • 懒惰、贪婪和所有格量词之间有什么区别?

    以下量词在场景 速度等方面有何不同 and 全部匹配0或1次 and 全部匹配0次或多次 and 全部匹配1次或多次 and are greedy and are 不情愿 懒惰 and are 所有格 谁能帮助我理解这些术语的含义 为什么同
  • 使用 Web 客户端 DownloadFileAsync 多个文件

    描述使用 webclient 的 DownloadFileAsync 下载多个文件 并利用文本文件作为 URL 输入进行下载 Problem我使用的方法根本不会下载文件 只是运行 什么也不做 它填充列表数组 然后退出程序而不下载单个文件 我
  • 节点removeListener不起作用

    尝试使用以下代码删除侦听器 var EventEmitter require events EventEmitter var emitter new EventEmitter emitter on message function text
  • iOS PencilKit 无法绘图

    我正在尝试使用 PencilKit 但无法在应用程序中绘制任何内容 我设置我的代码如下 import UIKit import PencilKit class DrawingViewController UIViewController v
  • 使用 Terraform 的 helm_release,如何设置数组或列表值?

    例如 根据Drupal 的 helm 图表文档 默认值accessModes is ReadWriteOnce 其在 YAML 中转换为以下内容 accessModes ReadWriteOnce 使用 Terraform 时舵释放资源 以
  • .NET Web浏览器控制和Dispose()

    我知道这是一个热门话题 有很多问题和答案 但我仍然没有找到以下问题的解决方案 我有一个多选项卡应用程序 每个选项卡上都有一个 Webbrowser 控件 由于网络浏览器为每个新选项卡占用更多内存 并且它们不会在选项卡关闭时释放此内存 因此我
  • fullcalendar - 如何使用 ajax 加载日历上的所有事件

    我想在页面加载时使用 Ajax 加载完整日历中的所有事件 我收到来自 Ajax 的响应 但该事件未添加到完整日历中 这是我的 jquery 代码 calendar fullCalendar theme true header left pr
  • 如何在 MATLAB 中填充两条直线和一条不直的曲线之间的区域(该区域不是多边形)

    使用 matlab 的 FILL 函数创建一个由直边多边形限定的填充区域 不幸的是 这在上图中留下了一个小的白色区域 因为我想要填充的区域的边界不是直边多边形 而是在左侧有一个弯曲的边界 我有一条曲线 几乎是抛物线 但不完全是 我想填充两条
  • 使用 MATLAB 分离图像中两个重叠的圆

    如何使用 MATLAB 将下图中两个相连的圆分开 我尝试过使用imerode 但这并没有给出好的结果 腐蚀不起作用 因为为了腐蚀得足以将圆圈分开 线条会消失或被破坏 在其他起始图片中 圆和线重叠 因此隔离重叠的对象也不起作用 该图像显示了通
  • SBT 在 Build.scala 中指定 java 堆大小

    我的 Build scala 文件内容 val commonSettings Seq version 1 0 0 organization com collective scalaVersion 2 11 4 scalacOptions L
  • ActionBarSherlock 和 ActionBar 兼容性之间的差异

    有什么区别动作栏夏洛克 and 操作栏兼容性 几天前 谷歌刚刚发布了 ActionBar 兼容性 这让我很困惑 Action Bar Compatibility 的工作原理与 ActionBarSherlock 相同并且编码相同吗 示例 是
  • Spring MVC 错误“NoSuchMethodError”

    我收到以下错误 请给我一些建议 我在用spring sts SEVERE StandardWrapper Throwable java lang NoSuchMethodError org springframework web conte
  • 解构中的 ES6 计算属性 - 解构整个对象

    我有这个变量 var a b 1 c 2 d rawr rawr 10 我想将它们解构到本地范围内 所以我这样做 var b c d a 这工作正常 但我需要得到rawr出去 我试过这个 var b c d a d a 但这给了我missi
  • Excel VBA:如何使用给定代码循环浏览同一文件夹中的工作簿?

    上一篇文章 我需要创建一个宏 循环遍历单个文件夹中的文件并运行我在下面提供的代码 所有文件的结构都相同 但是数据不同 该代码帮助我转到指定的目标文件并计算列中 YES 的数量 然后它将其输出到 CountResults xlsm 主工作簿
  • 相对于另一个向量对一个向量进行排序 - 最有效的方法?

    我知道这个问题已经 被问到 a few times 但对于简单的情况 其中紧凑性 可读性或用户熟练程度是决定因素 提供了不同的答案 我不确定哪一个是最有效率的 因为我担心重复该操作O 1M 次 设置如下 两个向量A and B of flo
  • 当多个活动处于活动状态时如何关闭应用程序

    我开了3个活动 现在用户想要退出应用程序 为此我必须完成所有活动 不建议这样做 但我的应用程序希望向用户提供这样的退出点 当多个活动处于活动状态时如何关闭应用程序 Thanks Android 中任何应用程序的所有活动都使用相同的进程 ID
  • 在 Angularfire 中什么时候使用 $asArray 和 $asObject ?

    看来有很多情况可以选择是否使用 asArray or asObject 在同样的情况下 你可以使用其中任何一个来逃脱 我是一位代码 js 初学者 但是什么时候应该使用 asArray 和 asObject 最新版本的角火1 0 0使用新的
  • 如何使用 Bison 实现“隐式乘法”规则?

    我正在为数学表达式解析器编写 Bison 文件 到目前为止 一切都很好 但我面临着隐式乘法的问题 你看 我想支持这样的表达2x sin 4x cos 4x 它应该像这样解析2 x sin 4 x cos 4 x 这里没什么太糟糕的 但请考虑