编译原理如何写出不带回溯的递归子程序?

news2024/11/13 9:23:22

递归子程序

使用不带回溯的递归子程序解析文法是预测性语法分析的基础,这通常需要该文法是LL(1)文法每个非终结符对应一个递归子程序,并使用当前的输入符号和FIRST集合来决定调用哪个产生式。

让我们以一个简单的文法为例:

对于此文法,我们可以创建以下不带回溯的递归子程序(以Python为例理解意思):

def E():
    T()
    E_prime()

def E_prime():
    if lookahead == '+':
        match('+')
        T()
        E_prime()

def T():
    F()
    T_prime()

def T_prime():
    if lookahead == '*':
        match('*')
        F()
        T_prime()

def F():
    if lookahead == '(':
        match('(')
        E()
        match(')')
    elif lookahead == 'i':
        match('i')
    else:
        raise Exception("Syntax Error")
#并不是只有 F 能报错,在实际的编译器或解释器的实现中,任何递归子程序都可能会遇到预期之外的输入,并报告语法错误。
        
def match(expected_token):
    global lookahead
    if lookahead == expected_token:
        lookahead = get_next_token()  # Update the lookahead with the next input symbol.
    else:
        raise Exception("Syntax Error")

在这里,lookahead变量存储当前的输入符号,get_next_token()方法会获取输入中的下一个符号。递归子程序使用FIRST集合预测下一步,如果lookahead匹配某个产生式的开始,那么该产生式被执行。每一个非终结符都会被写成一个函数,这个函数对应着该非终结符所有可能推导到的集合!递归子程序的目的是处理非终结符对应的所有推导可能性,而不仅仅是FIRST集。

在递归子程序中,FIRST集主要用于指导语法分析器决定接下来应该如何进行。但一旦决策被作出(例如,在E_prime()中当lookahead == '+'时),该子程序就会根据相应的产生式继续进行,并可能递归地调用自己或其他子程序,以处理非终结符的所有可能的推导。

为了完整地解析输入,我们需要确保我们的递归子程序能够处理对应非终结符的所有推导可能性,这包括其FIRST集,但不限于此。在有些情况下,这还需要考虑递归推导,以处理重复的结构或模式。

同时,当编写这些递归子程序时,我们应当确保输入的文法是LL(1)的,这意味着每个非终结符的FIRST集合中的每个产生式对应的集合是不相交的,并且对于任何可能产生\epsilon的产生式,FIRSTFOLLOW集合也是不相交的。


完整的预测性语法分析器

上面给出的只是子程序。为了形成一个完整的预测性语法分析器,我们需要一个main函数或者一个驱动程序来初始化整个过程并开始解析。下面是如何将这些子程序组成一个简单的预测性语法分析器的例子:

# 假设我们有一个从输入源获取下一个符号的函数
def get_next_token():
    # 这里是一个简单的模拟实现
    global input_string, position
    if position < len(input_string):
        token = input_string[position]
        position += 1
        return token
    else:
        return None  # 表示输入结束

# 全局变量
input_string = "i+i*i"  # 你的输入字符串,这里是一个例子
position = 0
lookahead = get_next_token()  # 初始化lookahead

# 前面定义的递归子程序...

def main():
    E()  # 从文法的开始符号开始
    if lookahead is not None:
        print("Syntax Error: Unexpected symbol", lookahead)
    else:
        print("Parsing successful!")

if __name__ == "__main__":
    main()

这里的main函数简单地开始解析过程,并检查是否成功地到达了输入的末尾。如果在解析结束时lookahead不是None,则输入中还有未处理的符号,这表示一个语法错误。如果解析成功地完成,则输出相应的消息。


举例

