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

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(使用前将#替换为@)

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

  • 使用 preg_split 分割和弦和单词

    我正在编写一小段播放处理歌曲标签的代码 但我遇到了一个问题 我需要解析每首歌曲选项卡行并将其拆分以获取大块chords一方面 并 且words在另一个 每个块就像 line chunk array 0 gt part of line con
  • python统计前10名

    使用Python 2 6 我有很大的文本文件 以下是前 3 个条目 但我需要检查超过 50 个用户 html log jeff 1153 3 1 84 625 54 1 2 71 3 2 10 7 58 499 3 5 616 36 241
  • 使用正则表达式或其他解析从文件中读取值

    我有一个记录带有时间戳的值的文件 我必须在特定时间后读取特定值 例如 文件有 2013 03 03 19 08 22 car 2001 Ford 2013 03 03 19 08 27 Truck 2012 Chevy 2013 03 03
  • VBA COM 库中的这些 _B_var_Xxxxx 和 _B_str_Xxxxx 成员到底是什么?

    想象一下以下函数调用 foo UCase bar 我正在解析这段代码 并确定UCase是一个函数调用 现在我想将该函数调用解析为定义它的 COM 库中函数的声明 这个想法是实现一个代码检查来确定何时Variant当使用内置函数时String
  • 我应该在哪里划清词法分析器和解析器之间的界限?

    我正在为 IMAP 协议编写一个词法分析器 用于教育目的 但我很困惑应该在词法分析器和解析器之间划清界限 以 IMAP 服务器响应为例 FLAGS Answered Deleted 该响应的正式语法定义如下 mailbox data FLA
  • 如何解析代码(Python)?

    我需要解析一些特殊的数据结构 它们采用某种类似 C 的格式 大致如下所示 Group GroupName C Style comment Group AnotherGroupName Entry some variables 0 3 141
  • 能否使用 jQuery 的 $(responseXML) 语法可靠地解析 XML?

    我目前正在寻找一种使用 JavaScript 从服务器 XML 响应中提取信息的简单方法 jQuery 似乎是一个很好的候选者 当谈到使用 jQuery 解析 XML 时 我不断遇到类似于以下代码片段的代码示例 function parse
  • 如何将带小数点的字符串解析为双精度型?

    我想解析一个字符串 3 5 到一个双倍 然而 double Parse 3 5 产量 35 和 double Parse 3 5 System Globalization NumberStyles AllowDecimalPoint 抛出一
  • 编程语言解析器的来源?

    我正在清理我的一个旧项目 该项目计算有关大型软件项目的许多简单指标 指标之一是文件 类 方法的长度 目前 我的代码 猜测 类 方法边界的位置基于非常粗略的算法 遍历文件 维护 当前深度 并在遇到未加引号的括号时调整它 当您返回到类或方法开始
  • DateTimeFormatter 中的通配符

    我需要将一个字符串解析为LocalDate 该字符串看起来像31 03 2016用正则表达式术语 即 表示日期数字后可能有 0 个或多个未知字符 输入 输出示例 31xy 03 2016 gt 2016 03 31 我希望在 DateTim
  • 处理调车场额外的操作员

    给定这样的输入 3 4 算法将其转化为3 4 当执行后缀表达式时我可以找到错误 但是 在转换过程中是否有可能发现这一点 我读过的维基百科文章和互联网文章不处理这种情况 谢谢 除了括号不匹配之外 还可以使用正则表达式来验证有效表达式 如维基百
  • 修复 PHP 中格式错误的 HTML?

    我正在根据用户提供的片段构建一个大型 HTML 文档 这些用户有以各种方式格式错误的烦人习惯 浏览器足够强大且宽容 但我希望能够验证并 理想情况下 修复任何格式错误的 HTML 如果可能的话 例如 td b Title b td 可以合理地
  • 构建一个简单的解析器,能够使用 PyParse 解析不同的日期格式

    我正在构建一个简单的解析器 它接受如下查询 显示 fizi 从 2010 年 1 月 1 日到 2006 年 2 月 11 日的提交 到目前为止我有 class QueryParser object def parser self stmn
  • 使用 TStringList 的分隔符解析字符串,似乎也解析空格(Delphi)

    我有一个简单的字符串 由某个字符分隔 比如说逗号 我应该能够创建一个 TStringList 并将其分隔符设置为逗号 然后将 DelimitedText 设置为我想要解析的文本 并且应该自动解析它 问题是 当我查看输出时 它还包含空格作为分
  • 使用 R 读取和转换二进制原始数据

    我有一个file https drive google com file d 0BxMpk0nhnJy6SFhxd2xuMzJYYlk edit usp sharing其中包含原始 二进制数据和 ascii 它包含一个时间戳和一个代表速度的
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • 如何在 Azure 逻辑应用中解析 Excel 电子表格

    我需要使用 Azure 逻辑应用从 Excel 电子表格中解析和提取列信息 我已经为我的逻辑应用程序设置了从 Outlook 检索最新未读电子邮件的功能 此外 我的逻辑应用程序执行 FOR EACH 来读取所有附件 来自未读电子邮件 并确保
  • Magento - 将特定父类别的子类别列为链接

    我是 php 的初学者 并且一直试图将一个父类别的子类别作为链接调用 我得到了这个 它调出了 getName 但 getUrl 根本没有返回任何 URL 输出代码只是 li a href name of sub a li
  • Java 库有 parseInt、parseLong、parseDouble 等接受默认值并且不抛出异常吗?

    我喜欢中的建议java中的String到Int 可能是坏数据 需要避免异常 https stackoverflow com questions 174502 string to int in java likely bad data nee
  • 在 JAVA 中使用 SAX 解析器从 XML 文件中提取文本节点

    因此 我目前正在使用 SAX 尝试从我正在处理的大量 xml 文档中提取一些信息 到目前为止 提取属性值确实很容易 但是 我不知道如何从文本节点中提取实际值 例如 在给定的 XML 文档中

随机推荐

  • 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