当前位置: 首页 > news >正文

Flex和Bison

Flex和Bison是Linux和Unix环境下两个非常强大的工具,分别用于生成词法分析器和语法分析器。它们在编译器设计、文本处理等领域有着广泛的应用。下面我将详细介绍Flex和Bison的基本概念、功能、用法以及它们之间的关系。

一、Flex

1. 基本概念

Flex(其前身是Lex)是一个词法分析器生成器。它接受一组正则表达式和对应的动作(通常是C语言代码),然后生成一个C程序(词法分析器),该程序能够识别和处理输入文本中的词法单元(如标识符、关键字、运算符等)。

2. 功能

  • 词法分析:将输入文本分割成一个个词法单元(token),每个单元都具有一定的意义。
  • 正则表达式匹配:使用正则表达式在输入文本中查找特定的字符模式。
  • 动作执行:当匹配到正则表达式时,执行相应的动作(如计数、打印等)。

3. 用法

Flex的使用通常包括以下几个步骤:

  • 编写Flex程序(.l文件),定义正则表达式和对应的动作。
  • 使用Flex工具编译Flex程序,生成C语言源代码(通常是lex.yy.c)。
  • 编译生成的C代码,并链接必要的库(如libfl),生成可执行文件。
  • 运行可执行文件,对输入文本进行词法分析。

4. Flex程序示例

%{  
#include <stdio.h>  
#include "y.tab.h" /* 假设与bison一起使用,包含由bison生成的头文件 */  void count() {  /* 这里可以添加一些用于调试或统计的代码 */  
}  
%}  %option noyywrap  %%  /* 关键字 */  
PROGRAM|VAR|VAR_INPUT|VAR_OUTPUT|VAR_IN_OUT|VAR_EXTERNAL|TEMP|TEMP_VAR|END_PROGRAM|  
BEGIN_PROGRAM|END_VAR|BEGIN_VAR|END_STRUCT|BEGIN_STRUCT|FUNCTION_BLOCK|FUNCTION|  
METHOD|INTERFACE|END_INTERFACE|END_FUNCTION_BLOCK|END_FUNCTION|END_METHOD|  
TRUE|FALSE|VAR_ACCESS|AT|RETAIN|CONSTANT|TYPE|ALIAS|ARRAY|STRUCT|OF|POINTER|  
REF_TO|MOD|DIV|AND|OR|XOR|NOT|SHL|SHR|ROL|ROR|ASGN|ADD|SUB|MUL|REAL|INT|BOOL|  
STRING|TIME|DATE|DURATION|LREAL|DINT|UINT|SINT|BYTE|WORD|DWORD|LWORD|USINT|  
S5TIME|TIME_OF_DAY|DATE_AND_TIME|TIMESTAMP|TOD|DT|TS { return yytext[0]; }  /* 标识符 */  
[a-zA-Z_][a-zA-Z0-9_]*   { yylval.str = strdup(yytext); return IDENTIFIER; }  /* 数字(整数和浮点数) */  
[0-9]+(\.[0-9]+)?([eE][-+]?[0-9]+)? { yylval.double_val = atof(yytext); return NUMBER; }  /* 字符串 */  
\"([^\\\"\n]|(\\.))*\"   { yylval.str = strdup(yytext+1); yylval.str[strlen(yylval.str)-1] = '\0'; return STRING; }  /* 注释(单行和多行) */  
//.*    { /* 忽略单行注释 */ }  
/* 和多行注释可能需要更复杂的规则来处理嵌套,但这里简化处理 */  
/\/*([^*]|\*+[^/*])*\*/ { /* 忽略多行注释 */ }  /* 空白字符 */  
[ \t\n]+   { /* 忽略 */ }  /* 操作符和分隔符 */  
[:=.,;(){}\[\]+-*/%<>^|&!~]   { return yytext[0]; }  /* 其他字符 */  
.           { fprintf(stderr, "Unknown character '%s'\n", yytext); return ERROR; }  %%  int yywrap(void) {  return 1;  
}  int main(void) {  yylex();  return 0;  
}  /* 注意:  
1. 关键字列表可能不完整,需要根据实际的ST语言规范进行扩展。  
2. 注释的处理可能需要更复杂的Flex规则来正确处理嵌套注释,但这里为了简化而省略了。  
3. 确保yylval的结构和类型与你的解析器(如bison生成的)兼容。  
4. 编译时可能需要链接到flex库和bison生成的解析器。  
*/