例如,考虑输入为+i+i+i

  • 第一次调用E_prime()会匹配第一个+,然后调用T()匹配i,最后再次递归调用E_prime()
  • 在这次递归调用中,会匹配第二个+,再次调用T()匹配第二个i,然后再次递归调用E_prime()
  • 在最后一次调用中,会匹配第三个+,调用T()匹配第三个i,然后再次递归调用E_prime(),此时由于没有更多的+,所以这次调用不会执行任何操作并立即返回。

递归调用E_prime()的目的是允许多个连续的+TE'结构。这实际上使我们能够解析如+T+T+T这样的输入,每一个+T都对应于E' —> +TE'的一个实例。如果我们移除递归调用E_prime(),那么子程序只能匹配一个+T结构,无法正确解析像+i+i+i这样的输入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1123156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型开发06:LangChain 概述

大模型开发06:LangChain 概述 LangChain 是一个基于语言模型开发应用程序的框架。它可以实现以下功能: 上下文感知: 将语言模型与上下文源相连接(提示词、示例、用于支撑响应的内容等)推理能力: 依赖语言模型进行推理(如何根据提供的上下文来回答问题或采取哪些行动等)La…

抖音手把手带,开放到月底!

这个月一直在做的两件事&#xff0c;一个是带内部社员&#xff0c;去把抖音项目跑通。一个是招募合伙人。简单说下这两个事&#xff0c;之前一直没在公众号说。 带学员这件事&#xff0c;默认收徒只到月底。感兴趣的直接报名&#xff0c;价格4980。这块无需多言&#xff0c;做一…

如何解散微信群?这两个方法收藏好!

微信群&#xff0c;简单来说就是多人社交&#xff0c;能够让用户与多个人进行交流与互动。群主可以邀请有共同爱好的朋友在一个群里聊天、分享信息等等&#xff0c;以此来增强社交互动。 如果是一些临时活动群或者群成员已经不活跃的情况下&#xff0c;那么群主可能会选择将群…

mysql图片存取初探

mysql数据库中使用blob存储使用base64加密图片数据 前言 这个方法并不好&#xff0c;因为传输的数据量还是蛮大的&#xff0c;可以存一些诸如头像的小图片&#xff0c;但是如果要存较大的图片会很慢。 不过只是课程作业中简单的功能&#xff0c;这样子简单又快捷&#xff0c;…

各类深度学习框架详解+深度学习训练环境搭建-GPU版本

目录 前言 一、深度学习框架 TensorFlow PyTorch Keras Caffe PaddlePaddle 二、深度学习框架环境搭建 1.CUDA部署 CUDA特性 CUDA下载 2.cuDNN cuDNN 的主要特性 cuDNN 下载 3.安装TensorFlow框架 TensorFlow 2 旧版 TensorFlow 1 4.安装PyTorch框架 5.安装Ca…

MySQL字段加密方案 安当加密

要通过安当KSP密钥管理系统实现MySQL数据库字段的加密&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装和配置安当KSP密钥管理系统&#xff1a;首先&#xff0c;您需要安装安当KSP密钥管理系统&#xff0c;并按照说明进行配置。确保您已经正确地设置了密钥管理系统的用…

数据结构与算法之图: Leetcode 417. 太平洋大西洋水流问题 (Typescript版)

太平洋大西洋水流问题 https://leetcode.cn/problems/pacific-atlantic-water-flow/description/ 描述 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被…

Elsevier上传LaTeX修改稿常见问题解决方法

在撰写科研论文时&#xff0c;一般会使用latex或者word两种工具。在论文的返修阶段&#xff0c;很多期刊要求我们上传可编辑格式的稿件。word在上传到爱思唯尔系统中时候很方便&#xff0c;但latex是较为麻烦的&#xff0c;下面和大家分享一下我在上传latex手稿时遇到的一些问题…

【人工智能】LLM 大型语言模型和 Transformer 架构简介

目录 大型语言模型 (LLM) 一、LLM的起源 二、LLM的发展阶段 三、LLM的应用领域

torch.nn.Parameter()

