Flex&Bison 简单入门

2023-10-31

Flex&Bison 简单入门

  • Ref: 《flex与bison(中文版)》

1. Flex&Bison安装

  1. 安装flex
sudo apt install flex
  1. 安装bison
sudo apt install bison
  1. 安装gcc(若缺少)
sudo apt-get install -y build-essential

2. Flex&Bison使用

2.1 第一个flex程序

  1. Flex程序 例1-1: 字数统计 fb1-1.l
/* 正如Unix的wc程序 */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
[a-zA-Z]+    { words++; chars += strlen(yytext); }
\n           { chars++; lines++; }
.            { chars++; }
%%

main(int argc, char **argv) {
    yylex();
    printf("%8d%8d%8d\n", lines, words, chars);
}
  1. 运行程序:
$ flex fb1-1.l    # 使用flex翻译程序
$ cc lex.yy.c -lfl    # 编译程序, 与flex库文件链接
$ ./a.out
The boy stood on the burining deck
shelling peanuts by the peck
^D
       2      12      63
  • 注: ^D是Unix/Linux文件结束符, 此处用于结束输入
  1. 运行截图
    在这里插入图片描述

2.2 Flex&Bison协同工作

1. Flex程序1

例1-3: 一个简单的flex词法分析器 fb1-3.l

  1. 代码:
/* 识别出用于计数器的记号并把它们输出 */
%%
"+"    { printf("PLUS\n"); }
"-"    { printf("MINUS\n"); }
"*"    { printf("TIMES\n"); }
"/"    { printf("DIVIDE\n"); }
"|"    { printf("ABS\n"); }
[0-9]+ { printf("NUMBER %s\n", yytext); }
\n     { printf("NEWLINE\n"); }
[ \t]  { }
.      { printf("Mystery character %s\n", yytext); }
%%
  1. 运行程序:
    在这里插入图片描述

2. Flex程序2

例1-4: 计算器词法分析器 fb1-4.l

  1. 代码:
/* 识别出用于计数器的记号并把它们输出 */
%{
    enum yytokentype {
        NUMBER = 258,
        ADD = 259,
        SUB = 260,
        MUL = 261,
        DIV = 262,
        ABS = 263,
        EOL = 264
    };
    int yylval;
%}

%%
"+"    { return ADD; }
"-"    { return SUB; }
"*"    { return MUL; }
"/"    { return DIV; }
"|"    { return ABS; }
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
\n     { return EOL; }
[ \t]  { /* 忽略空白字符*/ }
.      { printf("Mystery character %c\n", *yytext); }
%%
main(int argc, char **argv) {
    int tok;
    while(tok = yylex()) {
        printf("%d", tok);
        if(tok == NUMBER) printf(" = %d\n", yylval);
        else printf("\n");
    }
}
  1. 运行程序:
    在这里插入图片描述

3. 简单的计算器程序

  1. Bison代码:
    例1-5: 简单的计算器 fb1-5.y
/* 计算器的最简版本 */
%{
#include <stdio.h>
%}
%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL

%%

calclist: /* 空规则 */
    | calclist exp EOL { printf("= %d\n", $2); }
    ;

exp: factor { $$ = $1; }
    | exp ADD factor { $$ = $1 + $3; }
    | exp SUB factor { $$ = $1 - $3; }
    ;

factor: term { $$ = $1; }
    | factor MUL term { $$ = $1 * $3; }
    | factor DIV term { $$ = $1 / $3; }
    ;

term: NUMBER { $$ = $1; }
    | ABS term { $$ = $2 >= 0? $2 : -$2; }
    ;
%%
main(int argc, char **argv) {
    yyparse();
}
yyerror(char* s) {
    fprintf(stderr, "error: %s\n", s);
}
  • 注: 书上代码有误, 上已修正
  1. Flex代码:
    例1-6: 计算器词法分析器 fb1-5.l
%{
#include "fb1-5.tab.h"
%}
%%
"+"    { return ADD; }
"-"    { return SUB; }
"*"    { return MUL; }
"/"    { return DIV; }
"|"    { return ABS; }
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
\n     { return EOL; }
[ \t]  { /* 忽略空白字符*/ }
.      { printf("Mystery character %c\n", *yytext); }
  1. 编译的Makefile:
fb1-5: fb1-5.l fb1-5.y
    bison -d fb1-5.y    # 运行bison, 创建fb1-5.tab.c和 fb1-5.tab.h
    flex fb1-5.l    # 运行flex, 创建lex.yy.c
    cc -o $@ fb1-5.tab.c lex.yy.c -lfl
  1. 进行编译
