基于flex/bison工具生成sysY2022文法的词法/语法分析器 您所在的位置:网站首页 文法语法词法 基于flex/bison工具生成sysY2022文法的词法/语法分析器

基于flex/bison工具生成sysY2022文法的词法/语法分析器

2023-12-04 11:37| 来源: 网络整理| 查看: 265

基于flex/bison工具生成sysY2022文法的词法/语法分析器

本文内容学习借鉴了往届参赛的优秀校友学长学姐的开源作品代码,仅用于学习目的,现分享给大家,如有侵权请联系我删除。我使用的开发环境是Ubuntu16.04,值得一提的是,SysY文法使用EBNF描述,而bison中对文法描述使用BNF范式,这就涉及如何用BNF来改写EBNF。

sysY2022简介

SysY 语言是编译系统设计赛要实现的编程语言。由 C 语言的一个子集扩展而成。可以到https://compiler.educg.net/ 查看相关内容。

1. 创建test.l文件 第一部分:

定义部分:用%{ %}括起来,对规则部分要引用的变量与文件进行说明,此部分内容将直接复制到生成的C文件lex.yy.c中。正规式定义定义了规则部分引用的正规式,使用正则表达式,类似于C语言的宏定义。%s 定义了注释状态,表示进入此状态后,只有此状态下的模式可以匹配。INITIAL为默认状态。

%{ #include #include"tiny.tab.h" extern int yyline; //全局变量行数 %} intnum [1-9][0-9]*|0[0-7]*|(0x|0X)[0-9a-fA-F]* floatnum [0-9]+[Ee][0-9]+ id [a-zA-Z_][a-zA-Z0-9_]* %s COMMENT //多行注释 %s LINECOMMENT //单行注释 第二部分:

模式匹配部分:%%分隔开每一个部分。词法分析器接受源程序作为输入流,当词法分析器匹配到定义的模式后,返回相应的词法单元(TOKEN)给语法分析器(将源程序拆解成词法单元返回给语法分析器)。词法单元在tiny.tab.h中定义。后面会提到tiny.tab.h由tiny.y生成。

%% "/*" {BEGIN(COMMENT);} "*/" {BEGIN(INITIAL);} ([^*]|\n)+|. {printf("Unterminated comment\n"); return 0;} "//" {BEGIN(LINECOMMENT);} .* \n {BEGIN(INITIAL);} {BEGIN(INITIAL);} [ \t] {;} //忽略空白符 \n {yylineno++;} //匹配到换行符,行数+1 "int" {printf("");return (INT);} //添加副作用,输出以供我们调试。 "float" {return (FLOAT);} "const" {return (CONST);} "void" {return (VOID);} "break" {return (BREAK);} "continue" {return (CONTINUE);} "return" {printf("");return (RETURN);} "if" {printf("");return (IF);} "else" {printf("");return (ELSE);} "while" {return (WHILE);} {intnum} {printf("");return (INTNUM);} {floatnum} {return (FLOATNUM);} "=" {return (GE);} "==" {return (EQ);} "!=" {return (NE);} "=" {printf("");return (ASSIGN);} "+" {return (ADD);} "-" {return (SUB);} "*" {return (MUL);} "/" {return (DIV);} "%" {return (MOD);} "!" {return (NOT);} "&&" {return (AND);} "||" {return (OR);} ";" {return (SEMI);} ":" {return (COLON);} "," {return (COMMA);} "(" {return (L);} ")" {return (R);} "{" {return (OB);} "}" {return (CB);} "[" {return (LB);} "]" {return (RB);} {id} {printf("");return (Ident);} 第三部分:

辅助函数部分:

%% int yywrap(){ //文件结束处理函数,如果返回值为1就停止解析。可以用来解析多个文件。 return 1; }

至此词法分析器已经写好了,然后我们开始生成语法分析器。

2.创建tiny.y文件

语法分析器接受词法分析器返回的TOKEN作为输入流,输入的token流不符合语法分析器的规定的语法,语法分析器还可以报语法错误。bison格式上与flex极其相似。

第一部分

选项设置 %option XXX 用于进行一些选项设置

2.C语言部分 %{ %}与flex类似,声明部分是纯C语法,声明一些包含的头文件与全局变量

%option noyywrap %{ #include #include #define YYDEBUG 1 //开启debug int yylex(); //调用词法分析器,每次返回一个TOKEN int yyerror(char* s); extern int line_no; %}

4.token声明部分:首先定义了yylval的union类型,%token 声明token类型,这部分会出现在tiny.tab.h中供flex包含,当不指明token的匹配模式时,后面的文法规则部分就必须用token类型表示而不能使用字符,例如我们没有给出LT匹配模式,那么文法规则必须写成:

RelExp : AddExp {$$=$1;} | RelExp LT AddExp

而将不能写成:

RelExp : AddExp {$$=$1;} | RelExp "


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有