flex和bison笔记

文章目录

  • flex语法:
    • 定义部分:
    • 规则部分:
    • flex全局变量:
      • yyin:
  • bison和flex联合编译:

flex词法分析 bison语法分析

flex有两种使用方式,一种是flex单独做一个词法分析程序,另一种是flex和bison协同构建一个词法语法分析程序
我们在北大编译实践开源文档看到的显然就是第二种

一般来说,开发人员不需要关注flex和bison生成的.c文件,只需要关注.y文件和.l文件

flex语法:

一个.l文件的基本结构:

定义
%%
规则
%%
c语言辅助代码

这三部分的关系:

  • 定义一般是include头文件
  • 规则是正则表达式,flex会根据这部分来生成词法分析程序
  • 辅助代码会在规则处被调用,每按照识别一个单词,要做一些action,action就会用到辅助代码

定义部分:

%{ c语言代码 %}

可以是头文件:

%{
#include <stdio.h>
}

也可以去定义一些宏、常量、变量

%{
int num=0;
int chars=0;
%}

规则部分:

pattern { action }

pattern就是正则表达式,action就是匹配成功后要执行的c语言代码

正则表达式的语法:

//这个图说的还有一些不太清楚,此处多做一些说明:
连接:
我们学编译原理的时候在纸上写正则表达式,连接就是两部分写成前后就行了,但flex中要用+号连接,比如(1-9)+(0-9)*表示一个不能以0开头的数字,

action可以用定义部分定义的东西,也可以用辅助代码

flex对任何没有匹配到的字符,会自动做原样输出操作。因此,对于那些不需要将其输出,而是需要将其忽略的pattern,应该进行匹配并做无操作处理。

词法分析和语法分析其实是两层抽象,词法分析是从单个字符到词的抽象,语法分析是从词到语法成分的抽象。最终要将源代码抽象成一个树形结构存放在内存中,然后遍历才能做中间代码生成和目标代码生成

感觉需要去复习正则表达式的书写

flex全局变量:

全局变量是自动定义在lex.yy.c中,如果你在别的文件中想用的话应外部声明

yyin:

定义在lex.yy.c文件中:

FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;

bison和flex联合编译:

bison -d -o MySNL_BI.c MySNL_BI.y
flex MySNL_LEX.l
gcc -o snlc MySNL_BI.c lex.yy.c -lm

bison核心功能就是产生一个yyparse函数,flex核心功能就是产生一个yylex函数

.y中应该外部声明yylex()函数,否则bison编译过不去:

extern int yylex();

你在.y文件中放这个声明,然后这个声明就会出现在bison.c中,yyparse会自动调用这个yylex(),如果你忘记放了那么bison -d -o MySNL_BI.c MySNL_BI.y这一步bison就不知道yylex是啥那么就过不去

应该先编译bison再编译flex因为flex要用到bison中的token结构,
先编译bison时,bison也会用到flex中的东西比如yylex()这个函数还有一些全局变量,但是这些东西用外部声明就可以,编译能过,链接的时候来处理这些

然后编译flex,flex要用到bison中的%token定义以及一些全局变量,token定义通过include"bison.tab.h"来引入,然后其他全局变量也是外部声明,

然后main.c,可能用到flex全局变量和bison全局变量,都用外部声明,然后就是yyparse这个函数也是外部声明。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rbpf虚拟机-call指令

文章目录 一、概述背景知识 二、call 指令的主要方法2.1 注册辅助函数2.2 执行辅助函数 三、完整代码示例与详解3.1 示例辅助函数3.2 测试虚拟机的 call 指令测试代码代码解析 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [rbpf虚拟机-call指令] ❤博主广交技术…

Java构造函数与普通函数

1.概解 tips&#xff1a; 1.声明函数主要用public/private&#xff0c;public可以在其他函数中访问。 2.public后面跟函数返回类型&#xff0c;void表示无返回值。 3.main函数是自动执行的构造函数&#xff0c;而其他函数除非被调用则不会被自动执行 运行结果&#xff1a…

MySQL: 创建两个关联的表,用联表sql创建一个新表

MySQL: 创建两个关联的表 建表思路 USERS 表&#xff1a;包含用户的基本信息&#xff0c;像 ID、NAME、EMAIL 等。v_card 表&#xff1a;存有虚拟卡的相关信息&#xff0c;如 type 和 amount。关联字段&#xff1a;USERS 表的 V_CARD 字段和 v_card 表的 v_card 字段用于建立…

A2 最佳学习方法

记录自己想法的最好理由是发现自己的想法&#xff0c;并将其组织成可传播的形式 (The best reason for recording what one thinks is to discover what one thinks and to organize it in transmittable form.) Prof Ackoff 经验之谈&#xff1a; 做培训或者写文章&#xff…

六十天前端强化训练之第三十二天之Babel 转译配置大师级深度讲解

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、核心概念与知识体系详解 1. Babel 工作原理全景解析 二、完整配置方案&#xff08;带详细注释&#xff09; 1. 进阶版 .babelrc 配置 2. Webpack 集成配置&#xff08…

Linux 下安装和使用 Jupyter Notebook

Jupyter Notebook / Lab 是 Python 开发和数据分析中不可或缺的工具。为了避免环境污染&#xff0c;推荐使用虚拟环境方式安装并启动它。本教程将教你如何&#xff1a; 安装 Python、pip、venv使用虚拟环境安装 Jupyter设置登录密码启动并远程访问编写一个一键启动脚本&#x…

