词法语法语义分析程序设计及实现,包含出错提示和错误恢复

词法说明

(1)关键字
main, int, char, if, else, for, while, void

(2)运算符
= + - * / < <= > >= == !=

(3)界符
; ( ) { }

(4)标识符
ID = letter(letter|digit)*

(5)整型常数
NUM = digit digit*

(6)空格
‘ ‘ ‘\n’ ‘\r’ ‘\t’
空格用来分隔ID,NUM,运算符,界符和关键字

上下文无关文法描述

<程序> ::= main()<语句块>
<语句块> ::= ‘{’<语句串>‘}’
<语句串> ::= <语句>{;<语句>};
<语句> ::= <赋值语句> | <条件语句> | <循环语句>
<赋值语句> ::= ID=<表达式>
<条件语句> ::= if(<条件>) <语句块>
<循环语句> ::= while(<条件>) <语句块>
<条件> ::= <表达式><关系运算符><表达式>
<因子> ::= ID | NUM | (<表达式>)
<项> ::= <因子>{*<因子> | /<因子>}
<表达式> ::= <项>{+<项> | -<项>}
<关系运算符> ::= < | <= | > | >= | == | !=

单词的种别编码方案

在这里插入图片描述

词法分析程序的主要算法思想

  1. 设置单词种别码
  2. 用正规式编写词法规则
  3. 根据正规式构造出识别语言单词的状态转换图
  4. 让状态转换图中的每一个状态对应一小段程序,根据扫描到单词符号的第一个字种类,拼出相应的单词符号
    在这里插入图片描述
    在这里插入图片描述

语法分析方法的算法思想的详细描述

递归下降语法分析

  1. 根据程序语言规则编写上下文无关文法
  2. 对每一个非终结符构造分析函数,根据前导符号来指导函数的选择,识别该非终结符所表示的语法成分。当该非终结符的规则有多个时,按LL(1)文法的条件能唯一地选择一个候选规则。
    ①遇到终结符号a时:if(当前输入符号==a)读入下一个输入符号
    ②遇到非终结符号A时:调用A();
    ③遇到规则A → ε: if(当前输入符号ϵFOLLOW(A)){ } else error()

语义分析方法的算法思想的详细描述

递归下降语法制导翻译

将语义子程序嵌入到每个递归过程中,通过递归子程序内部的局部量和参数传递语义信息。

  1. 每个A构造一个函数,函数的返回值为A的综合属性;出现在A的产生式中的每个符号X的每个属性都在函数中设一个局部变量;
  2. A的函数过程中,根据当前输入符号决定使用哪个候选式;
  3. 每个产生式对应的程序代码,按照从左到右的顺序,对b、B、{}分别进行:
    (1)对带综合属性x的终结符b,存x的值到相应变量中;产生一个匹配b的调用,继续读入下一个输入符号。
    (2)对每个B,产生一个右边带有函数调用的赋值语句c:=B(),其中c为B的综合属性对应变量。
    (3)对{},把动作代码抄进分析器中,用代表属性的变量来代替对属性的每一次引用。

赋值语句翻译

在表达式分析函数和项分析函数中加入赋值语句语义分析程序,为每个子表达式和项生成四元式,在表达式分析函数中下一个读取到的符号仍然为‘+’或‘-’则生成临时变量存储计算结果并继续生成四元式,项分析函数中则读取到符号为‘*’或‘-’则继续生成四元式,算法与表达式分析函数同理。

if语句翻译

在条件语句分析函数中加入if语句翻译处理,为if语句生成两条四元式,分别为条件成立的跳转和条件不成立的跳转四元式,这里应注意通过ntc、nfc、nNXQ变量记录真链、假链和下一条语句的生成式位置,先将nNXQ通过bp()函数回填到ntc所指四元式中,再在if语句语法分析的末尾将if语句的结束位置回填到nfc所指四元式中。

while语句翻译

while语句翻译和if语句相似,但要注意while语句语法分析结束后的处理和if不同,因为while语句若条件继续成立就会继续执行,所以要在末尾多生成一个跳转四元式跳转回while的条件判断四元式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea自动注释

前言 保存一下自己的自动注释代码 idea自动注释 前言1 创建类时&#xff0c;自动生成注释2 在方法上使用快捷键生成注释3 使用方法4 效果图 1 创建类时&#xff0c;自动生成注释 如下&#xff1a; #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package …

亚马逊美国站ASTM F2613儿童折叠椅和凳子强制性安全标准

ASTM F2613折叠椅和凳子安全标准 美国消费品安全委员会&#xff08;CPSC&#xff09;发布的ASTM F2613儿童折叠椅和凳子的强制性安全标准&#xff0c;已于2020年7月6日生效&#xff0c;并被纳入联邦法规《16 CFR 1232儿童折叠椅和凳子安全标准》。 亚马逊要求在美国站上架的儿…

数据库基础面试第三弹

1. mysql数据库四种常见数据库引擎 1. MyISAM&#xff1a; MyISAM是MySQL最早的数据库引擎之一。它被设计成处理大量的插入和查询操作。MyISAM表格的数据存储在三个文件上&#xff1a;.frm文件存储表结构&#xff0c;.MYD文件存储数据&#xff0c;.MYI文件存储索引。MyISAM表…

【2023年12月18日-12月25日】一周AI咨询更新

上周&#xff0c;关于Google的Bard和Midjourney v6的讨论异常火热。 接下来&#xff0c;让我们回顾一下上周那些引人注目的AI新闻。 ① 已近乎真实拍摄&#xff1a;Midjourney v6的画质令人惊叹 由Midjourney v6制作的图片&#xff0c;质量之高&#xff0c;媲美电影级别&…

