编译原理实验 之 语法分析程序自动生成工具Yacc实验

news2025/7/18 0:15:21

文章目录

        • 实验环境准备
        • 复现实验例子
        • 分析总的文件架构
        • 实验任务

什么是Yacc

  • Yacc(Yet Another Compiler Compiler)是一个语法分析程序自动生成工具,Yacc实验通常是在编译原理相关课程中进行的实践项目,旨在让学生深入理解编译器的语法分析阶段以及掌握Yacc工具的使用
实验环境准备
  • 安装Yacc,(安装包可通过解压学习通下载的压缩包得到)

在这里插入图片描述

  • 全称一股脑下载即可,注意的是下载的路径和先前下载的MinGW的路径一致,我下载bison的时候默认的路径就是我下载MinGW的路径了,所以直接默认即可

在这里插入图片描述

  • 对于安装MinGWFlex以及配置环境变量,在Flex工具实验中以及配置完成,这里就不需要重复配置 ,如果还没配置完成,可以查看我先前的博客 编译原理 实验二 词法分析程序自动生成工具实验
复现实验例子
  • 实验名称:实验名称:结合flex工具实现简单表达式求值

Step 1:使用文本编辑器输入构词规则序列,文件名为token.l,格式见LEX工具实验。

%{
#include "expr.tab.h"
%}

%%
"q"   return STOP;
"("   return LP;
")"   return RP;
"\+"  return PLUS;
"\-"  return MINUS; 
"\*"  return MUL; 
"\/"  return DIV;

[0-9]+ {yylval=atoi(yytext); return DIGIT;} 
%%

运行命令:

flex token.l
  • 得到文件lex.yy.c

在这里插入图片描述

Step 2:使用文本编辑器输入上下文无关文法,文件名为expr.y。

  • expr.y文件
%{
#include <stdio.h>
%}
 
%token DIGIT STOP LP RP PLUS MINUS MUL DIV
 
%% 
start : expr STOP {printf("expr=%d\n", $1); exit(1);}
;
expr:expr PLUS expr {$$=$1+$3;}
|expr MINUS expr {$$=$1-$3;}
|expr MUL expr {$$=$1*$3;}
|expr DIV expr {$$=$1/$3;}
|LP expr RP {$$=$2; }
|DIGIT {$$=$1; }
;
%%

main(){
    printf("Type something followed by Return. Type 'q' to end.\n");
    printf("\n");
    return(yyparse());          /* Start the parser */
}
 
yyerror(s)
char *s; {
    printf("yacc error: %s\n", s);
}
 
yywrap(){
    return(0);
}

运行命令

bison -d expr.y
  • 得到文件expr.tab.c。如果调用bison(YACC)时使用『-d』选项,那么它们会输出到expr.tab.h中。

在这里插入图片描述

Step 3: 得到语法分析程序

运行命令

gcc  lex.yy.c  expr.tab.c  -o  expr
  • 得到可执行文件expr.exe,即语法分析程序

在这里插入图片描述

Step 4:使用语法分析程序分析输入文件

运行命令(下面的命令是CMD命令)

expr  <b.c>  a.txt

给出对应的PowerShell的等价运行指令

Get-Content b.c | expr > a.tx

在这里插入图片描述

当然,也可以通过命令行接收输入,直接运行expr程序即可

expr

在这里插入图片描述

  • 得到输出文件a.txt
分析总的文件架构

在这里插入图片描述

  • token.lFlex词法分析文件,定义词法规则,用于识别输入的token,每一个规则对应一个动作,返回相应的token类型
  • lex.yy.cFlex生成的C源文件,包含词法分析器的具体实现、输入缓冲区管理、模式匹配代码
  • expr.yYacc/Bison语法文件,定义语法规则和语义动作
  • expr.tab.hBison生成的头文件,供词法分析器使用的接口文件
  • expr.tab.cBison生成的C源文件
  • expr.exe:最终得到的语法分析程序
  • b.c:测试文件
  • a.txt:最终结果输出文件

文件之间的关系

1. token.l -(flex)-> lex.yy.c
2. expr.y -(bison)-> expr.tab.c + expr.tab.h
3. token.l 包含 expr.tab.h 以使用token定义
4. 最终所有.c文件被编译链接成可执行文件

工作流程

1. 词法分析器(lex.yy.c)读取输入,识别token
2. 语法分析器(expr.tab.c)根据语法规则构建语法树
3. 在归约过程中执行语义动作,计算表达式值
4. 最终输出计算结果
实验任务

在这里插入图片描述

任务1:根据expr.y所定义的文法,写出对应的无二义性的文法,设计输入验证这个原本的二义性文法的错误,以及你的无二义性文法的正确性

  • 原始的expr.y所定义的文法
