如何使用 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 实现“隐式乘法”规则? 的相关文章

  • Windows10下配置flex+bison(附运行例子)

    Windows10下配置flex 43 bison xff08 附运行例子 xff09 因为最近上编译课 xff0c 老师要求我们自己安装配置flex xff08 她还强调说windows配置很简单的网上一搜一大把教程 xff09 xff0
  • prebuilts/misc/darwin-x86/bison/bison: Bad CPU type in executable

    方案一 cd external bison touch patch high sierra patch vim patch high sierra patch With format string strictness High Sierr
  • 使用 Flex/Bison 的解释器 REPL

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

    我正在尝试使用该类型mpz t来自 GMP 库的类型yylval通过在 Bison 文件中包含以下内容 define api value type mpz t 我检查了生成的解析器 它正确生成了该行typedef mpz t YYSTYPE
  • 线程安全/可重入 bison + flex

    与任何解释相比 我真的更喜欢一个工作示例 到目前为止 我在 Bison 文档网站上读到的内容与 Flex 所说的内容相矛盾 一说要申报yylex as int yylex yyscan t yyscanner 另一位希望它是 int yyl
  • 改革语法以删除移位,减少 if-then-else 中的冲突

    如何消除给定语法的 bison 的移位归约冲突 selection stmt gt if expression statement if expression statement else statement 提供修改后的语法的解决方案将受
  • 如何为 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
  • 如何使用 Bison 解析 C 字符串

    Closed 这个问题需要细节或清晰度 目前不接受答案 我的 C 文件中有一个字符串 如下所示 char test print x 我想用我编写的 Bison 解析器来解析它 是否可以 Bison 解析器根本不读取输入 他们只是通过重复调用
  • Lex 正则表达式获得一些额外的字符

    我的 lex 文件中有以下定义 L a zA Z A a zA Z 0 9 L A yylval id yytext return IDENTIFIER 我在 YACC 文件中执行以下操作 primary expression IDENTI
  • YAML 解析 - lex 还是手工?

    我正在尝试编写一个简单的 YAML 解析器 我从 yaml org 阅读了规范 在开始之前 我想知道是否编写一个手卷解析器更好 或者 使用lex flex bison 我看了看libyaml C 库 好像没用lex yacc YAML 不包
  • 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 编写了一个扫描器 可以找到有用的位 智能代理模型的框架已经
  • 在 Bison 中为 && 和 || 启动短路规则运营

    我正在使用 C C 在 Bison 和 Flex 中编写一个简单的计算器 逻辑在 Bison 中完成 C C 部分负责数据结构 例如 STL 等 我有以下问题 在我的计算器中美元符号 表示 i 和 i 前缀和后缀 例如 int y 3 gt
  • 编写编译器……什么是对的,什么是错的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Flex 和 Bison 编译时未定义对“_yyerror”的引用

    我正在尝试为迷你 Pascal 语言制作一个编译器 我为此使用了 Flex 和 Bison 并且出现了这个错误 我的 Flex 文件 include y tab h include
  • 对 yyparse 的未定义引用(flex 和 bison)

    我正在尝试学习一些 Flex Bison 并且正在阅读 John Levine O Reilly 的 Flex Bison 有一个我需要运行的示例 但是我无法运行它 因为出现以下错误 tmp ccKZcRYB o In function y
  • vc++下编译bison和flex程序时unistd.h相关困难

    我正在使用 bison flex 通过 cygwin 下载 和 vc 当我编译程序时 出现错误 fatal error C1083 Cannot open include file unistd h No such file or dire
  • 构建 gcc 4.6 时遇到问题:对“yylex”的未定义引用

    我正在尝试构建 gcc 4 6 但我收到一些链接器错误 看起来这意味着 bison 或 flex 没有链接到 当 makefile 发出此命令时 gcc g fkeep inline functions DIN GCC W Wall Wwr
  • 如何将 C++ flex 与 C++ Bison 连接起来?

    我正在尝试将 C flex 与 C bison 连接起来 但我被难住了 Bison 3 8 1 手册有一个带有 C Flex 的 C Bison 示例 Flex 2 6 4 没有示例 我试图解决的问题是如何向 C 或 C Bison 提供指

随机推荐

  • 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 这里没什么太糟糕的 但请考虑