$ make
  • 遇到问题: Makefile:2: *** 遗漏分隔符 (null)。 停止。
    解决: Makefile文件中, 缩进是TAB分隔符, 不能是空格
  • 遇到问题:
  • 在这里插入图片描述
    在这里插入图片描述
    解决: 见上#1代码
    编译信息:
    在这里插入图片描述
  1. 运行结果:
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flex&Bison 简单入门 的相关文章

  • flex&bison编写语法分析器

    使用flex和bison 对c语言代码块进行词法分析 识别词法错误 按照c 语法规则进行文法分析 并形成c语言代码块的语法树 syntax tree 并将语法树按照特定的格式打印出来 如何编译 两种方法 1 使用make命令 先将要执行的所
  • assemble language学习(-)

    不容易 终于将第一个简单的arm assemble Language程序跑通了 1 创建project 选择stm32407ve 2 添加汇编启动文件start s STACK TOP EQU 0x20002000 AREA RESET C
  • LLVM Language Reference Manual

    摘要 该文档是LLVM汇编语言的参考指南 LLVM是基于表示的静态单赋值 SSA 该表示提供类型安全 低层级操作 灵活性 及简洁表示所有高层级语言的能力 这是贯穿各方面LLVM编译策略的通用代码表示 简介 LLVM代码表示用于三个不同形式
  • 【编译原理】【C语言】实验三:递归下降分析法

    C语言 实验环境 Visual Studio 2019 author zoxiii 递归下降分析法 1 实验内容 2 前期准备 2 1 递归下降分析法原理 2 2 要实现的文法 2 3 需要的函数 3 分析过程 3 1 递归下降分析法设计思
  • 电子科技大学编译原理复习笔记(五):词法分析

    目录 前言 重点一览 词法分析概述 词法分析的功能 词法分析器的输出形式 词法分析器的结构 状态转换图 状态转换图的构造 词法分析器的设计 基本结构 内容 符号表 目的 组成 在词法分析中的作用 符号表的一般形式 常用的符号表结构 总结与补
  • 将NFA变成最小化DFA的方法

    学习的时候总感觉这个遇到新的题目不会做 这里总结一下 整个流程是这样的 我们直接来看一个例子 使用上面的算法来实现我们最后的目标 a b ba ab 我们先来画NFA 明确 开始状态和接受状态 终结状态要画两个圈 值得注意的是 由于 也可以
  • 电子科技大学编译原理复习笔记(四):程序语言的设计

    目录 前言 重点一览 语言的定义 比较 生成观点与识别观点 语义又该怎么描述 符号串 符号串集合 文法 超重点 定义 组成 表示 分类 重点 文法产生的语言 短语 直接短语和句柄 求它们目的是语法分析 语法树 推导树 语言的设计 本章习题
  • FLEX & BISON 联合使用

    flex是词法分析器 bison是语法分析器 基本原理就是flex解析出token后 让bison来使用 实际上 一般是先编写bison脚本 里面的token就是一个定义 没有实现 里面的yylex也是没有实现 只有定义 为什么先做biso
  • 第1关:用Bison构建逆波兰计算器

    任务描述 相信大家通过flex的实验已经掌握了如何构建一个词法分析器 但是为了创建一个完整的编译程序 我们还需要一个语法分析器 同样的 我们可以使用现有的工具来节省开发的时间 也就是Unix下的YACC和GNU Linux下的Bison 相
  • 编译原理------语法分析器C/C++代码实现

    一 实验目的 编制一个递归下降分析程序 实现对词法分析程序所提供的单词序列的语法检查和结构分析 二 实验内容 利用C语言编制递归下降分析程序 并对简单语言进行语法分析 2 1 待分析的简单语言的语法 用扩充的BNF表示如下 lt 程序 gt
  • gcc常用选项及常见的文件格式,扩展名

    gcc常用选项 编译过程 预处理 编译 汇编 链接 gcc的选项 必须分开给出 x 语言名 指出后面文件的语言 c 编译 汇编源文件 生成目标文件 S 编译不汇编 生成汇编文件 E 预处理 输出送到标准输出 o 指定输出的文件名 pipe
  • 编译课设 (词法分析+LR1语法分析+语法制导翻译(四元式生成))

    代码已上传至 Github 完整的 VS2019 项目已上传至百度云 提取码 lql1 目录 源语言 语义动作 中间代码定义 整体框架 声明 语句 i f if if 语句
  • 【编译原理】LALR(1)语法分析方法(c++实现)

    前文回顾 编译原理 LR 0 分析方法 c 实现 编译原理 SLR 1 分析方法 c 实现 编译原理 LR 1 分析方法 c 实现 这几个程序的代码大部分是一样的 根据不同算法特点做了部分修改而已 代码 LALR 1 的代码就是在LR 1
  • 词法分析器(分析C语言)

    问题描述 用C或C 语言编写一个简单的词法分析程序 扫描C语言小子集的源程序 根据给定的词法规则 识别单词 填写相应的表 如果产生词法错误 则显示错误信息 位置 并试图从错误中恢复 简单的恢复方法是忽略该字符 或单词 重新开始扫描 相关词法
  • 合肥工业大学编译原理实验一词法分析

    基本思路 词法分析是对输入语句串中一个个单词符号进行分析 最后格式化输出种别码 类型 位置等信息 那么 就可以考虑一次读入一个字符将它们拼接成一个字符串 当碰到空格或者分界符 时 就把前面已读的字符串格式化输出 再输出当前分界符 然后再往后
  • 【Python】代码实现LL(1),LR(1)上下文无关文法(Stack()类)

    任务要求 针对书上第三章中的表达式文法 采用LL 1 LR 1 进行分析 相关文法 需要进行消除左递归等操作 顺手分享一下课本资源好了 可能不是最新版 排版略有点别扭 后文的书上内容就是指这本书 编译原理 陈意云 文字版 提取码 e0ag
  • Flex程序编译

    Makefile三要素 目标 依赖 命令 详解可见makefile 编写 周北 CSDN博客 makefile 编写 Makefile中常用函数和自动化变量 wildcard 扩展通配符 例 OBJECTS wildcard o 该找到目标
  • 编译原理LL(1)文法之提取左公因子,消除左递归

    在判断LL 1 文法是否符合的时候 需要判断LL 1 文法是否存在左公因子 和左递归的情况 以下给出相应的判断方法以及通过提取左公因子和消除左递归使非LL 1 文法转换为LL 1 法的方法 第一种情况 存在左公因子 解决方法 提取左公因子
  • Compiler- volatile关键字

    为了直观的感受编译器为程序所做的编译优化 我们通过以下的C 程序来进行演示 只能体现编译优化的一小部分hh 请大家预测一下下面代码的输出结果 include
  • 编译原理_计算器_flex、bison实现(详细辅助理解)

    编译原理 计算器 flex bison实现 详细辅助理解 个人博客 https www yuque com ngp blog tuanh6 https www yuque com ngp blog tuanh6 P S 这篇文章只能助你理解

