语法与运算符结合性之间的关系

2024-03-03

一些编译器书籍/文章/论文谈论语法的设计及其运算符的结合性的关系。我是自上而下的忠实粉丝,尤其是递归下降、解析器,到目前为止我编写的大多数(如果不是全部)编译器都使用以下表达式语法:

Expr   ::= Term { ( "+" | "-" ) Term }
Term   ::= Factor { ( "*" | "/" ) Factor }
Factor ::= INTEGER | "(" Expr ")"

这是该 BNF 的 EBNF 表示:

Expr  ::= Term Expr'
Expr' ::= ( "+" | "-" ) Term Expr' | ε
Term  ::= Factor Term'
Term' ::= ( "*" | "/" ) Factor Term' | ε
Factor = INTEGER | "(" Expr ")"

根据我读到的内容,有些人认为这个语法是“错误的”,因为运算符结合性的变化(这 4 个运算符从左到右)通过向右而不是向左生长的解析树证明。对于通过属性语法实现的解析器,这可能是正确的,因为 l 属性值要求首先创建该值,然后传递给子节点。然而,当使用普通的递归下降解析器实现时,由我决定是先构造这个节点然后传递给子节点(自上而下)还是先创建子节点然后将返回值添加为该节点的子节点(传递在此节点的构造函数中)(自下而上)。这里应该有一些我想念的东西,因为我不同意这种语法是“错误的”并且这种语法已经在许多语言中使用的说法,尤其是。维尔西安的。通常(或全部?)阅读说它促进 LR 解析而不是 LL。


我认为这里的问题是一种语言有一个抽象语法就像:

E ::= E + E | E - E | E * E | E / E | Int | (E)

但这实际上是通过具体语法它用于指定关联性和优先级。因此,如果您正在编写一个递归的体面解析,那么您将在进行过程中隐式地将具体语法写入其中,这很好,尽管将其精确地指定为短语结构语法可能会更好!

如果你的语法是一个成熟的具体语法,那么它有几个问题。首先,您需要添加产生式以“转到下一个级别”,因此稍微放松您的语法:

Expr ::= Term + Term | Term - Term | Term
Term ::= Factor * Factor | Factor / Factor | Factor
Factor ::= INTEGER | (Expr)

否则,无法从起始符号(在本例中为 Expr)开始导出有效的句子。例如,如果没有这些额外的产生式,您将如何导出“1 * 2”?

Expr -> Term
     -> Factor * Factor
     -> 1 * Factor
     -> 1 * 2

我们可以看到其他语法以稍微不同的方式处理这个问题:

Expr -> Term Expr'
     -> Factor Term' Expr'
     -> 1 Term' Expr'
     -> 1 * Factor Term' Expr'
     -> 1 * 2 Term' Expr'
     -> 1 * 2 ε Expr'
     -> 1 * 2 ε ε
      = 1 * 2

但这达到了相同的效果。

您的解析器实际上是非关联的。要查看此内容,请询问如何E + E + E会被解析并发现它不能。任何+首先被消耗,我们得到E一侧和E + E另一方面,但随后我们尝试解析E + E as a Term这是不可能的。同样,考虑从起始符号导出该表达式,这也是不可能的。