Spring高手之路-SpringBean的生命周期

目录 SpringBean的生命周期 整体介绍 详细介绍 1.实例化Bean 2.设置属性值 3.检查Aware 4.调用BeanPostProcessor的前置处理方法 5.调用InitializingBean的afterPropertiesSet方法 6.调用自定义init-method方法 7.调用BeanPostProcessor的后置处理方法 8.注册Destru…

【小黑嵌入式系统第十三课】PSoC 5LP第二个实验——中断控制实验

上一课&#xff1a; 【小黑嵌入式系统第十二课】μC/OS-III程序设计基础&#xff08;二&#xff09;——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量 文章目录 1 实验目的2 实验要求3 实验设备4 实验原理4.1 中断(1) 中断机制概述(2) 中断源(3) 中断系统的功…

JMeter(十五)-JMeter监听器

十五、JMeter监听器 1.简介 监听器用来监听及显示JMeter取样器测试结果&#xff0c;能够以树、表及图形形式显示测试结果&#xff0c;也可以以文件方式保存测试结果&#xff0c;JMeter测试结果文件格式多样&#xff0c;比如XML格式、CSV格式。默认情况下&#xff0c;测试结果将…

stm32学习笔记:TIM-定时中断和外部时钟

定时器四部分讲解内容&#xff0c;本文是第一部分 ​​​​​TIM简介 基本定时器 时基单元&#xff1a;预分频器、计数器、自动重装载寄存器 预分频器之前&#xff0c;连接的就是基准计数时钟的输入&#xff0c;由于基本定时器只能选择内部时钟&#xff0c;所以可以认为这根…

最小覆盖子串(LeetCode 76)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路参考文献 1.问题描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t 中重复字符&#xff…

【DeepLearning】Deep Residual Learning for Image Recognition恺神大作学习

[TOC] Deep Residual Learning for Image Recognition 论文 1. 文章主要想解决什么问题&#xff0c;用了什么方法 深度神经网络在训练过程中的3个关键问题&#xff1a; 梯度消失/爆炸问题&#xff1a;随着网络层数的增加&#xff0c;梯度在反向传播过程中可能会变得非常小&a…

1.SQL - 概述

1. SQL语句分类 • 数据定义语言&#xff1a;简称DDL(Data Definition Language)&#xff0c;用来定义数据库对象&#xff1a;数据库&#xff0c;表&#xff0c;列等。关键字&#xff1a;create&#xff0c;alter&#xff0c;drop等 • 数据操作语言&#xff1a;简称DML(Data …

Spring 依赖注入概述、使用以及原理解析

前言 源码在我github的guide-spring仓库中&#xff0c;可以克隆下来 直接执行。 我们本文主要来介绍依赖注入的使用示例及其原理 依赖注入 什么是依赖注入 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;它用于实现对…

【操作系统】探究文件系统奥秘:创建proc文件系统的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;Linux专栏&#xff1a;《探秘Linux | 操作系统解密》⏰诗赋清音&#xff1a;月悬苍穹泛清辉&#xff0c;梦随星河徜徉辉。情牵天际云千层&#xff0c;志立乘风意自飞。 ​ 目录 &a…

Vue3使用的Compostion Api和Vue2使用的Options Api有什么不同?

我们介绍Compostion Api和Options Api的区别之前&#xff0c;先来说一下为什么会推出来Composition Api&#xff0c;解决了什么问题&#xff1f; Vue2开发项目使用Options Api存在的问题 代码的可读性和维护性随着组件的变大业务的增多而变得差代码的共享和重用性存在缺点不支…

【centos】【golang】安装golang

下载安装包 方法1&#xff1a; 打开 https://go.dev/dl/ &#xff1b;点击下载golang的安装包&#xff1b;再使用ssh传到centos上&#xff08;略&#xff09; 方法2&#xff1a;能使用Google就可以这样 wget https://dl.google.com/go/go1.21.5.linux-amd64.tar.gz解压安装包…

渗透测试——1.4主动扫描

主动扫描是别人可以发觉的情报收集 一、nmap的使用 1.nmap<目标主机>:最常用的扫描方式 有nmap版本、扫描时间 “host is up”表示目标主机处于开机状态、“not shown”未开放端口 有四个端口是开的&#xff08;135.139.445.912&#xff09; 2.nmap -p<端口范围…

3.docker 安装失败

1、错误描述 2、报错前操作 ① 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken ② 更新本地镜像源 # 设置docker镜像源 yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo…

【贪心算法】专题练习一

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 前言 1.什么是贪心算法&#xff1f;——贪婪鼠目寸光 贪心策…

MIT 6.S081---Lab util: Unix utilities

环境搭建 基本环境 选择的是Vmwareubuntu的配置&#xff0c;注意ubuntu的版本一定要是20.04&#xff0c;作者试过16版本&#xff0c;不行&#xff0c;建议直接安装20.04版&#xff0c;不然环境配置都浪费不少时间有点得不偿失。&#xff08;Vmware可以用Virtualbox代替&#…

普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)

简介 搭建一个用于驱动 STM32F103ZET6 GPIO点亮LED灯的任务;电路原理图 LED电路原理图 芯片引脚连接LED驱动引脚原理图 创建一个点亮LED灯的Keil 5项目 创建STM32CubeMX项目 New Project -> 单击 -> 芯片搜索STM32F103ZET6->双击创建 初始化时钟 初始化LED G…
最新文章