解决 yacc/ocamlyacc 中的减少/减少冲突

2024-01-04

我正在尝试解析 ocamlyacc 中的语法(与常规 yacc 几乎相同),它支持没有运算符的函数应用程序(如 Ocaml 或 Haskell 中),以及二元和一元运算符的正常分类。我遇到了与“-”运算符的归约/归约冲突,该运算符可用于减法和求反。这是我正在使用的语法示例:

%token <int> INT
%token <string> ID
%token MINUS

%start expr
%type <expr> expr

%nonassoc INT ID
%left MINUS
%left APPLY

%%

expr: INT
    { ExprInt $1 }
| ID
    { ExprId $1 }
| expr MINUS expr
    { ExprSub($1, $3) }
| MINUS expr
    { ExprNeg $2 }
| expr expr %prec APPLY
    { ExprApply($1, $2) };

问题是,当你得到像“a - b”这样的表达式时,解析器不知道是否应该将其简化为“a (-b)”(b 的否定,后跟应用程序)或“a - b”(减法)。减法减少是正确的。我如何解决冲突以支持该规则?


不幸的是,我能想到的唯一答案就是增加语法的复杂性。

  1. split expr into simple_expr and expr_with_prefix
  2. 只允许simple_expr or (expr_with_prefix)在申请中

第一步将您的归约/归约冲突转变为移位/归约冲突,但括号解决了这个问题。

你也会遇到与“a b c”相同的问题:是吗?a(b(c)) or (a(b))(c)?你还需要中断applied_expression并要求(applied_expression)在语法中。

我认为这会做到这一点,但我不确定:

expr := INT
      | parenthesized_expr
      | expr MINUS expr

parenthesized_expr := ( expr )
                    | ( applied_expr )
                    | ( expr_with_prefix )

applied_expr := expr expr

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

