编译原理-消除左递归的方法

下面是关于“编译原理-消除左递归的方法”的完整攻略:

1. 什么是左递归

在编译原理中,左递归是指文法中存在形如 $ \rightarrow A\alpha$ 的产生式,其中 $A$ 是非终结符,$\alpha$ 是由终结符和非终结符组成的字符串。左递归会导致递归下降分析法无法正常工作,因此需要消除左递归。

2.除左递归的方法

消除左递归的方法有两种:直接左递归消除法和间接左递归消除法。

直接左递归消除法

直接左递归消除法是指将文法中的左递归产生式换为等价的右递归产生式。具体步如下:

  1. 对于形如 $A \rightarrow A\alpha_1|\cdots|A\alpha_n|\beta_1|\cdots|\beta_m$产生式,将其拆分为两个产生式 $A \rightarrow \beta_1A'|\cdots|\beta_mA'$ 和 $A' \rightarrow \alpha_1A'|\cdots|\alpha_nA'|\epsilon$。
  2. 对于新产生的 $A'$ 非终结符,将其加入到原有的非结符集合中。

下面是一个示例说明:

假设有以下文法:

E -> E + T | T
T -> T * F | F
F -> ( E ) | id

其中,产生式 $E \rightarrow E + T$ 是左递归产生式。可以使用直接左递归除法将其转换为等价的右递归产生式:

E -> TE'
E' -> +TE' | ε
T -> FT'
T' -> *FT' | ε
F -> ( E ) | id

示例1:直接左递归消除法

假设有以下文法:

``S -> S a | b


该文法中存在左递归产生式 $S \rightarrow Sa$,需要使用直接左递归消除法进行消除。

1. 将 $S \rightarrow Sa$ 拆分为 $S \rightarrow bS'$ 和 $S' \rightarrow aS'| \epsilon$。
2. 将新产生的 $S'$ 非终结符加入原有的非终结符集合中。
3. 将原有的产生式 $S \rightarrow Sa$ 替换为 $S \rightarrow bS'$ 和 $S' \rightarrow aS'| \epsilon$。

最终得到的文法为:

S -> bS'
S' -> aS' |


### 间接左递归消除法

间接左递归消除法是指将法中的间接左递归转换为直左递归,然后再使用直接左递归消除法进行消除。具体步骤如下:

1. 对于形如 $A \rightarrow B\alpha_1|\cdots|B\alpha_n|\beta_|\cdots|\beta_m$ 的产生式,其中 $B$ 是非终结符,将其分为两个产生式 $A \rightarrow \beta1B'|\cdots|\beta_mB'$ 和 $B' \rightarrow \alpha_1|\cdots|\alpha_n$。
2. 对于新产生的 $B'$ 非终结符,检查其是否存在左递归如果存在,则使用直接左递归消除法进行消除。

下面一个示例说明:

假设有以下文法:

S -> Aa | b
A -> | Sd | ε


其中,产生式A \rightarrow Ac$ 是间接左递归产生式。可以使用间接左递归消除法将其转换为等的直接左递归产生式:

S -> Aa | b
-> SdA' | ε
A' -> cA' ε


后再使用直接左递归消除法进行消除,得到:

-> Aa | b
A -> SdA | ε
A' -> cA' | ε
S -> bS' | aA'
S' -> dA' | ε
```

3. 结论

消左递归是编译原理中的一个重要概念,可以使用直接左递归消除法和间接左递归消除法进行除。以上是关于“编译原理-消除左递归的方法”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:编译原理-消除左递归的方法 - Python技术站

(2)
上一篇 2023年5月7日
下一篇 2023年5月7日

相关文章

  • 如何telnetipv6

    如何使用Telnet连接IPv6地址 Telnet是一种用于远程登录到计算机的协议,它可以通过网络连接到远程计算机并执行命令。在IPv6网络中,您可以使用Telnet连接IPv6地址。以下是使用TelnetIPv6地址的步骤: 1. 确定目标IPv6地址 首先,您需要确定要连接的IPv6地址。您可以使用ping命令或其他网络工具来确定目标IPv6地址。 2.…

    other 2023年5月6日
    00
  • Redis使用RedisTemplate模板类的常用操作方式

    RedisTemplate是Spring框架提供的一个用于操作Redis的模板类,它提供了丰富的API,可以方便地进行Redis的操作。常用的操作方式包括: 连接Redis服务器 在使用Redis时,首先需要创建RedisTemplate对象,并设置连接工厂。连接工厂分为JedisConnectionFactory和LettuceConnectionFact…

    other 2023年6月27日
    00
  • Win10系统总是提示IP地址冲突该怎么解决?

    Win10系统提示IP地址冲突解决攻略 1. 检查网络设置 首先,我们需要检查网络设置,确保没有重复的IP地址分配。以下是解决IP地址冲突的步骤: 打开控制面板,点击“网络和Internet”。 选择“网络和共享中心”。 在左侧导航栏中,点击“更改适配器设置”。 右键点击当前正在使用的网络连接,选择“属性”。 在弹出的窗口中,双击“Internet协议版本4…

    other 2023年7月30日
    00
  • 腾讯海量数据处理平台tdw

    以下是“腾讯海量数据处理平台tdw”的完整攻略: 腾讯海量数据处理平台tdw 腾讯海量数据处理平台tdw是一高效、可靠、易用的大数据处理平台,帮助我们处理海量数据。本攻略将细讲解tdw的基础知和应用开发技巧,包括tdw的安装、tdw的基本概念、tdw的数据、tdw的作业、tdw的应用等。 tdw的安装 tdw的安装可以通过源码编译或者二进制安装包的方式进行。…

    other 2023年5月8日
    00
  • vscode前端必备扩展有哪些? 25个提升开发幸福感的VSCode扩展分享

    vscode前端必备扩展 1. Prettier Prettier 是一个代码格式化工具,它可以帮助你自动格式化你的代码,使其保持一致的风格。它支持多种编程语言,并且可以根据你的配置文件自动格式化代码。 示例说明:当你在编写JavaScript代码时,Prettier可以自动调整代码的缩进、换行和空格,使代码更加整洁易读。 2. ESLint ESLint …

    other 2023年7月27日
    00
  • 安装vmtools失败的三类解决方法(windows、linux、macos)

    以下是关于“安装vmtools失败的三类解决方法(Windows、Linux、macOS)”的完整攻略: Windows系统 方法1:手动安装 如果自动安装tools,可以尝试手动安装。可以使用以下步骤手动安装vmtools: 在VMware菜单中,选择“虚拟机>“安装VMware Tools”。 在虚拟机中,打开CD/DVD驱动器,找到VMware …

    other 2023年5月7日
    00
  • CSS 的加载及加载顺序简介

    当网页加载时,浏览器需要加载 HTML 文件、JavaScript 文件和 CSS 文件。CSS 文件控制样式和布局。在浏览器加载 CSS 文件时,会遵循以下顺序: 首先,浏览器会发出 HTTP 请求,请求加载 CSS 文件。 加载 CSS 文件后,浏览器首先解析 CSS 文件中的 @import 语句。如果发现 @import 语句,则会按照 @impor…

    other 2023年6月25日
    00
  • spring的xml文件打开没有namespace等操作选项的解决方案

    针对“spring的xml文件打开没有namespace等操作选项”的问题,我们可以采用以下几个步骤来解决。 步骤1:导入schema文件 在<beans>节点上方加入如下命名空间声明: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 并在<beans>节…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部