自顶向下的语法分析器

一、问题及解决:

  • 什么是Dictionary File

在这里插入图片描述

   这种类型的文件为Windows虚拟PC 2007,虚拟机,它允许一些版本的Windows在一台计算机上运行生成。它包括像发音和单词的定义以及各种语言,如德国和法国的辞典数据。

  • 如何实现语法分析器?

    • 词法分析器

      • c l a n g . l e x clang.lex clang.lex 增补需要识别的词法单元(do、while、%),并在 l e x . y y . h lex.yy.h lex.yy.h 定义(%需要转义[%%])
      • 这里对 ‘%’ 做了简化,按照与 *、/ 同优先级处理,实际优先级:乘除(*/)>取余(%)> 加减(+ -)
    • 左递归和公共左因子的处理

      • p a r s e r . c p p parser.cpp parser.cpp 初始版本的处理存在左递归和公共左因子,需要改造成 L L ( 1 ) LL(1) LL(1)文法(消除递归可以进一步化简)
    • First集与Follow集

      • 注意产生式符合 A − > α B β ,   β − > ϵ A -> \alpha B \beta,\ \beta->\epsilon A>α, β>ϵ 的情况,要将follow(A)加到follow(B)中

        C →	+ term C | - term C | ɛ 
        
    • 预测分析器

      • 编译
      ./flex clang.tex  				/*更新*/
      gcc lex.yy.c parser.cpp -o p    /*两个文件一起*/
      
      • 运行
      ./flex clang.lex
      
    • if语句二义性的处理

      • 对提取左公因子的式子:

        stmtif ( bool ) stmt else_part | 其它语句

        else_partelse stmt | ɛ

        如果 l o o k a h e a d lookahead lookahead 是词法单元 e l s e else else时,使用产生式 e l s e _ p a r t → e l s e s t m t else\_part→ else stmt else_partelsestmt;否则使用产生式 e l s e _ p a r t → ϵ else\_part→ \epsilon else_partϵ

二、实验结果:

程序片断:

{
i = 2;
   sum = 0;
	   while (i <=100) 	{
	   	   sum = sum + i;
		   i = i + 2;
          if(i%50==0) break;
	   }
}

打印产生式如下:

在这里插入图片描述

附:

提取公共左因子:

program → 	block
block 	→	{ stmts }
stmts 	→  	stmt stmts | ɛ
stmt 	→	id = expr ; 
        |	if ( bool ) stmt A
        |	while (bool) stmt 
        |	do stmt while (bool ) ; 
        |	break; 
        |	block
 A		→	else stmt | ɛ
bool 	→ 	expr B
 B	 	→ 	relop expr | ɛ
expr 	→ 	expr C | term
 C 		→   + term | - term 
term 	→ 	term D | factor
 D 		→ 	* factor | 	/ factor | % factor
factor	→ 	( expr ) | id | num

消除直接左递归:

program → 	block
block 	→	{ stmts }
stmts 	→  	stmt stmts | ɛ
stmt 	→	id = expr ; 
        |	if ( bool ) stmt A
        |	while (bool) stmt 
        |	do stmt while (bool ) ; 
        |	break; 
        |	block
 A		→	else stmt | ɛ
bool 	→ 	expr B
 B	 	→ 	relop expr | ɛ
expr 	→ 	term C
 C		→	+ term C  | - term C | ɛ 
term 	→	factor D
 D		→	* factor D | / factor D| % factor D| ɛ 
factor	→ 	( expr ) | id | num

First集:

first(program) = first(block) = {'{'};
first(stmts) = first{id, if, while, do, break, '{', ɛ};
first(stmt) = {id, if, while, do, break, '{'};
first(A) = {else, ɛ};
first(bool) = first(expr) = first(term) = first(factor) = {'(', id, num};
first(B) = {relop, ɛ};
first(C) = {+, -, ɛ};
first(D) = {*, /, %, ɛ};

Follow集:

follow(program) = {$};
follow(block) = {$, id, if, while, do, break, '{', '}', else};
follow(stmts) = {'}'};
follow(stmt) = {id, if, while, do, break, '{', '}', else};
follow(A) = {id, if, while, do, break, '{', '}', else, '}'};
follow(bool) = {')'};
follow(B) = {')'};
follow(expr) = {relop, ';', ')'};
follow(C) = {relop, ';', ')'};
follow(term) = {+, -, relop, ';', ')'};
follow(D) = {+, -, relop, ';', ')'};
follow(factor) = {+, -, relop, ';', ')', *, /, %};

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

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

相关文章

2024/4/15 AD/DA

AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号 DA&#xff08;Digital to Analog&#xff09;&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换为模拟信号 AD/DA转换打开了计算…

代码学习记录42---动态规划

随想录日记part42 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.14 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;最长递增子序列 &#xff1b;最长连续递增序列 &#xff1b;最长重复子数组 ;最长公…

5G网络开通与调测ipv4

要求如下&#xff1a; 1. 勘站规划 1. 【重】首先观察NR频点&#xff0c;完成设备选型 2645--选择N41 3455--选择N78 4725--选择N79 设备选型如下&#xff1a;观察AAU的通道数&#xff0c;最大发射功率&#xff1b;选择N41的选型频段也要选41 2. …