【云成本优化案例】K8s计费探针让跨境电商企业节省30%云预算

01. 财务“谜案”&#xff1a;消失的30%云预算 "我们的K8s集群资源利用率高达78%&#xff0c;但业务部门总说云账单对不上。"某跨境电商企业CTO的报案记录&#xff0c;揭开了一场云原生时代的财务谜案。该企业技术团队自查了所有资源配额和HPA配置&#xff0c;却始…

PyTorch 分布式训练(Distributed Data Parallel, DDP)简介

PyTorch 分布式训练&#xff08;Distributed Data Parallel, DDP&#xff09; 一、DDP 核心概念 torch.nn.parallel.DistributedDataParallel 1. DDP 是什么&#xff1f; Distributed Data Parallel (DDP) 是 PyTorch 提供的分布式训练接口&#xff0c;DistributedDataPara…

蓝桥杯[每日一题] 真题:连连看

题目描述 小蓝正在和朋友们玩一种新的连连看游戏。在一个 n m 的矩形网格中&#xff0c;每个格子中都有一个整数&#xff0c;第 i 行第 j 列上的整数为 Ai, j 。玩家需要在这个网格中寻找一对格子 (a, b) − (c, d) 使得这两个格子中的整数 Aa,b 和 Ac,d 相等&#xff0c;且它…

Linux环境下安装部署Docker

windows下连接Linux&#xff1a; 打开终端&#xff1a; //ssh远程连接 ssh root192.168.xx.xx//输入账号密码 root192.168.xx.xxs password: ssh连接成功&#xff01; 安装Docker&#xff1a; //安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 …

k近邻算法K-Nearest Neighbors(KNN)

算法核心 KNN算法的核心思想是“近朱者赤&#xff0c;近墨者黑”。对于一个待分类或预测的样本点&#xff0c;它会查找训练集中与其距离最近的K个样本点&#xff08;即“最近邻”&#xff09;。然后根据这K个最近邻的标签信息来对当前样本进行分类或回归。 在分类任务中&#…

Appium中元素定位之一个元素定位API

应用场景 想要对按钮进行点击&#xff0c;想要对输入框进行输入&#xff0c;想要获取文本框的内容&#xff0c;定位元素是自动化操作必须要使用的方法。只有获取元素之后&#xff0c;才能对这个元素进行操作。 在 Java 中使用 Appium 定位元素时&#xff0c;可以通过多种方式…

Dify 服务器部署指南

1. 系统要求 在开始部署之前&#xff0c;请确保你的服务器满足以下要求&#xff1a; 操作系统&#xff1a;Linux&#xff08;推荐使用 Ubuntu 20.04 或更高版本&#xff09;内存&#xff1a;至少 4GB RAM存储&#xff1a;至少 20GB 可用空间网络&#xff1a;稳定的互联网连接…

Sa-Token

简介 Sa-Token 是一个轻量级 Java 权限认证框架&#xff0c;主要解决&#xff1a;登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 官方文档 常见功能 登录认证 本框架 用户提交 name password 参数&#xff0c;调用登…

ADZS-ICE-2000和AD-ICE2000仿真器在线升级固件

作者的话 近期发现有些兄弟的ICE-2000仿真器链接DSP报错&#xff0c;然后test第四步不通过&#xff0c;我就拿我的仿真器也试了一下&#xff0c;发现ADI悄咪咪的在线升级仿真器固件&#xff0c;有些兄弟不会操作&#xff0c;就会导致仿真器升级失败&#xff0c;连不上目标板&a…

C++概述

1 什么是面向对象】 概念上来说&#xff1a;就是以对象(具体的变量)为导向的编程思路 专注于&#xff1a;一个对象具体能实现哪些过程(哪些功能) 面向对象 n * 面向过程 结论&#xff1a;面向对象需要做的事情 1&#xff1a;我们要想清楚&#xff0c;我们现在需要编写一个…

Java 大视界 -- 基于 Java 的大数据隐私计算在医疗影像数据共享中的实践探索(158)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

数字化如何赋能食品抽检全流程升级,助力食品安全监管现代化

食品安全是关乎民众健康和社会稳定的重要问题。食品抽检作为保障食品安全的核心监管手段&#xff0c;通过对食品生产、加工、销售等环节的随机抽样检测&#xff0c;及时发现潜在的食品安全问题&#xff0c;防止不合格产品流入市场&#xff0c;同时为政府监管、企业自查和消费者…

HBase入门教程

HBase入门教程 HBase是一个开源的、分布式的、版本化的非关系型数据库&#xff0c;是Apache Hadoop生态系统的重要组成部分。本文将全面介绍HBase的基础知识&#xff0c;帮助你快速入门。 文章目录 HBase入门教程1. HBase简介1.1 什么是HBase&#xff1f;1.2 HBase核心特点 2.…

vscode连接服务器失败问题解决

文章目录 问题描述原因分析解决方法彻底删除VS Code重新安装较老的版本 问题描述 vscode链接服务器时提示了下面问题&#xff1a; 原因分析 这是说明VScode版本太高了。 https://code.visualstudio.com/docs/remote/faq#_can-i-run-vs-code-server-on-older-linux-distribu…