在这个Flex程序中,我定义了几个部分来匹配ST语言的关键元素:

  • 关键字:列出了ST语言中可能使用的一些关键字。注意,这里的关键字列表是不完整的,你需要根据实际的ST语言规范进行扩展。
  • 标识符:匹配以字母或下划线开头,后跟字母、数字或下划线的字符串。
  • 数字:匹配整数和浮点数。
  • 字符串:匹配被双引号包围的字符串,其中可以包含转义字符。
  • 注释:简化了单行和多行注释的处理。注意,多行注释的处理可能需要更复杂的规则来正确处理嵌套情况。
  • 空白字符:被忽略的空格、制表符和换行符。
  • 操作符和分隔符:匹配ST语言中常用的操作符和分隔符。
  • 其他字符:任何不匹配上述规则的字符都将被视为未知字符,并打印错误信息。

二、Bison

1. 基本概念

Bison(其前身是Yacc)是一个语法分析器生成器。它接受一个上下文无关文法(CFG)和对应的动作(也通常是C语言代码),然后生成一个C程序(语法分析器),该程序能够根据文法规则分析输入文本的结构,并生成相应的语法树或执行相应的动作。

2. 功能

  • 语法分析:确定输入文本中的词法单元是如何彼此关联的,即构建语法树。
  • 错误处理:在语法分析过程中检测并报告错误。
  • 代码生成:根据语法树生成目标代码(尽管这通常不是Bison的直接功能,但语法树可以用于此目的)。

3. 用法

Bison的使用也包括类似的步骤:

  • 编写Bison程序(.y文件),定义文法规则和对应的动作。
  • 使用Bison工具编译Bison程序,生成C语言源代码(通常是y.tab.c和y.tab.h)。
  • 编译生成的C代码,并链接必要的库(如libbison),生成可执行文件。
  • 运行可执行文件,对输入文本进行语法分析。

4. Bison程序示例