算法:位运算

算法&#xff1a;位运算 常见位运算操作基本题型模拟加法数字查找总结 常见位运算操作 在C/C中&#xff0c;有比较丰富的位运算操作符&#xff0c;常见的有&#xff1a; &&#xff1a;按位与 |&#xff1a;按位或 ~&#xff1a;按位取反 ^&#xff1a;按位异或 <<&a…

stm32开发之threadx+modulex组合开发使用记录

前言 参考博客 论坛官方资料: 微软开发板核心芯片使用的是stm32f407zgtx&#xff0c;烧录工具使用的是jlink模块的构建使用的是脚本进行构建网上针对modulex的资料较少&#xff0c;这里做个记录 项目结构 逻辑框架 主程序代码 主函数 /** Copyright (c) 2024-2024&#xff0…

ansible创建用户账户和更新ansible库的密钥

1.创建⽤户帐户 从 http://materials/user_list.yml 下载要创建的⽤户的列表&#xff0c;并将它保存到 /home/greg/ansible 在本次考试中使⽤在其他位置创建的密码库 /home/greg/ansible/locker.yml 。创建名为 /home/greg/ansible/users.yml 的 playbook &#xff0c;从⽽…

空指针与野指针的辨析

空指针 空指针不指向任何实际的对象或者函数&#xff0c;反过来&#xff0c;任何的对象或者函数也不可能是空指针。 在程序中得到空指针的办法就是使用预定义的NULL&#xff0c; int *ip NULL; 校验一个指针是否为空指针可以用 if (ip NULL) NULL是标准规定的宏定义&am…

使用spring-ai快速对接ChatGpt

什么是spring-ai Spring AI 是一个与 Spring 生态系统紧密集成的项目&#xff0c;旨在简化在基于 Spring 的应用程序中使用人工智能&#xff08;AI&#xff09;技术的过程。 简化集成&#xff1a;Spring AI 为开发者提供了方便的工具和接口&#xff0c;使得在 Spring 应用中集…

Unity类银河恶魔城学习记录12-13 p135 Merge Skill Tree with Dogge skill源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​​​​​​ Inventory.cs using System.Collections.Generic; using Un…

链表-双指针-虚拟节点-力扣

链表--双指针--虚拟节点 力扣 142 环形链表求循环起点 重点力扣 21 合并两个有序链表力扣 86 分割链表力扣23 合并K个有序链表 -- 优先队列&#xff08;二叉堆 小顶堆&#xff09;重点力扣19 找倒数第N个元素 快慢指针 一次遍历 重点力扣876 快慢指针找中间节点力扣 160 相交链…

28、链表-两数相加

思路&#xff1a; 有几个方面需要考虑 双指针遍历&#xff0c;如果出现和大于10那么向前进1如果长度不一样那么长的部分直接落下并且考虑进1 的问题 代码如下&#xff1a; class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {if (l1null||l2null){…

网络编程【InetAddress , TCP 、UDP 、HTTP 案例】

day38上 网络编程 InetAddress 理解&#xff1a;表示主机类 一个域名 对应 多个IP地址 public static void main(String[] args) throws UnknownHostException {//获取本机的IP地址 // InetAddress localHost InetAddress.getLocalHost(); // System.out.println(localHos…

前端标记语言HTML

HTML&#xff08;HyperText Markup Language&#xff09;是一种用于创建网页的标准标记语言。它是构建和设计网页及应用的基础&#xff0c;通过定义各种元素和属性&#xff0c;HTML使得开发者能够组织和格式化文本、图像、链接等内容。 HTML的基本结构 文档类型声明&#xff0…

终端工具命令行颜色配置(解决终端工具连上服务器之后,无颜色问题)

本期主题&#xff1a; 讲解使用mobaxterm等终端工具连上服务器&#xff0c;但是命令行没有颜色的问题 目录 1. 问题描述2. 原因解释3.测试 1. 问题描述 使用终端工具&#xff08;Mobaxterm等&#xff09;连上服务器之后&#xff0c;发现终端工具没有颜色&#xff0c;如下图&am…

基于java的社区生活超市管理系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

YOLOv9/YOLOv8算法改进【NO.117】 使用Wasserstein Distance Loss改进小目标的检测效果

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 首推…

基于Python豆瓣电影数据可视化分析系统的设计与实现

大数据可视化项目——基于Python豆瓣电影数据可视化分析系统的设计与实现 2024最新项目 项目介绍 本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示&#xff0c;构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据&#xff0c;我们提供了…

bugku-web-文件包含2

页面源码 <!-- upload.php --><!doctype html><html><head><meta charset"utf-8"/><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

Springboot+Vue项目-基于Java+MySQL的高校心理教育辅导系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

算法中的复杂度(先做个铺垫)

文章目录 定义与分类时间复杂度概念大O的渐进表示法举例情况注意内涵 空间复杂度最优解 定义与分类 复杂度&#xff1a;衡量算法效率的标准时间效率&#xff1a;衡量这个算法的运行速度&#xff0c;也就是我们常说的时间复杂度空间效率&#xff1a;衡量这个算法所需要的额外空…