返回顶部
首页 > 资讯 > 操作系统 >linux bison的作用是什么
  • 699
分享到

linux bison的作用是什么

linuxbison 2023-04-20 05:04:11 699人浏览 八月长安
摘要

这篇文章主要讲解了“linux bison的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux bison的作用是什么”吧!

这篇文章主要讲解了“linux bison的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux bison的作用是什么”吧!

在linux中,bison是用来生成语法分析器程序的工具,它可以将用户提供的语法规则转化成一个语法分析器;bison需要和flex(词法分析器)配合使用来处理复杂的文件解析工作。通过给定语法的产生式开始,bison会通过算法,最终构造得到动作表,然后利用这个动作表去解析句子。

Unix Lex/YACC 发展为 Linux FLex/Bison

Lex是1975年由Mike Lesk和当时尚在AT&T实习的Eric Schmidt共同完成的(Schmidt做的更多),是一个词法分析器的生成程序,可以单独使用也可以与Johnson的yacc协同工作。lex很有名气,但是无奈效率太低加上有bug。大概在1987年,Lawrence Berkeley实验室的Vern Paxson用C重新写了Lex,并命名为FLex(the Fast Lexical Analyzer Generator),基于伯克利许可证。flex现在是SourceForge的一个项目,依然基于伯克利许可,
[Flex](https://GitHub.com/westes/flex "Flex") 是起初unix版lex的free (but non-GNU) implementation,用于c/c ++ 的词法扫描生成器。

(注意:Schmidt曾是Google的CEO)

bison的前身是yacc。yacc是由贝尔实验室的S.C.Johnson基于Knuth大神的LR语法分析理论,于1975~1978年写成。大约1985年,UC Berkeley 的研究生Bob Corbett使用改进的内部算法实现了伯克利yacc,来自FSF的Richard Stallman改写了伯克利yacc并将其用于GNU项目,添加了很多特性,形成了今天的GNU Bison。bison现在作为FSF的项目被维护,基于GNU公共许可证发布,[Bison](Http://www.gnu.org/software/bison/manual/)是兼容yacc的free的语法生成器。

早期Unix的Lex/YACC,发展为FLex/Bison,新版本的程序是向上兼容的(即兼容老版本),现chang用Flex和Bison。

flex/bison工作原理

使用的角度,Flex和Bison是Linux下用来生成词法分析器和语法分析器两个程序的工具,可以处理结构化输入,一般结合使用来处理复杂的文件解析工作。

linux bison的作用是什么

bison可以将用户提供的语法规则转化成一个语法分析器。简单来说,通过给定语法的产生式开始,bison会通过算法,最终构造得到动作表,然后利用这个动作表去解析句子。具体来说,bison 读取用户提供的语法的产生式,生成一个 C 语言格式的 LALR(1) 动作表,并将其包含进一个名为yyparse的 C 函数,这个函数的作用就是利用这个动作表来解析 token 流 ,而这个 token 流 是由 flex 生成的词法分析器扫描源程序得到的。

flex文件是定义pattern(哪是黄豆,哪是绿豆...),通过flex处理(词法分析)将输出切分成一段一段的token(将输入的豆子一个个摘出来),从而执行不同的action(黄豆就磨豆浆(action),绿豆去做绿豆糕(action))...
flex 生成的tokens可以喂给Bison处理(更简便易调试),当然也可以不喂给bison而直接自己处理就得了(如喜下例)。但是使用bison可以更方便的处理复杂的逻辑,编写简单,调试方便。

编码实战:字符统计器

//本例中仅仅使用flex以及少量手写代码(main中),来完成字符串统计功能。
Yolandas-MacBook-Pro:flex-bison liuyuanyuan$ cat fb1-1.l

%{
  int chars = 0;
  int Words = 0;
  int lines =0;

%}

%%
[a-zA-Z]+ {
		words++;
		chars += strlen(yytext);
          }

\n        {     chars++; lines++;}

.         {     chars++;     }

%%


int main(int args, char **argv)
{
	yylex();
	printf("lines=%6d words=%6d chars=%6d\n", lines, words, chars);
	return 0;
}

//Linux 系统上用 -lfl 选项编译, Mac 的编译选项是 -ll
Yolandas-MacBook-Pro:flex-bison liuyuanyuan$ GCc -ll lex.yy.c  -o fb1-1
Yolandas-MacBook-Pro:flex-bison liuyuanyuan$ ./fb1-1
hello 
this is yolanda
bye.
lines=     3 words=     5 chars=    28

1 flex(fast lex, scanner)文件内容结构(*.l, 分3部分)


%{
  
%}

%%
  
%%

定义段 包括文字块、定义、内部声明等。
C语言的头文件、函数和变量的声明等一般就放在%{…%}之间,这一部分的内容会被直接复制到生成.c文件的开头部分。

包含%option选项

%option noyywrap 

%{
#include "cal.tab.h"
extern int yylval;
%}

规则段 %%...%%之间部分,为一系列匹配模式(正则表达式)和动作(C代码)。

当flex扫描程序运行时,它把输入与规则段的模式进行匹配,每次发现一个匹配(被匹配的输入称为标记(token))时就执行与那种模式相关的C代码。

pattern(正则表达式) { action(c代码) }

example:
[0-9]+ {yylval = atoi(yytest); return NUMBER;}

用户辅助程序段 为C代码,会被原样复制到c文件中,一般这里定义一些辅助函数等。

int terror(chr *s)
{
    printf("%s\n", s);
    return 0;
}

2 bison(yacc, parser)文件内容结构(*.y , 分3部分,%%分隔)


%{

%}
 
%%

    
     A: a1  {  语义动作1 }
	  | a2  {  语义动作2 }
	  | …
	  | an  {  语义动作n }
	  | b  //没有{…},则使用缺省的语义动作       
	; //产生式结束标记
    //语义动作一般是在产生式右部分析完,归约动作进行前执行。
    A→ a1 | a2 |  … | an | b 
%%

定义段 可以分为两部分:

1. %{ 和%}之间的部分,C语言编写的,包括头文件include、宏定义、全局变量定义、函数声明等;

2. 对文法的终结符和非终结符做一些相关声明。

常用的Bison标记声明有:%token %uNIOn %start %type %left %right %nonassoc等。

%token 定义文法中使用了哪些终结符。定义形式: %token TOKEN1 TOKEN2  
终结符一般全大写;(如 TOKEN1 TOKEN2)  
一行可定义多个终结符,空格分隔;  

%left、%right、%nonassoc 也是定义文法中使用了哪些终结符。定义形式与%token类似。  
先定义的优先级低,最后定义的优先级最高,同时定义的优先级想通过。  
%left表示左结合,%right表示右结合;  
%nonassoc 表示不可结合(即它定义的终结符不能连续出现。例如<,如果文法中不允许出现形如a<b<c的句子,则<就是不可结合的)  

%left AA BB  
%nonassoc CC  
%right DD  
表示优先级关系为:AA=BB<CC<DD,表示结核性为:AA\BB左结合, DD右结合, CC不可结合。  
注意:也可以于%prec来结合使用来改变token的优先级和结合性 例如: :'-' expr %prec NEG { $$ = -$2; };  

%union 声明语法符号的语义值类型的集合,  
bison中每个符号包括记号和非终结符都有一个不同数据类型的语义值,并使用yylval变量在移进和归约中传递这些值,YYSTYPE(宏定义)为yylval的类型,默认为int;  
我们使用%union来重新定义符号的类型  
%union  
{  
int iValue;  
char sIndex;  
nodeType *nPtr;  
};  

%type 定义非终结符其属性值的类型。  
%type sym1 sym2  
%type <sindex>sym3  

%start 指定文法的开始的文法符号(非终结符),是最终需要规约而成的符号。  
定义形式为:%start startsym , 其中startsym为文法的开始符号。  
如果不使用%start定义文法开始符号,则默认在第二部分规则段中定义的第一条生产式规则的左部非终结符为开始符号。

规则段 由rule(语法规则)和action(包括C代码)组成。

bison规则基本是BNF,做了一点简化以易于输入。

规则中目标或非终端符放在左边,后跟一个冒号:然后是产生式的右边,之后是对应的动作(用{}包含)。

%%
  program: program expr '\n' { printf("%d\n", $2); }
  ;

  expr: INTEGER {$$ = $1; }
           | expr '+' expr { $$ = $1 + $3; }
           | expr '-' expr { $$ = $1 - $3}
  ;
%%

注意:$1表示右边的第一个标记的值,$2表示右边的第二个标记的值,依次类推。$$表示归约后的值。

linux bison的作用是什么

用户辅助程序段 为C代码,会被原样复制到c文件中,这里一般自定义一些函数。

3 flex-bison 代码协作方式

linux bison的作用是什么

flex/bison编码实践:编写简单计算器

1 macOS下flex/bison安装

brew install flex
brew install bison
# macos下flex/bison安装简单方便,另需安装gcc用于编译c语言程序。
brew install gcc

2 flex词法文件:calc.l

%option noyywrap

%{
    
	void yyerror(char*);
	#include "calc.tab.h"
%}

%%

        
[a-z]	{
            yylval = *yytext - 'a';
            return VARIABLE;
    	}

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

    
[-+()=
[ \t]    ;

    
.    yyerror("invalid input");

%%

3 bison语法文件:calc.y

%token    INTEGER VARIABLE
%left    '+' '-'
%left    '*' '/'

%{
	#include <stdio.h>   
    void yyerror(char*);
    int yylex(void);
	
    int sym[26];
%}

%%
program:
    program statement '\n'
    |
    ;
statement:
     expr    {printf("%d\n", $1);}
     |VARIABLE '=' expr    {sym[$1] = $3;}
     ;
expr:
    INTEGER
    |VARIABLE{$$ = sym[$1];}
    |expr '+' expr    {$$ = $1 + $3;}
    |expr '-' expr    {$$ = $1 - $3;}
    |expr '*' expr    {$$ = $1 * $3;}
    |expr '/' expr    {$$ = $1 / $3;}
    |'('expr')'    {$$ = $2;}
    ;
%%

void yyerror(char* s)
{
    fprintf(stderr, "%s\n", s);
}

int main(void)
{
    printf("A simple calculator.\n");
    yyparse();
    return 0;
}

4 Makefile 文件:

all: clean calc


calc: calc.l calc.y
	bison -d calc.y
	flex calc.l
	cc -o $@ calc.tab.c lex.yy.c -lm

clean:
	rm -f calc \
	lex.yy.c calc.tab.c calc.tab.h

5 执行

(可以直接执行make也就是执行Makefile中定义的内容,也可以单步执行)

Yolandas-MBP:calcSimple liuyuanyuan$ ls -l
total 32
-rw-r--r--@ 1 liuyuanyuan  staff  157  8 13 09:53 Makefile
-rw-r--r--@ 1 liuyuanyuan  staff  507  8 13 10:01 calc.l
-rw-r--r--@ 1 liuyuanyuan  staff  731  8 13 23:04 calc.y

Yolandas-MBP:calcSimple liuyuanyuan$ make
rm -f calc \
	lex.yy.c calc.tab.c calc.tab.h
bison -d calc.y
flex calc.l
cc -o calc calc.tab.c lex.yy.c -lm

Yolandas-MBP:calcSimple liuyuanyuan$ ls -l
total 272
-rw-r--r--@ 1 liuyuanyuan  staff    157  8 13 09:53 Makefile
-rwxr-xr-x  1 liuyuanyuan  staff  24600  8 14 12:00 calc
-rw-r--r--@ 1 liuyuanyuan  staff    507  8 13 10:01 calc.l
-rw-r--r--  1 liuyuanyuan  staff  42011  8 14 12:00 calc.tab.c
-rw-r--r--  1 liuyuanyuan  staff   2143  8 14 12:00 calc.tab.h
-rw-r--r--@ 1 liuyuanyuan  staff    731  8 13 23:04 calc.y
-rw-r--r--  1 liuyuanyuan  staff  44590  8 14 12:00 lex.yy.c

Yolandas-MBP:calcSimple liuyuanyuan$ ./calc
A simple calculator.
1+2
3

感谢各位的阅读,以上就是“linux bison的作用是什么”的内容了,经过本文的学习后,相信大家对linux bison的作用是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: linux bison的作用是什么

本文链接: https://lsjlt.com/news/201688.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • linux bison的作用是什么
    这篇文章主要讲解了“linux bison的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux bison的作用是什么”吧! ...
    99+
    2023-04-20
    linux bison
  • linux的作用是什么
    本文小编为大家详细介绍“linux的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2023-03-09
    linux
  • linux .profile的作用是什么
    本篇内容主要讲解“linux .profile的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux .profile的作用是什么”吧! ...
    99+
    2023-03-22
    linux
  • Kali linux的作用是什么
    本篇内容介绍了“Kali linux的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2023-03-20
    linux kali linux
  • linux dts的作用是什么
    本文小编为大家详细介绍“linux dts的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux dts的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2023-03-14
    linux dts
  • linux kdump的作用是什么
    这篇文章主要讲解了“linux kdump的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux kdump的作用是什么”吧! ...
    99+
    2023-03-09
    linux kdump
  • linux uid的作用是什么
    这篇文章主要介绍“linux uid的作用是什么”,在日常操作中,相信很多人在linux uid的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux uid的...
    99+
    2023-03-13
    linux uid
  • linux signal的作用是什么
    本文小编为大家详细介绍“linux signal的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux signal的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学...
    99+
    2023-04-20
    linux signal
  • linux openssl的作用是什么
    本文小编为大家详细介绍“linux openssl的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux openssl的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2023-04-20
    linux openssl
  • linux rpc.statd的作用是什么
    这篇文章主要介绍“linux rpc.statd的作用是什么”,在日常操作中,相信很多人在linux rpc.statd的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2023-04-14
    linux
  • linux ACL的作用是什么
    这篇文章主要讲解了“linux ACL的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux ACL的作用是什么”吧! ...
    99+
    2023-02-28
    linux acl
  • linux ssh的作用是什么
    本文小编为大家详细介绍“linux ssh的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux ssh的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。ssh用于远程登录到Linux服务...
    99+
    2023-06-30
  • Rocky Linux的作用是什么?
    这篇文章主要介绍了Rocky Linux的作用是什么,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Rocky Linux的介绍Rocky Linux,是一个即将推出的Linux发行版,目前正在开发中。它旨在成为一个使用红...
    99+
    2023-06-08
  • linux opt的作用是什么
    今天小编给大家分享一下linux opt的作用是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。linux opt是用来安...
    99+
    2023-07-05
  • Linux fmt的作用是什么
    本篇内容主要讲解“Linux fmt的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux fmt的作用是什么”吧!Linux fmt是一个用于编排文本文件的指令,该指令会从指定的...
    99+
    2023-07-05
  • linux deploy的作用是什么
    本文小编为大家详细介绍“linux deploy的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux deploy的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。linux deplo...
    99+
    2023-07-06
  • linux gem的作用是什么
    这篇文章主要讲解了“linux gem的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux gem的作用是什么”吧!linux gem是一款开发工具集,是一款基于Ruby的库...
    99+
    2023-07-05
  • Linux中 inode的作用是什么
    本篇文章给大家分享的是有关Linux中 inode的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 一、inode是什么理解inode,要从文件储存说起。文...
    99+
    2023-06-16
  • Linux中MODULE_DEVICE_TABLE的作用是什么
    在Linux中,MODULE_DEVICE_TABLE是一个宏,用于定义一个设备ID表,用于匹配设备和驱动程序之间的关系。设备ID表...
    99+
    2023-09-29
    Linux
  • linux中mv的作用是什么
    在Linux中,`mv`命令用于移动文件或重命名文件/目录。它的作用有以下几个方面:1. 移动文件/目录:`mv`命令可以将文件或目...
    99+
    2023-09-22
    Linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作