Expr -> Term + Term
     -> ? (can't get another + in here)

另一种语法是左关联 ebcase 任意长的字符串E + E + ... + E可以推导出来。

所以无论如何,总而言之,你是对的,在编写 RDP 时,你可以实现任何concrete的版本abstract你喜欢的语法,并且你可能比我更了解它。但是,当尝试生成精确描述 RDP 的语法时,会出现这些问题。希望有帮助!

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

语法与运算符结合性之间的关系 的相关文章

  • 使用 JSONKit 解析 JSON 文件

    我正在构建一个音叉应用程序 货叉应允许最多 12 个预设节距 此外 我希望允许用户选择一个主题 每个主题都会加载一组预设 不必使用所有预设 我的配置文件看起来像这样 theme A3 comment An octave below conc
  • Objective-C 头解析

    我需要解析一些 Objective C 标头 我尝试过使用Doxygen并解析 XML 输出 但它不完全支持没有注释的 Objective C 标头 它会阻塞属性中定义的宏 请检查Doxygen 无法正确识别属性 https stackov
  • 使用Java获取CSS文件中图像的URL?

    我正在尝试使用 Java 获取远程 CSS 文件中图像 所有 MIME 类型 的 URL 我正在使用 jsoup 来获取 css 的 URL 经过无数个小时的观看CSS解析器 http cssparser sourceforge net 由
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • 如何使用 string#split 用分隔符 + - * / ( ) 和空格分割字符串并将它们保留为额外标记?

    我需要拆分包含基本数学表达式的字符串 例如 a b c or a c d 分隔符是 和空格 我需要它们作为独立的标记 基本上结果应该是这样的 a b c 对于第二个例子 a 我读了很多关于具有不太复杂的分隔符的类似问题的问题 常见的答案是使
  • serde_json::from_str 错误,其中字符串来自文件

    extern crate serde json use serde json Value use std fs File use std io prelude fn main let filepath map test anhui txt
  • 学习树顶

    我正在尝试自学 Ruby 的 Treetop 语法生成器 我发现 对于 最好的 文档来说 不仅文档非常稀疏 而且它的工作方式似乎并不像我希望的那样直观 从高层次上来说 我真的很喜欢比现场文档或视频更好的教程 如果有的话 在较低的层面上 这是
  • 学习Python中的解析器

    我记得我读过有关解析器的内容 您只需提供一些示例行 它就知道如何解析某些文本 它只是确定两条线之间的差异 以了解可变部分是什么 我以为它是用 python 写的 但我不确定 有谁知道那是什么图书馆吗 可能你的意思是模板制作器 http co
  • 如何增加使用 SAX 解析 XML 文件的entityExpansionLimit

    我正在尝试使用 Java 中的 SAX 解析器解析一个 1 23 GB 的 XML 文件 我使用的是 Mac 操作系统和 JDK 1 7 0 51 不幸的是 我收到以下错误 The pasrser has encountered more
  • 如何在 PHP 中实现前向索引?

    我希望在 PHP 中实现一个简单的前向索引器 是的 我确实知道 PHP 并不是完成这项任务的最佳工具 但无论如何我还是想这样做 其背后的理由很简单 我想要一个 并且是 PHP 版本 让我们做一些基本假设 整个互联网包括 大约五千个 HTML
  • D3 删除千位的逗号分隔符

    我有一个包含 3 列的 json 其中一列是 年份 该列仅包含年份 没有日期 当我在 x 轴上绘制它时 年份会以逗号分隔符表示数千 所以在 json 中 日期的格式是 Year 1990 在 x 轴上 结果是 1 990 我一直在试图弄清楚
  • 如果没有解析器生成器,如何用 C 或 Objective-C 编写解析器?

    我正在尝试用 C 或 Objective C 制作一个计算器 它接受以下字符串 8 2 4 3 9 2 并返回答案 2920 我不想使用像 Lex 或 Yacc 这样的生成器 所以我想从头开始编码 我该怎么做呢 除了 龙 这本书之外 还有其
  • 在 C 中解析字符串的最简单方法是什么?

    我必须在 C 中解析这个字符串 XFR 3 NS 207 46 106 118 1863 0 207 46 104 20 1863 r n 并且能够得到207 46 106 118部分和1863部分 第一个 IP 地址 我知道我可以一个字符
  • 一个对大文件有效的轻量级 XML 解析器?

    我需要解析潜在的巨大 XML 文件 所以我猜这排除了 DOM 解析器 是否有任何优秀的 C 轻量级 SAX 解析器 在占用空间上可与 TinyXML 相媲美 XML的结构非常简单 不需要诸如命名空间和DTD之类的高级东西 只是元素 属性和
  • Eclipse 中的 AST 处理无法解析绑定

    我正在使用 eclipse JDT AST 解析器来处理一些 Java 代码 并尝试提取字段和方法声明的类型绑定 这样做的逻辑位于我的 Visitor 类中 见下文 不幸的是 我没有任何运气 并且没有任何绑定能够解析 它们始终为空 有趣的是
  • 用 C# 解析和查询 SOAP

    我正在尝试解析一个大量命名空间的 SOAP 消息 源也可以在here http tinyurl com n3av6k
  • 如何在 Java 中解析这样的 URI

    我正在尝试解析以下 URI http translate google com zh CN en 你 http translate google com zh CN 7Cen 7C E4 BD A0 但收到此错误消息 java net UR
  • XAML解析异常

    我有一个简单的 XAML 页面 当它作为 Visual Studio 中任何应用程序的一部分加载时 加载效果良好 但是 当我使用 ClickOnce 部署此应用程序时 出现以下异常 Type System Windows Markup Xa
  • 在python中比较两个xml文件

    我是 python 编程新手 并且在理解这个概念时遇到了一些困难 我想比较两个 xml 文件 这些 xml 文件相当大 我将给出一个我想要比较的文件类型的示例 xml文件1
  • 在 C# 中遍历 ANTLR AST 的教程?

    有人知道在 C 中遍历 ANTLR 生成的 AST 的教程吗 我能找到的最接近的是this https web archive org web 20201019210638 http www manuelabadia com blog Pe

随机推荐

  • iOS 如何合并两个mp3文件?

    我的应用程序中有一个用户录音和另一个 mp3 文件 我希望用户能够将这两个文件作为一个导出 这意味着这两个文件将以某种方式合并或相互叠加 如果不明白的话 这两个 mp3 文件将同时播放 就像用户可以通过乐器录制歌曲 例如歌曲 的任何应用程序
  • SQLite 查询问题

    2个问题 首先 在 MSSQL 中 我可以通过执行以下操作将 nvarchar 转换为 datetime cast 5 31 2011 12 00 00 AM as datetime as convertedtodate 结果 2011 0
  • 单击编程按钮会引发“System.StackOverflowException”异常

    我在 C Net 中编写了一个 WinForms 程序 用于以编程方式单击密码表单中的按钮 Form1加载并显示Form2作为对话框 如果 DialogResult 不是 DialogResult OK 则应用程序将关闭 到目前为止我有一个
  • 在具有多个目录的项目结构中使用 Python 单元测试

    我需要使用unittestpython 库来执行有关 3 个函数的测试src arithmetics py文件 这是我的项目结构 src arithmetics py test lcm init py test lcm exception
  • 使用 linq 过滤 List

    我有一个包含 Id 值的 List 对象 例如它包含 1 2 10 1 23 11 1 4 2 2 等我需要找出 1 2 等发生了多少次 在 C 中使用 Linq 请帮忙 使用起来非常简单Enumerable GroupBy http ms
  • 为什么多个等待像 Task.WhenAll() 一样花费相同的时间

    据我了解 当您有任务列表时 建议使用await Task WhenAll 超过多个await 由于这样的方式Task WhenAll 处理异常 然而 根据我对 async await 工作方式的理解 我想知道为什么下面的代码块具有相同的执行
  • 如何在 tidyverse 中转置数据框?

    使用基本的 R 我可以转置数据框 比如说mtcars 其中具有同一类的所有列 as data frame t mtcars 或者用管道 library magrittr mtcars gt t gt as data frame 如何在 ti
  • 在 JQuery AJAX 发布之前暂停

    因为我正在处理的页面是一个内联网页面 所以我的 AJAX 调用和响应非常快 出于可用性目的 我想要短暂的 1 2 秒暂停来显示加载动画 下面是我尝试过的 但动画几乎不可见 document ready function wait hide
  • CSS?这个箭头是怎么做出来的?

    这让我发疯 我一直在使用 Firefox 检查器来尝试找出这个箭头是如何在进展现场 http headwaythemes com 我通过检查器删除块来削减代码 并将其简化为 无论我在哪里检查 我都可以not找到任何这样的形状 没有背景图像
  • windows mingw下使用zlib

    我似乎无法让 zlib 在 Windows 下的 mingw 上执行任何操作 我下载了zlib http sourceforge net projects mingw files beta MinGW zlib zlib 1 2 3 1 m
  • 设计在不同的屏幕上破碎[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我设计了一个网页 其中很少有HTML元素没有响应 这些元素是动态生成的jQuery我相信 应该有一种方法可以让他们看起来反应灵敏 Me
  • 如何针对 TextReader 使用正则表达式?

    在 可能 非常大的文本中查找模式的最佳方法是什么 我可以使用正则表达式 但它接受字符串作为参数 有没有办法将它与 TextReader 或某种流一起使用 不 正则表达式可能需要进行回溯 由于流只能向前读取 这意味着无论如何它都必须将整个流保
  • 无法在 Docker 容器内从 Google API 交换 AccessToken

    我有一个用 Go 编写的网络应用程序 使用 oauth2 包golang org x oauth2 通过 Google 登录用户 按照本教程操作https developers google com identity sign in web
  • Facebook API - uids 和电子邮件 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试开发一个应用程序 用户 X 已登录 Facebook 应用程序有一组电子邮件地址 可能是用户 X 的朋友 应用程序获取用户
  • 为什么要在 Objective C 构造函数中使用 [super init]?

    假设我有一个名为 Item 的类 它是 NewsItem 和 TwitterItem 的超类 如果我想创建一些 NewsItem 我必须使用 在构造函数内 self super init 如果是 为什么 在 Java C 中我会这样做 Ne
  • Flexbox 实现水平滚动

    我正在使用 Flexbox 布局制作一个购物中心网站 但 Flexbox 在某些区域会导致问题 Flexbox 似乎在某些区域进行水平滚动 但我不希望这样 您的问题是横幅中的图像太宽 无法适应大多数视口 因此它们迫使页面变宽 没有简单的方法
  • 在 R 中重复多个 NULL

    在我的模拟中 我需要一个如下所示的向量 vec NULL NULL NULL NULL 2 2 2 2 4 4 4 4 但是 在 R 中 当我使用rep NULL 4 它什么也不返回 例如 vec all c rep NULL 4 rep
  • SwiftUI 垂直未对齐的文本

    我有一些垂直未对齐的文本 我不知道为什么 代码 struct IBANInputView View State var securityDigits State var bankCode State var accountNumber va
  • CSS 动画在 Chrome 中不起作用

    对项目的一些见解 一个完整的交互式网站 动画将在其中播放 然后它们会停止 一旦它们停止并且动画上发生鼠标悬停事件 它将播放直到动画完成 70 当单击另一个对象时 在本例中 案例文本 它将完成它的循环 我的项目合作伙伴在 Google Web
  • 语法与运算符结合性之间的关系

    一些编译器书籍 文章 论文谈论语法的设计及其运算符的结合性的关系 我是自上而下的忠实粉丝 尤其是递归下降 解析器 到目前为止我编写的大多数 如果不是全部 编译器都使用以下表达式语法 Expr Term Term Term Factor Fa