一文通俗理解torch.nn.Parameter() 一、起源 首先&#xff0c;我写这篇文章的起源是因为&#xff0c;我突然看到了一段有关torch.nn.Parameter()的代码。 因此就去了解了一下这个函数&#xff0c;把自己的一些理解记录下来&#xff0c;希望可以帮到你。 二、官方文档 网址如下…

单目3D目标检测[基于几何约束篇]

基于语义和几何约束的方法 1. Deep3DBox 3D Bounding Box Estimation Using Deep Learning and Geometry [CVPR2017]https://arxiv.org/pdf/1612.00496.pdfhttps://zhuanlan.zhihu.com/p/414275118 核心思想&#xff1a;通过利用2D bounding box与3D bounding box之间的几何约…

直播录屏没有声音?解决方案来了!

在进行游戏直播、教程制作或在线会议录制时&#xff0c;有声音的录屏是至关重要的。然而&#xff0c;有时用户可能会面临直播录屏没有声音的问题。在本文中&#xff0c;我们将介绍两种常用的方法来解决这个问题&#xff0c;通过遵循下面的步骤&#xff0c;您将能够轻松地添加声…

Osgb转3DTiles工具

三维倾斜摄影生产主要格式为Osgb&#xff0c;目前三维模型主要展示场景为web&#xff0c;大部分使用框架都是Cesium库&#xff0c;格式为 3DTiles&#xff0c;目前市面上osgb转3DTiles的软件已经有好几个&#xff0c;付费免费都有。 先说免费软件&#xff1a; 1、CesiumLab …

SaaS是云计算服务,不是互联网平台

习惯性的把SaaS云计算服务&#xff0c;理解成平台&#xff0c;是不对的&#xff01; SaaS本质就是云计算服务&#xff0c;企业在saas应用系统里操作业务&#xff0c;背后都是各种云计算操作。 但是&#xff0c;中国的互联网环境就都是巨头平台所主导&#xff0c;所以大家基本…

华为OD机试 - 寻找最大价值的矿堆 - 矩阵(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多…

工具让公众号推送变得轻而易举

公众号运营的关键在于定期向用户推送内容&#xff0c;但手动推送过程繁琐且浪费时间。现在&#xff0c;有了乔拓云公众号助手工具&#xff0c;你可以轻松实现公众号的自动推送功能。让我们一起来看看如何操作吧&#xff01; 首先&#xff0c;你需要注册一个乔拓云公众号助手工具…

阿里云新品云服务器实例,经济型e实例,价格便宜,性价比高

前不久&#xff0c;阿里云推出了一款全新云服务器实例&#xff0c;他是阿里云面向个人开发者、学生、小微企业&#xff0c;在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器&#xff0c;基于“飞天CIPU”黄金技术架构设计&#xff0c;可轻松满足网站建设…

C语言指针详解——必备7大知识点

Part1指针是什么? 1.1 浅谈指针 理解指针的 两个要点&#xff1a; 指针是内存中一个最小单元的编号&#xff0c;也就是地址&#xff1b; 平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量。 总结&#xff1a;指针就是地址&#xff…

UPS负载箱的工作原理是什么?

UPS负载箱&#xff08;Uninterruptible Power Supply Load Bank&#xff09;内部包含一组电阻器&#xff0c;通过调节电阻值来模拟不同负载条件。当UPS供电时&#xff0c;电阻器会吸收一定的电能&#xff0c;从而模拟实际负载对UPS的需求。UPS负载箱配备了控制系统&#xff0c;…

2023年京东双11京享红包领取入口介绍

2023年京东双11京享红包领取入口介绍 抢京东2023年双11超级红包共计4步骤即可。在今天京东公布了2023年双11红包密令&#xff0c;这是最新准确有效的哦!建议大家提前收藏密令&#xff0c;开始时间是10月23日生效。具体的2波时间见后&#xff0c;下面跟随小编一起来看看抢红包教…