解决 yacc/ocamlyacc 中的减少/减少冲突 的相关文章

  • C 或 C++ 中是否有轻量级的多部分/表单数据解析器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑将多部分表单数据解析集成到 Web 服务器模块中 以便可以减轻后端 Web 应用程序 通常用动
  • 如何解析代码(Python)?

    我需要解析一些特殊的数据结构 它们采用某种类似 C 的格式 大致如下所示 Group GroupName C Style comment Group AnotherGroupName Entry some variables 0 3 141
  • 在 Mac OS X 10.6 上编译和执行莎士比亚编程语言转换器 spl2c 会导致警告/错误

    我想尝试一下莎士比亚编程语言 http shakespearelang sourceforge net report shakespeare 所以我从here http shakespearelang sourceforge net 并使用
  • Java 中的递归下降解析器

    我想在序言中说这是我三年级编程语言课的家庭作业 我正在寻求一些帮助 我的作业如下 截止日期 2013年2月22日晚上11点55分提交 请将以下内容上传到CMS 1 源代码2 程序执行的屏幕截图 包括您使用的输入文件 使用您喜欢的任何编程语言
  • OCaml 2 和 3 之间的差异

    我有兴趣学习这门语言 但似乎有关该主题的教程和书籍很少 我只找到一本关于这个主题的合适的书 用 Objective Caml 这绝对是完美的 但问题是它是基于 2 04 版本的 所以我唯一关心的是使用这本书 对于 OCaml 3 x 是否会
  • 从 XML 构建树结构的速度很慢

    我正在将 XML 文档解析为我自己的结构 但对于大型输入来说构建它非常慢 是否有更好的方法来做到这一点 public static DomTree
  • 自动解析 PHP,将 PHP 代码与 HTML 分离

    我正在开发一个大型 PHP 代码库 我想将 PHP 代码与 HTML 和 JavaScript 分开 我需要对 PHP 代码进行多次自动搜索和替换 对 HTML 进行不同的搜索和替换 对 JS 进行不同的自动搜索和替换 有没有一个好的解析器
  • 从 python 中的缩进文本文件创建树/深度嵌套字典

    基本上 我想迭代一个文件并将每行的内容放入一个深层嵌套的字典中 其结构由每行开头的空格数量定义 本质上 目标是采取这样的事情 a b c d e 并将其变成这样的东西 a b c d e Or this apple colours red
  • 如何在 powershell 中使用正则表达式选择“catch”代码块?

    我正在尝试分析多个目录中的大量 powershell 脚本 并且希望将任何 Catch 代码块拉入列表 变量中 我正在尝试编写一个正则表达式来选择以下格式的任何块 Catch write Host Function MyInvocation
  • “单词的正则表达式”(语义替换)-任何示例语法和库吗?

    我正在寻找在给定过程语言的情况下对单词而不是字符进行正则表达式样式转换的常用技术的语法示例 例如 为了追踪复制 人们可能想要创建一份具有相似含义但具有不同单词选择的文档 我希望能够简洁地定义这些可以应用于文本流的可能的转换 例如 快速地no
  • 使用 Javascript 解析文本

    我正在尝试使用 Javascript 来解析在文本框中输入的文本 这将结合各种用户生成的变量来创建随机活动 看看这个例子可能更有意义 一些示例输入可能是 Activity Home Out Home Read book for time C
  • OCaml 中的不可变变量

    我正在学习 OCaml 我对变量的不变性有点困惑 根据我正在读的书 变量是不可变的 到目前为止一切顺利 但到底为什么我可以这样做 let foo 42 let foo 4242 我缺少什么 我认为最好的解释方法是举个例子 考虑以下代码 在
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • 将 Java 字符串转换为 sql.Timestamp

    收到以下格式的字符串 YYYY MM DD HH MM SS NNNNNN 时间戳来自 DB2 数据库 我需要将其解析为 java sql Timestamp 并且不丢失任何精度 到目前为止 我一直无法找到现有的代码来解析远至微秒的数据 S
  • 无论如何要抓取重定向的链接吗?

    无论如何 我可以让 python 单击一个链接 例如 bit ly 链接 然后抓取生成的链接吗 当我抓取某个页面时 我唯一可以抓取的链接是重定向的链接 它重定向到的位置就是我需要的信息所在的位置 重定向有 3 种类型 HTTP 作为响应标头
  • 有一种简单的方法可以忽略时间戳来区分日志文件吗?

    我需要比较两个日志文件 但忽略每行的时间戳部分 确切地说是前 12 个字符 有没有一个好的工具 或者一个聪明的 awk 命令 可以帮助我 根据您使用的 shell 您可以改变方法 Blair https stackoverflow com
  • 如何使用Gson仅从Json反序列化某些特定字段?

    我有以下 JSON 字符串 channel bvmt initValues data value instrumentIds TN0007250012 TN0007500010 instruments mnemonic ADWYA marc
  • Magento - 将特定父类别的子类别列为链接

    我是 php 的初学者 并且一直试图将一个父类别的子类别作为链接调用 我得到了这个 它调出了 getName 但 getUrl 根本没有返回任何 URL 输出代码只是 li a href name of sub a li
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • Rust 编程竞赛中最快的惯用 I/O 例程?

    我的问题已部分得到解答 因此我根据从评论和其他实验中学到的知识对其进行了修改 总之 我想要一个用于编程竞赛的快速 I O 例程 其中使用单个文件解决问题 无需外部包 它应该从一个以空格分隔的标记序列中读取BufRead 标准输入或文件 标记