%% 
start : expr STOP {printf("expr=%d\n", $1); exit(1);}
;
expr:expr PLUS expr {$$=$1+$3;}
|expr MINUS expr {$$=$1-$3;}
|expr MUL expr {$$=$1*$3;}
|expr DIV expr {$$=$1/$3;}
|LP expr RP {$$=$2; }
|DIGIT {$$=$1; }
;
%%
  • Yacc/Bison中,运算符的优先级和结合性遵循以下规则
- 在同一层级的产生式中,先出现的规则优先级较低
- 所以在当前文法中从上到下优先级依次增加:
  1. expr PLUS expr  (最低)
  2. expr MINUS expr
  3. expr MUL expr
  4. expr DIV expr   (最高)

显而易见!!!

  • 既然老师让我们写出对应的无二义性文法,所以上面的那个肯定是有二义性的,那么具体怎么改,直接GPT
  • 但是我们要写出测试用例证明这个是错的,在这里,我稍微给一点提示(a-b-ca/b/c)就是连续的减和连续的除法可以验证上面的文法是错误的,上面的a,b,c大家可以替换为具体的数字进行测试,但是为了让老师看出我们确实是思考的,可以把对应的a,b,c数字不要简单弄个1,2,3之类的

任务2:自行设计无二义性文法

  • 这个大家就自行设计啦!!!

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

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

相关文章

从“山谷论坛”看AI七剑下天山

始于2023年的美国山谷论坛(Hill and Valley Forum)峰会,以“国会山与硅谷”命名,寓意连接科技界与国家安全战略。以人工智能为代表的高科技,在逆全球化时代已成为大国的致胜高点。 论坛创办者Jacob Helberg,现在是华府的副国务卿,具体负责经济、环境和能源事务。早先曾任…

C——数组和函数实践:扫雷

此篇博客介绍用C语言写一个扫雷小游戏&#xff0c;所需要用到的知识有&#xff1a;函数、数组、选择结构、循环结构语句等。 所使用的编译器为:VS2022。 一、扫雷游戏是什么样的&#xff0c;如何玩扫雷游戏&#xff1f; 如图&#xff0c;是一个标准的扫雷游戏初始阶段。由此…

sui在windows虚拟化子系统Ubuntu和纯windows下的安装和使用

一、sui在windows虚拟化子系统Ubuntu下的安装使用&#xff08;WindowsWsl2Ubuntu24.04&#xff09; 前言&#xff1a;解释一下WSL、Ubuntu的关系 WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软推出的一项功能&#xff0c;允许用户在 Windows 系统中原生运行…

智能合约在去中心化金融(DeFi)中的核心地位与挑战

近年来&#xff0c;区块链技术凭借其去中心化、不可篡改等特性&#xff0c;在全球范围内掀起了技术革新浪潮。去中心化金融&#xff08;DeFi&#xff09;作为区块链技术在金融领域的重要应用&#xff0c;自 2018 年以来呈现出爆发式增长态势。据 DeFi Pulse 数据显示&#xff0…

有关SOA和SpringCloud的区别

目录 1. 定义 2. 架构风格 3. 技术栈 4. 服务交互 5. 适用场景 前言 面向服务架构&#xff08;SOA&#xff09;是一种软件设计风格&#xff0c;它将应用程序的功能划分为一系列松散耦合的服务。这些服务可以通过标准的通信协议进行交互&#xff0c;通常是HTTP或其他消息传…

学习搭子,秘塔AI搜索

什么是秘塔AI搜索 《秘塔AI搜索》的网址&#xff1a;https://metaso.cn/ 功能&#xff1a;AI搜索和知识学习&#xff0c;其中学习部分是亮点&#xff0c;也是主要推荐理由。对应的入口&#xff1a;https://metaso.cn/study 推荐理由 界面细节做工精良《今天学点啥》板块的知…

IBM BAW(原BPM升级版)使用教程第六讲

续前篇&#xff01; 一、事件&#xff1a;Undercover Agent 在 IBM Business Automation Workflow (BAW) 中&#xff0c;Undercover Agent (UCA) 是一个非常独特和强大的概念&#xff0c;旨在实现跨流程或系统的事件处理和触发机制。Undercover Agent 主要用于 事件驱动的流程…

高并发PHP部署演进:从虚拟机到K8S的DevOps实践优化

一、虚拟机环境下的部署演进 1. 低并发场景&#xff08;QPS<10&#xff09;的简单模式 # 典型部署脚本示例 ssh userproduction "cd /var/www && git pull origin master" 技术痛点&#xff1a; 文件替换期间导致Nginx返回502错误&#xff08;统计显示…