随机推荐

  • unity中使用c#钩子

    目的 解决在应用程序最小化后无法监听到系统按键事件的情况 解决问题的过程很好笑 我先找到了第一个方法 脚本一 使用方法 脚本挂在场景中物体上即可 using System using System Collections using Sys
  • 统计学习第四弹--随机变量的概率分布

    关于随机变量概率分布的重要概念 概率 对事件的发生的可能性大小的度量值 随机变量 事先不能确定其取值的变量 离散型随机变量 只能取有限个值的随机变量 连续型随机变量 可以取一个或多个区间中任何值的随机变量 期望值 随机变量的平均取值 求法是
  • Caltech数据使用详情

    Caltech官网 http www vision caltech edu Image Datasets CaltechPedestrians 以Caltech测试集为例 大概是4095个图片吧 1 下载数据 http www vision
  • 【华为OD机试】返回矩阵中非1的元素个数【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 存在一个m n的二维数组 其成员取值范围为0 1 2 其中值为1的元素具备同化特性 每经过1S 将上下左右值为0的元素同化为1 而值为2的元素 免疫同化 将数组所有成
  • C语言小知识-不定参数函数实现

    C语言不定参数的实现 C语言在定义函数参数时 允许参数的使用数量可变 这在C语言中称为 可变参数函数 variadic function 当然在C标准库中不乏可变参数函数的使用 例如 C标准函数 printf 的声明方式为 int prin
  • Qt之设置QWidget背景色(QStyleOption->drawPrimitive(QStyle::PE_Widget)

    QWidget是所有用户界面对象的基类 这意味着可以用同样的方法为其它子类控件改变背景颜色 Qt中窗口背景的设置 下面介绍三种方法 1 使用QPalette 2 使用Style Sheet 3 绘图事件 一般我不用QSS设置窗口背景 也不建
  • 在YOLOv5训练自己的数据集模型时删除预训练权重后发现报错

    上图是报错内容 找到general py 出错的位置 应该是YOLOv5版本的问题 就用一个可以正常空权重跑通的文件 将general py相应部分给复制下来 粘贴过去 报错内容是 acceptable suffix is pt
  • 【超简易版】基于Pytorch Fasterrcnn_resnet50_fpn的多车牌定位/车牌检测-基于CCPD2019数据集

    说明 本项目为本人初学torch框架练习项目 在此仅作个人经验分享 由于本人现大三 码code经验有限 难免存在瑕疵 望各位前辈批评指正 本项目在linux上训练模型并下载权重 pth文件在windows上进行测试 数据集来源参考 CCPD
  • 二叉树ADT的二叉链表求解

    假设二叉数的数据元素为字符 采用二叉链式存储结构 请编码实现二叉树ADT 其中包括创建二叉树 遍历二叉树 深度 广度 求二叉树的深度 高度 计算二叉树的元素个数 计算二叉树的叶子数 二叉树的格式输出等 根据输入的符号 执行相应的操作 如下
  • Destination Host Unreachable Ubuntu

    情况描述 物理机win10 192 168 1 102 虚拟机Ubuntu 18 192 168 190 128 docker环境 nat设置 物理机可以ping通虚拟机 虚拟机可以访问外网 但是不能ping通物理主机 虚拟机ping 19
  • unity行为树Behavior Designer插件学习

    本章资源百度网盘 链接 https pan baidu com s 16BFLcqIK6aKPc vxhuR0HA pwd d42s 提取码 d42s 1 准备 1 导入行为树插件包 Unity Behavior Designer v1 5
  • html仿苹果桌面导航js css,CSS简单实现弹出框、输入框等的背景幕布,模仿苹果官网导航块的半透明效果。...

    需求提要 我们如果想写一个效果类似弹出框的组件 首先简单分析一下弹出框的几个特性 弹出框肯定位于当前页面的最顶端 并且在弹出框关闭之前 其他控件都无法点击 focus等 为了更好突出弹出框的效果 除了弹出框以外的部分 我们可以加上一个幕布
  • Java集合(Collection、Iterator、Map、Collections)概述——Java第十三讲

    前言 本讲我们将继续来讲解Java的其他重要知识点 Java集合 Java集合框架是Java编程语言中一个重要的部分 它提供了一套预定义的类和接口 供程序员使用数据结构来存储和操作一组对象 Java集合框架主要包括两种类型 一种是集合 Co
  • LeetCode第一章数组

    977 有序数组的平方 题目链接 977 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums 返回 每个数字的平方 组成的新数组 要求也按 非递减顺序 排序 示例 1 输入 nums 4 1 0 3 10 输出 0 1 9 1
  • 使用SQL聚合函数,分组,完成数据合并,字段拼接或者字段追加

    在项目的开发过程中 我们会遇到一些特殊的业务需求 如接下来讲的业务需求 根据多个字段 如果多个字段相同就把两条数据合并为一条数据 但是两条数据的创建人的追加在一条数据中 返回给前端 话不多说上图解释该业务 当然也可以通过代码去完成 这次我们
  • 我在做layuiAdmin std 通用后台管理模板系统(iframe标准版)的动态侧边栏渲染

    1 layuiAdmin的根据请求获取数据 动态生成侧边栏 注意 请求地址一样 但携带的token不一样 会返回不一样的侧边栏 就是权限问题 在views index html页面上改造的前后 改造侧边栏的渲染代码前 div class l
  • 图像算法之高斯模糊(灰度图像)

    1 函数定义 高斯模糊 struct stPGMImage GaussianBlur struct stPGMImage image unsigned int radius 2 函数实现 struct stPGMImage Gaussian
  • react封装一个webScoket请求

    封装一个webScoket请求 创建文件webScoket tsx写入 import React Component from react import message from antd import axios from axios e
  • Android OTA 升级之一:编译升级包

    Android OTA 升级之一 编译升级包 作者 宋立新 Email zjujoe yahoo com 前言 OTA 升级是 Android 系统提供的标准软件升级方式 它功能强大 提供了完全升级 增量升级模式 可以通过 SD 卡升级 也
  • Flex&Bison 简单入门

    Flex Bison 简单入门 Ref flex与bison 中文版 1 Flex Bison安装 安装flex sudo apt install flex 安装bison sudo apt install bison 安装gcc 若缺少