随机推荐

  • Postgresql 捷克语全文搜索(无默认语言配置)

    我正在尝试设置捷克语全文搜索 我有点困惑 因为我看到了一些cs cz affix and cs cz dict里面的文件tsearch data文件夹 但没有捷克语配置 它可能不随 Postgres 一起提供 那么我应该创建一个吗 我必须创
  • 使用 Gradle 将依赖项添加到运行时映像

    我不知道如何添加依赖项 我的模块需要 Log4j 我向模块信息添加了要求 我还添加了 gradle 依赖项 我可以运行项目 但无法创建自定义运行时映像 plugins id java id application id org openjf
  • 返回数组中重复元素的最佳方法

    这是我用来返回重复元素的方法 但是 当我的数组有大量长文本项目时 我面临着最危险的性能问题 例如浏览器关闭等 var arr 9 9 111 2 3 4 4 5 7 var sorted arr arr sort var results f
  • vscode Typescript Intellisense 仅显示第一个选项?

    我正在开发我的 React Native TypeScript 应用程序 今天突然 没有更新 没有更改设置 我的智能感知开始只显示第一个建议 无论如何 这个问题不是特定于特定类的 我已经多次重新启动Vscode 重新启动TS语言服务器 删除
  • 参数中包含空格的 Python 子进程调用在 Windows 上不起作用

    我正在运行一个 java 命令 该命令获取类路径和其他有空格的文件位置 Windows 似乎不喜欢它 我从 C Program Files Splunk 运行程序 其中有一个空格 这是我的命令 c1 os path join appdir
  • 如何获取TFS集合中所有项目的名称?

    关于如何从TFS获取集合参考here https stackoverflow com questions 16100991 how to get all collections from tfs 16100992 16100992 请参考h
  • Kube-proxy 或 ELB“延迟”HTTP 请求数据包[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我们正在 AWS 中的 Kubernetes 1 9 3 上运行 Web API 应用程序 使用 KOPS 设置 该应用程序是一个部署
  • 用换行符/段落标记替换所有空格以制作单词列表

    我正在尝试列出我们在课堂上翻译的希腊语文本的词汇表 我想用段落标记替换每个空格或制表符 以便每个单词都出现在自己的行上 谁能给我 sed 命令 并解释我在做什么 我仍在尝试弄清楚 sed 对于相当现代的 sed 版本 编辑标准输入以产生标准
  • 通过 Azure Devops 部署 Nuget 包时未添加依赖项

    我创建了 net 标准库 创建后 我尝试通过选择项目文件中存在的包选项从我的视觉工作室创建 nuget 包 然后尝试在另一个控制台应用程序中使用本地创建的 nupkg 文件 它工作正常 它显示了预期的依赖关系 然后 我通过创建管道通过 Az
  • android:admob InterstitialAd 在 loadAd 时崩溃

    我正在使用 Admob 的 InterstitialAd 我的应用程序仅在第一次调用时才会在 loadAd 处崩溃 并且不可重现 每运行 100 200 次或多或少就会发生一次 广告单元 ID 肯定是正确的 因此 如果 loadAd 在第一
  • Spark CollectAsMap

    我想知道collectAsMap在Spark中是如何工作的 更具体地说 我想知道所有分区的数据聚合将在哪里进行 聚合发生在 master 或workers 中 在第一种情况下 每个工作人员将其数据发送到主设备上 当主设备从每个工作人员收集数
  • .htaccess:将根 url 重定向到子目录,但保留根 url

    我正在清理域的目录结构 在根目录中设置根 url 的内容对我来说是不幸的 并且需要一些关于如何正确使用 RewriteRule 的见解 The Gist I want 域名 tld to use 域名 tld 子目录 但仍然显示为域名 tl
  • 如何通过WCF处理大文件上传?

    我正在考虑将 WCF 用于一个项目 该项目需要人们能够将大文件 64MB 1GB 上传到我的服务器 我将如何使用 WCF 处理此问题 可能能够恢复上传 为了处理更大的客户群 我想通过 WCF 测试 JSON 这将如何影响文件上传 可以通过
  • 防止 TextInputLayout 使 TextInputEditText 变高

    我想要密码切换功能 看起来TextInputLayout有这个功能 没有TextInputEditText 但正如你看到下面的代码 即使我将高度设置为wrap content and app hintEnabled false 高度为Tex
  • 如何从 googleapi Youtube API 获取 XML 响应

    YouTube 似乎已将其 API 更新为较新的 API YouTube 数据 API v3 https developers google com youtube v3 突然我网站上的 YouTube 搜索不起作用了 我正在尝试更新它们以
  • Safari 原生代码

    有人熟悉 OS X Safari 版本 3 和 WebKit 中的本机代码吗 我正在使用 Javascript 来解析表单中的一些信息 我的输入之一名为 标签 当尝试使用以下方法获取该元素的值时 button is being passed
  • 尝试导入错误:“SomeObject”未从文件导出

    我已从 Webpack 3 升级到 Webpack 4 从那时起 我收到了很多关于未从某些文件导出的导入的警告 packages utils logging index ts Attempted import error Options i
  • VIM 配色方案默认不加载

    当我做 colorscheme vilight 它加载配色方案很好 所以我添加了 colorscheme vilight 到我的 vimrc 但它没有在启动时加载它 我错过了什么吗 也在我的配置中 set background dark s
  • 使用批处理文件跨驱动器移动目录

    我想从以下位置移动文件夹及其子文件C to D 通过使用批处理文件 我怎样才能做到这一点 我认为没有办法跨驱动器移动文件夹 这种 移动 只是复制后删除 所以你可以这样做 xcopy c example d example S E rmdir
  • 解决 yacc/ocamlyacc 中的减少/减少冲突

    我正在尝试解析 ocamlyacc 中的语法 与常规 yacc 几乎相同 它支持没有运算符的函数应用程序 如 Ocaml 或 Haskell 中 以及二元和一元运算符的正常分类 我遇到了与 运算符的归约 归约冲突 该运算符可用于减法和求反