VBA高级应用30例应用4:利用屏蔽事件来阻止自动运行事件

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

Centos 7.6 安装 Node.js 20 的环境配置记录

Centos 7.6 安装 Node.js 20 的环境配置记录 Centos 7在 2024 年的 6 月 30 号已经停止维护了&#xff0c;但是由于时代原因&#xff0c;很多服务还是跑在这个系统上。本篇博文记录如何在 Centos 7.6 上安装 Node20。 初步安装 node 下载 node.js 的 Linux 版本 cd ~ curl -O h…

springboot3 + mybatis-plus3 创建web项目实现表增删改查

Idea创建项目 环境配置说明 在现代化的企业级应用开发中&#xff0c;合适的开发环境配置能够极大提升开发效率和应用性能。本文介绍的环境配置为&#xff1a; 操作系统&#xff1a;Windows 11JDK&#xff1a;JDK 21Maven&#xff1a;Maven 3.9.xIDE&#xff1a;IntelliJ IDEA…

【人工智能学习之动作识别TSM训练与部署】

【人工智能学习之动作识别TSM训练与部署】 基于MMAction2动作识别项目的开发一、MMAction2的安装二、数据集制作三、模型训练1. 配置文件准备2. 关键参数修改3. 启动训练4. 启动成功 ONNX模型部署方案一、环境准备二、执行转换命令 基于MMAction2动作识别项目的开发 一、MMAct…

sqli-labs靶场18-22关(http头)

目录 less18&#xff08;user-agent&#xff09; less19&#xff08;referer&#xff09; less20&#xff08;cookie&#xff09; less21&#xff08;cookie&#xff09; less22&#xff08;cookie&#xff09; less18&#xff08;user-agent&#xff09; 这里尝试了多次…

Android系统架构模式分析

本文系统梳理Android系统架构模式的演进路径与设计哲学&#xff0c;希望能够借此探索未来系统的发展方向。有想法的同学可以留言讨论。 1 Android层次化架构体系 1.1 整体分层架构 Android系统采用五层垂直架构&#xff0c;各层之间通过严格接口定义实现解耦&#xff1a; 应用…

Web前端VSCode如何解决打开html页面中文乱码的问题(方法2)

Web前端—VSCode如何解决打开html页面中文乱码的问题&#xff08;方法2&#xff09; 1.打开VScode后&#xff0c;依次点击 文件 >> 首选项 >> 设置 2.打开设置后&#xff0c;依次点击 文本编辑器 >> 文件&#xff08;或在搜索框直接搜索“files.autoGuessEnc…

单调栈模版型题目(3)

单调栈型题目贡献法 基本模版 这是数组a中的 首先我们要明白什么叫做贡献&#xff0c;在一个数组b{1,3,5}中&#xff0c;连续包含1的连续子数组为{1}&#xff0c;{1,3}&#xff0c;{1,3,5}&#xff0c;一共有三个&#xff0c;这三个数一共能组成6个连续子数组&#xff0c;而其…

ts axios中报 Property ‘code‘ does not exist on type ‘AxiosResponse<any, any>‘

ts语法有严格的格式&#xff0c;如果我们在处理响应数据时&#xff0c;出现了axios响应中非默认字段&#xff0c;就会出现标题那样的警告&#xff0c;我们可以通过创建axios.dt.ts解决这个问题 下面是我在开发中遇到的警告&#xff0c;code并不是axios默认返回的字段&#xff0…

[AI Tools] Dify 工具插件上传指南:如何将插件发布到官方市场

Dify 作为开源的 LLM 应用开发平台,不仅支持本地化插件开发,也提供了插件市场机制,让开发者能够将自己构建的插件发布并供他人使用。本文将详细介绍如何将你开发的 Dify Tools 插件上传至官方插件市场,包括 README 编写、插件打包、仓库 PR 等核心步骤。 一、准备 README 文…

用react实现一个简单的三页应用

下面是一个使用 React Router 的简单示例&#xff0c;演示了如何在 React 应用中实现页面之间的导航。 &#x1f6e0;️ 第一步&#xff1a;使用 Vite 创建项目 npm create vitelatest my-router-app -- --template react cd my-router-app npm install&#x1f680; 第二步&a…

Go使用Gin写一个对MySQL的增删改查服务

首先用SQL创建一个包含id、name属性的users表 create table users (id int auto_incrementprimary key,name varchar(255) null );查询所有用户信息&#xff1a; func queryData(db *sql.DB, w http.ResponseWriter) {rows, err : db.Query("SELECT * FROM users"…