%{  
#include <stdio.h>  
#include <stdlib.h>  void yyerror(const char *s);  // 假设有一些用于存储解析结果的数据结构  
// 例如,一个全局的符号表或AST节点  %}  %token IDENTIFIER NUMBER STRING  
%token PROGRAM VAR VAR_INPUT VAR_OUTPUT VAR_IN_OUT VAR_EXTERNAL TEMP TEMP_VAR  
%token BEGIN_PROGRAM END_PROGRAM BEGIN_VAR END_VAR BEGIN_STRUCT END_STRUCT  
%token FUNCTION_BLOCK FUNCTION METHOD INTERFACE END_INTERFACE END_FUNCTION_BLOCK END_FUNCTION END_METHOD  
%token TRUE FALSE  
%token OPERATOR /* 假设我们有一个通用的OPERATOR token用于所有操作符 */  %start program  %%  program:  PROGRAM IDENTIFIER ';' block { printf("Parsed a program\n"); }  ;  block:  /* 这里可以添加更复杂的块结构,如BEGIN_VAR ... END_VAR, BEGIN_PROGRAM ... END_PROGRAM等 */  declarations  ;  declarations:  /* 变量声明 */  VAR declarations_list ';'  | /* 空声明列表 */  { 
$$= NULL; /* 假设我们有一个返回类型,这里用NULL表示空 */ }  ;  declarations_list:  IDENTIFIER ':' type  | declarations_list ',' IDENTIFIER ':' type  ;  type:  /* 这里可以添加对类型的解析,如INT, REAL, BOOL等 */  IDENTIFIER  ;  /* 更多的语法规则可以根据需要添加 */  %%  void yyerror(const char *s) {  fprintf(stderr, "%s\n", s);  
}  int main(void) {  yyparse();  return 0;  
}  // 注意:这个示例中的语法规则非常简化,并且没有处理ST语言的许多特性。  
// 你需要根据实际的ST语言规范来扩展这些规则。

重要说明

  1. Token定义:在Bison文件中,我们使用%token指令来定义由Flex生成的词法单元(tokens)。这些tokens应该与Flex文件中定义的tokens相匹配。

  2. 起始符号%start program指定了语法分析的起始符号。在这个例子中,我们期望输入以PROGRAM关键字开始。

  3. 语法规则:我们定义了几个简单的语法规则来解析程序、块和变量声明。这些规则可以根据需要进行扩展和修改。

  4. 错误处理yyerror函数用于处理解析过程中的错误。

  5. 主函数main函数调用yyparse()来启动解析过程。

注意

  • 这个Bison程序是一个非常简化的示例,它不会处理ST语言的全部特性。
  • 你需要根据实际的ST语言规范来扩展和修改语法规则。
  • 你可能还需要实现一些额外的功能,如符号表管理、抽象语法树(AST)构建等。
  • 编译Bison程序时,你需要使用Bison工具生成C代码,并将其与Flex生成的词法分析器代码以及任何额外的C代码一起编译。通常,这可以通过在Makefile中添加适当的规则来完成。

三、Flex和Bison的关系

Flex和Bison通常一起使用来构建编译器或解析器。Flex负责词法分析,将输入文本分割成词法单元;Bison则负责语法分析,确定这些词法单元是如何根据文法规则关联的。Flex生成的词法分析器可以作为Bison生成的语法分析器的输入源,从而实现完整的编译过程。

四、总结

Flex和Bison是Linux和Unix环境下强大的工具,分别用于生成词法分析器和语法分析器。它们在编译器设计、文本处理等领域有着广泛的应用。Flex通过正则表达式进行词法分析,而Bison则通过上下文无关文法进行语法分析。两者通常一起使用,以构建完整的编译或解析过程。

相关文章:

Flex和Bison

Flex和Bison是Linux和Unix环境下两个非常强大的工具&#xff0c;分别用于生成词法分析器和语法分析器。它们在编译器设计、文本处理等领域有着广泛的应用。下面我将详细介绍Flex和Bison的基本概念、功能、用法以及它们之间的关系。 一、Flex 1. 基本概念 Flex&#xff08;其…...

Matlab-FPGA 小数转换为定点二进制小数脚本和转coe文件格式脚本

Matlab-FPGA 小数转换为定点二进制小数脚本&#xff1a; % 更新于2023年6月17日&#xff0c;修改旋转因子文件&#xff0c;不修改fpga %首先明确我们的二维FFT的数组维数,此为1024*8的二维矩阵&#xff0c;1024行&#xff0c;8列 column 1024; row 8; nk[]; Ncolumn*row; fo…...

逆向案例二十三——请求头参数加密,某区块链交易逆向

网址&#xff1a;aHR0cHM6Ly93d3cub2tsaW5rLmNvbS96aC1oYW5zL2J0Yy90eC1saXN0L3BhZ2UvNAo 抓包分析&#xff0c;发现请求头有X-Apikey参数加密&#xff0c;其他表单和返回内容没有加密。 直接搜索关键字&#xff0c;X-Apikey&#xff0c;找到疑似加密位置&#xff0c;注意这里…...

CSS 导航栏:设计、定制与优化

CSS 导航栏&#xff1a;设计、定制与优化 CSS&#xff08;层叠样式表&#xff09;是网页设计中不可或缺的一部分&#xff0c;它允许开发者通过定义样式来控制网页的布局和外观。在网页设计中&#xff0c;导航栏是一个关键元素&#xff0c;它帮助用户浏览网站并找到他们感兴趣的…...

JS 如何处理链接被用户点击中键的操作

今天在开发中遇到一个问题&#xff0c;在使用类似Bootstrap中的Tabs组件时&#xff0c;当在tab导航链接点击中键时会打开一个新的窗口访问链接&#xff0c;于是我尝试在别的普通链接上点击中键时也会如此&#xff0c;我猜测这是浏览器的默认行为。 由于我开发的是一个浏览器在…...

Android 11 使用HAL层的ffmpeg库(1)

1.frameworks/av/media目录下面的修改 From edd6f1374c1f15783d9920ebda22ea915e503775 Mon Sep 17 00:00:00 2001 From: GW00219471 <zhumingxingnoboauto.com> Date: Wed, 17 Jan 2024 15:16:10 0800 Subject: [PATCH] ?UTF-8?q?[V35CUX-4542]:E7A7BBE6A48Dcux20E8…...

友力科技数据中心搬迁方案

将当前运行机房中的所有设备、应用系统安全搬迁至新数据中心机房&#xff0c;实现平滑切换、平稳过渡&#xff0c;最大限度地降低搬迁工作对业务的影响。 为了确保企事业单位能够顺利完成数据中心机房搬迁工作&#xff0c;我们根据实际经验提供了4个基本原则&#xff0c;希望能…...

GitHub敏感信息扫描工具

目录 功能设计 技术实现 程序使用 文件配置 下载地址 功能设计 GitPrey是根据企业关键词进行项目检索以及相应敏感文件和敏感文件内容扫描的工具,其设计思路如下: 根据关键词在GitHub中进行全局代码内容和路径的搜索(in:file,path),将项目结果做项目信息去重整理得到…...

Linux云计算 |【第一阶段】ENGINEER-DAY4

主要内容&#xff1a; 配置Linux网络参数、配置静态主机名、查看/修改/激活/禁用网络连接、指定DNS、虚拟网络连接、虚拟机克隆、SSH客户端、SCP远程复制、SSH无密码验证&#xff08;SERVICE-DAY5&#xff09;、虚拟网络类型 一、网络参数配置 修改网卡配置文件主要是需要配置…...

C++与VLC制作独属于你的动态壁纸背景

文章目录 前言效果展示为什么要做他如何实现他实现步骤获取桌面句柄代码获取桌面句柄libvlc_media_player_set_hwnd函数 动态壁纸代码 总结 前言 在当今的数字世界中&#xff0c;个性化和自定义化的体验越来越受到人们的欢迎。动态壁纸是其中一种很受欢迎的方式&#xff0c;它…...

平凯星辰黄东旭出席 2024 全球数字经济大会 · 开放原子开源数据库生态论坛

7 月 5 日&#xff0c;以“开源生态筑基础&#xff0c;数字经济铸未来”为主题的 2024 全球数字经济大会——开放原子开源数据库生态论坛在北京成功举办。平凯星辰&#xff08;北京&#xff09;科技有限公司联合创始人黄东旭发表了题为《TiDB 助力金融行业关键业务系统实践》的…...

Mac OS 下安装 NVM,1秒教会你

1.下载 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash或者wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash 2.安装成功后执行 nvm 提示 command not found 首先查看 ~/.bash_profile 文件是否存在&…...

搭建博客系统#Golang

WANLI 博客系统 项目介绍 基于vue3和gin框架开发的前后端分离个人博客系统&#xff0c;包含md格式的文本编辑展示&#xff0c;点赞评论收藏&#xff0c;新闻热点&#xff0c;匿名聊天室&#xff0c;文章搜索等功能。 点击跳转&#xff1a;Github 项目开源地址 功能展示 B 站…...

算法——滑动窗口(day6)

1004.最大连续1的个数 ||| 1004. 最大连续1的个数 III - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 这道题如果能转化为滑动窗口的话就会很简单&#xff0c;因为我们如果尝试去把0翻转为1再计数的话等到第2轮又得重新翻转回来&#xff0c;费时费力~ 那么我…...

推荐一款基于Spring Boot 框架开发的分布式文件管理系统,功能齐全,非常便捷(带私活源码)

前言 在数字化时代&#xff0c;文件管理是企业和个人用户的基本需求。然而&#xff0c;现有的文件管理系统往往存在一些痛点&#xff0c;如存储空间有限、文件共享困难、缺乏在线编辑功能、移动端适配性差等。这些问题限制了用户在不同设备和场景下的文件处理能力。 为了解决…...

Mysql-查询

1.基本查询 //查询所有内容 select * from 表名;//查询指定字段 select 字段1&#xff0c;字段2&#xff0c;字段3.....from 表名;//查询时给字段起别名 select 字段1 as 别名1 , 字段2 as 别名2 ... from 表名&#xff1b;//去重查询 select distinct 字段列表 from 表名; …...

广东科学技术职业学院计算机学院领导一行莅临泰迪智能科技参观交流

7月17日&#xff0c;广东科学技术职业学院计算机学院副院长张军、计算机学院副书记吴国庆、计算机学院大数据教学部部长谢文达、科技与校企合作部副部长黄相杰、科技与校企合作部副部长吴胜兵莅临广东泰迪智能科技股份有限公司产教融合实训基地参观交流&#xff0c;泰迪智能科技…...

exo 大模型算力共享;Llama3-70B是什么

目录 exo 大模型算力共享 exo框架的特点 如何使用exo框架 注意事项 结论 Llama3-70B是什么 一、基本信息 二、技术特点 三、性能与应用 四、未来发展 exo 大模型算力共享 exo框架的特点 异构支持:支持多种不同类型的设备,包括智能手机、平板电脑、笔记本电脑以及高…...

测试——Junit

内容大纲: 常用的五个注解 测试用例顺序指定 参数化 测试套件 断言 1. 常用的五个注解 1.1 Test 通常情况下,我们输入要写在main方法下,此时我想直接输出: Test void Test01(){System.out.println("第一个测试用例"); } 1.2 BeforeAll AfterAll BeforeALL在Tes…...

BUG ImportError: cannot import name ‘QAction‘ from ‘PySide6.QtWidgets‘

BUG ImportError: cannot import name ‘QAction’ from ‘PySide6.QtWidgets’ 环境 PySide6 6.7.2详情 在参考 PyQt5 的代码写 Pyside6 的右键菜单时遇到的错误。 错误代码 from PySide6.QtWidgets import QAction错误原因&#xff1a; 在PySdie6中&#xf…...

对某次应急响应中webshell的分析

文章前言 在之前处理一起应急事件时发现攻击者在WEB应用目录下上传了webshell&#xff0c;但是webshell似乎使用了某种加密混淆手法&#xff0c;无法直观的看到其中的木马连接密码&#xff0c;而客户非要让我们连接webshell来证实此文件为后门文件且可执行和利用(也是很恼火&a…...

Vue3新特性

Vue3新特性 1、Composition API1.1 什么是 Composition API1.2 常用 Composition API1.2.1 setup1.2.2 ref1.2.3 reactive1.2.4 computed1.2.5 watchEffect、watchPostEffect、watchSyncEffect1.2.6 watch 2、生命周期2.1 Vue3生命周期钩子2.2 vue2 和 vue3 关于生命周期的对比…...

一套功能齐全、二开友好的即时通讯IM工具,提供能力库和UI库,支持单聊、频道和机器人(附源码)

前言 在当今数字化时代&#xff0c;即时通讯(IM)和实时音视频(RTC)功能已成为众多应用的标配。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如架构落后、成本高昂、数据安全性和隐私保护不足&#xff0c;以及二次开发和部署的复杂性。 为了解决这些问题&…...

MySQL:JOIN 多表查询

多表查询 在关系型数据库中&#xff0c;表与表之间是有联系的&#xff0c;它们通过 外键 联系在一起&#xff0c;所以在实际应用中&#xff0c;经常使用多表查询。多表查询就是同时查询两个或两个以上的表。 MySQL多表查询是数据库操作中非常重要的一部分&#xff0c;它允许你…...

【机器学习】必会算法模型之:一文掌握 密度聚类,建议收藏。

密度聚类 1、引言2、密度聚类2.1 定义2.2 核心原理2.3 实现步骤2.4 算法公式2.5 代码示例 3、总结 1、引言 在机器学习的无监督学习领域&#xff0c;聚类是一项基础而重要的任务。 聚类算法通过将数据点分组&#xff0c;使同一组内的数据点具有更大的相似性&#xff0c;而组间…...

代码:前端与数据库交互的登陆界面

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>登录</title> </head> <body>…...

发电机基础知识:负载组

什么是发电机负载组&#xff1f; 简单地说&#xff0c;负载组是一种可以产生人工电力负载的设备&#xff0c;用于测试发电机并验证发电机组的性能&#xff0c;包括相关组件&#xff0c;以确保通过使发电机发动机达到适当的工作温度和压力来满足适当的负载。 它是如何工作的&a…...

内网安全:各类密码的抓取

Mimikatz在线读取SAM文件 离线读取SAM文件 在线读取lsass进程 离线读取lsass进程 BrowserGhost浏览器密码抓取 Sharp-HackBrowserData浏览器密码抓取 SharpDecryptPwd数据库密码抓取 LaZagne各类密码的抓取 Windows其他类型抓NTLM Hash工具 sam文件和lsass进程就是Wind…...

前端面试题汇总2

1. CSS 中两个 .class1 .class2 从哪个开始解析 在 CSS 中&#xff0c;选择器 .class1 .class2 表示所有 class 为 class1 的元素中的 class 为 class2 的子元素。浏览器解析这个选择器时&#xff0c;从右向左解析。也就是说&#xff0c;浏览器首先找到所有 class 为 class2 的…...

分布式服务框架zookeeper+消息队列kafka

一、zookeeper概述 zookeeper是一个分布式服务框架&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;命名服务&#xff0c;状态同步&#xff0c;配置中心&#xff0c;集群管理等。 在分布式环境下&#xff0c;经常需要对应用/服…...

镇江网站排名公司/seo品牌优化

bigint从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储大小为 8 个字节。P.S. bigint已经有长度了&#xff0c;在mysql建表中的length&#xff0c;只是用于显示的位数int从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647)…...

个人业务网站源码php/西安今天出大事

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼(二)破格条件基本条件中的第4、5款为必须具备的条件&#xff0c;不能破格。1&#xff0e;一般破格达到以下条件中的一条可进行一般破格&#xff1a;(1)在本科学习期间获得相关专业的具有学术意义的省级一等奖、国家二等奖以上各类学…...

桂林网站建设官网/短视频seo排名

实战需求 macOS SwiftUI 组件之优雅展示程序开源项目的组件List收起与展开 本文价值与收获 看完本文后,您将能够作出下面的界面 看完本文您将掌握的技能 实现list收起和展开实现预览文件实现点击挑战实战代码 1、主界面 mport SwiftUIimport LicensedComponentsUIstruct …...

凡科网多页网站怎样做/大型网站建设平台

H264编码流程手绘图&#xff1a; H264编码网上图&#xff1a; I 帧 Fn&#xff08;左上&#xff09;是当前要编码的帧&#xff0c;他是 GOP 中的第一帧&#xff0c;也就是 I 帧&#xff0c;I 帧要进行帧内编码&#xff0c;首先要选择预测模式&#xff08;Choose Intra predict…...

买了服务器不翻墙就用来 做网站/石家庄seo优化

&#xff08;一&#xff09;简介 1.caffe是一个清晰而高效的深度学习框架&#xff0c;纯粹的C/CUDA架构&#xff0c;支持命令行、Python和MATLAB接口&#xff0c;可以在CPU和GPU直接无缝切换&#xff1b; 2.caffe的主要优势&#xff1a; &#xff08;1&#xff09;CPU与GPU的无…...

南京网站推广¥做下拉去118cr/怎么做推广

C离散傅里叶变换 一、序言&#xff1a; 该教程基于之前的图像处理类MYCV&#xff0c;是对其的补充。 二、设计目标 对图像进行简单的离散傅里叶变换&#xff0c;并输出生成的频谱图。 三、需要提前掌握的知识 二维傅里叶变换公式&#xff1a; 四、详细步骤 1&#xff0e;首先定…...