lex与yacc的安装配置附flex,bison和mingw安装包

〇、所需安装包

    flex-2.5.4a-1.exe   +   bison-2.4.1-setup.exe   +   mingw-get-setup.exe

 

一、安装配置与测试

 

 

%{
    int yywrap(void);
%}
%%
%%
int yywrap(void)
{
    return 1;
} 

%{
    void yyerror(const char *s);
%}
%%
program:
;
%%
void yyerror(const char *s)
{
}

int main()
{
    yyparse();
    return 0;
} 

 我们暂且不讨论上面代码的意思。 打开控制台,进入到刚才所建立文件【 lex.l】【 yacc.y 】所在的文件夹。

1.输入 【flex lex.l】

2.输入 【bison yacc.y】

3.如果我们看到当前文件夹上多了两个文件【yacc.tab.c】【lex.yy.c 】,那么说明 lex&&yacc 已 经安装配置成功,接下来就好好享受这两个小工具的魅力吧。

二、案例(粗糙)

case I: 

1、新建文本文件,更改名称为 interpreter.lex,敲入下面代码 ------- 词法分析器的源代码

%{
int wordCount = 0;
int numcount = 0;
%}
chars [A-Za-z\_\'\.\"]
numbers ([0-9])+
delim [" "\n\t]
whitespace {delim}+
words {chars}+
%%
while {ECHO; printf("%s\n",yytext);} 
{words} { wordCount++;
/* increase the word count by one*/ }
{whitespace} { /* do nothing*/ }
([0-9])+ { numcount++; /* one may want to add some processing here*/ }
%%
void main()
{
printf("ok1\n");
yylex(); /* start the analysis*/
printf("ok2\n");
printf(" No of words: %d\n number: %d\n", wordCount, numcount);
}
int yywrap()
{
return 1;
} 

2、新建文本文件,更名为 sourcecode.c,敲入下面代码 -------- 此为输入源代码

asd asdf 23 q
a1
b2
!#@
while 

 3、打开菜单,运行,输入 cmd。

输入: cd 文件夹路径

输入: flex interpreter.lex 回车后生成一个 lex.yy.c 文件

输入: gcc -o interpreter lex.yy.c  回车后生成一个 interpreter.exe文件,现在我们已得到了一个简易的词法分析器【interpreter.exe】,下面就是运用次词法分析器,分析下 【sourcecode.c】 文件

输入: interpreter.exe <sourcecode.c> output.txt 回车后生成一个 output.txt 文件

 

 

 case II: (输出token表)

1、sample2目录下新建 interpreter.lex

%{ 
    #include <stdio.h>
    /*
    struct{
        int linenum;
        char name[255];
        int typenum;
    } tokenItem;

    //mine 
    {Real}          { printf("%15s %6d\n", yytext, NUMSYM);}

    */
    #define PROGRAM 1
    #define IDNAME 58
    #define VARSYM 2
    #define SEMICOLONSYM 47
    #define COLONSYM 41
    #define INTEGER 3
    #define BEGINSYM 8
    #define ASSIGNSYM 39
    #define NUMSYM 53
    #define PLUSSYM 30
    #define ENDSYM 26
    #define DOTSYM 50
    #define CHARSYM 6


    int linenum = 1;
    int errornum = 0;
%} 

blank [ \t]
Digit0 [1-9]
Digit [0-9]
Letter [a-zA-Z]
Integer {Digit}+
Id {Letter}({Letter}|{Digit}|_)*
delim [" "\t] 
newline [\n]
whitespace {delim}+ 
Real ({Integer}[.]{Integer})([Ee][+-]?{Integer})? 


invalId {Digit}({Letter}|{Digit}|_)*
invalLetter [^(Letter)(Digit)-*/\+|_'"!]

%% 


[pP][rR][oO][gG][rR][aA][mM]            { printf("%-5d %10s %6d\n",linenum, yytext, PROGRAM);}
[Bb][Ee][Gg][Ii][Nn]                    { printf("%-5d %10s %6d\n",linenum, yytext, BEGINSYM);}
[eE][nN][dD]                            { printf("%-5d %10s %6d\n",linenum, yytext, ENDSYM);}
[iI][nN][tT][eE][gG][eE][rR]            { printf("%-5d %10s %6d\n",linenum, yytext, INTEGER);}
[vV][aA][rR]                            { printf("%-5d %10s %6d\n",linenum, yytext, VARSYM);}
[cC][hH][aA][rR]                        { printf("%-5d %10s %6d\n",linenum, yytext, CHARSYM);}                     
{newline}               { linenum++;}
{whitespace}            { /* do nothing*/ } 
"."                     { printf("%-5d %10s %6d\n",linenum, yytext, DOTSYM);}
";"                     { printf("%-5d %10s %6d\n",linenum, yytext, SEMICOLONSYM);}
":"                     { printf("%-5d %10s %6d\n",linenum, yytext, COLONSYM);}
":="                    { printf("%-5d %10s %6d\n",linenum, yytext, ASSIGNSYM);}
"+"                     { printf("%-5d %10s %6d\n",linenum, yytext, PLUSSYM);}
{Id}                    { printf("%-5d %10s %6d\n",linenum, yytext, IDNAME);}
{Integer}|{Real}        { printf("%-5d %10s %6d\n",linenum, yytext, NUMSYM);}
{invalLetter}           { errornum++; printf("[ERROR]:line %d: 无法识别的字符:%s\n", linenum, yytext);}
{invalId}               { errornum++; printf("[ERROR]:line %d: 无法识别的标识符: %s\n", linenum, yytext);}



%% 

void main() 
{ 
    //print("[START]start the analysis...");
    //yylex(); /* start the analysis*/ 
    printf("token表信息:\n"); 
    printf("%-10s %10s %10s\n","行号","名称","种别码"); 
    while(yylex()){
    }
    
    printf("\n词法分析错误信息:\n"); 
    printf("%d error(s)\n", errornum); 
} 
int yywrap() 
{ 
return 1; 
} 

 2、新建sourcecode.c

program example;

var

     a:integer;

begin

     x:=3+3.5+3.5e4;

end.

3、新建soucecode2.c

program example;

var

        3a:char;

        α:integer;

4、输出sourcecode.c和sourcecode2.c的token表

(1)、cd [sample2的PATH] 

(2)、flex interpreter.lex

(3)、gcc -o interpreter lex.yy.c

(4)、interpreter.exe <sourcecode.c> output.txt

(5)、interpreter.exe <sourcecode2.c> output2.txt

运行截图如下:

 

 

 

 

 更多用法参考:

https://blog.csdn.net/wp1603710463/article/details/50365495

https://www.cnblogs.com/wp5719/p/5528896.html

https://wenku.baidu.com/view/715f1ce8b90d6c85ed3ac62d.html

 

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个包主要实现了最简单的LexYacc环境,包含了最少的但是必须的文件。<br>同时还包含了一个MinGW的GNU的C++编译器环境:)可以直接使用:)<br><br>这个包包含的文件列表:<br><br>MinGW GNU的C/C++编译程序(windows版本)<br>bison.exe GNU的yacc程序<br>bison.hairy GNU的yacc程序运行需要的文件<br>bison.simple GNU的yacc程序运行需要的文件<br>flex.exe GNU的lex程序<br>ini.bat 这个lexyacc环境的环境变量配置<br>lexyacc.bat 这个lexyacc环境的启动程序<br>Readme.txt 本说明文件<br><br>使用方法:<br><br>1. 鼠标双击lexyacc.bat文件运行<br>2. 在弹出的DOS命令行中利用CD切换到你的lexyacc源文件所在的目录(calc)<br>3. 对lex源文件执行flex calc.l<br>4. 对yacc源文件执行bison -d calc.y<br><br>经过上面的四个步骤就生成了你需要的C/C++源文件,剩下的事情就是编译<br>这里生成的C/C++源程序了。<br><br>5. g++ lex.yy.c calc.tab.c -o calc<br><br>最后谢谢您的使用,也希望您提出宝贵的意见或者建议,我会认真考虑您的<br>意见或者建议的。可以发邮件到[email protected]和我联系。<br><br>博客:http://blog.csdn.net/pandaxcl<br>论坛:http://www.autodev.net<br><br><br>大家好,本人历时两年构思了四年,目前完成了一半的自动化C++程序设计代码库<br>(autocxx)总算可以拿出来见人了,大家多到论坛(http: //www.autodev.net)<br>或者博客(http://blog.csdn.net/pandaxcl)提些意见吧:)代码是开源的;)<br>下面是整个项目的文档目录:<br><br> * 自动化C++程序设计<br> * 基础篇<br> * C++里的模板语言<br> * 静态诊断<br> * 为什么说模版是C++的子语言<br> * 静态数学运算<br> * 静态选择结构<br> * 静态循环结构<br> * 运算结果的保存<br> * 基本类型<br> * nil类型<br> * t类型<br> * any类型<br> * text类型<br> * kind类型<br> * 类型串类型p<br> * 将C++的模版语言规范化<br> * is_same元函数<br> * 选择结构select<br> * partition元函数<br> * 类型串生成元函数mkps<br> * length元函数<br> * capacity元函数<br> * at元函数<br> * range元函数<br> * 静态循环(loop)<br> * 针对PS的静态循环(loop_ps)<br> * 自动生成函数调用(eloop)<br> * 针对PS自动生成函数调用(eloop_ps)<br> * p的其它一些重要的辅助函数<br> * join元函数<br> * cut元函数<br> * count元函数<br> * index元函数<br> * exist元函数<br> * repeat元函数<br> * resize元函数<br> * reverse元函数<br> * replace元函数<br> * unique元函数<br> * filter元函数<br> * map元函数<br> * reduce元函数<br> * 自动生成C++类<br> * scatter类<br> * tuple结构<br> * 分析C++类层次<br> * 分析C++类结构<br> * 类是否拥有指定参数的成员函数<br> * 类是否存在指定名称的成员函数<br> * 类是否存在指定名称的成员变量<br> * 类是否存在指定名称的子类(型)<br> * 分析C++重载函数<br> * 分析函数参数的数量<br> * 分析函数参数的种类<br> * 存在的问题<br> * C++自动化<br> * 应用篇<br> * C++静态计算器<br> * 顺序计算器<br> * 带括号顺序计算器<br> * 加减乘除带括号计算器<br> * 前缀表达式静态计算器<br> * lambda演算<br> * 基本LISP解释器<br> * 基本静态LISP解释器<br> * 扩展静态LISP解释器<br> * 静态语言解释器的生成器<br> * 问题陈述<br> * 词法分析器<br> * 语法规则表述<br> * 语法规则响应器<br> * 语法分析实现<br> * 使用前面的LEXYACC实现静态数据库(SQL)语言<br> * 观察者模式的C++自动化实现<br> * 什么是观察者模式<br> * 观察者模式普通实现<br> * 观察者模式中的必备元素<br> * 将观察者模式普通实现自动化<br> * 将观察者模式标准化<br> * 一个使用自动化观察者模式的复杂例子<br> * 撤销和重做(Undo/Redo)的C++自动化实现<br> * 交换函数swap功能的讨论<br> * 撤销和重做原理<br> * 撤销和重做的基本架构<br> * 将撤销和重做的基本架构模组化<br> * 处理多类型的对象以及命令管理<br> * 扩展的框架代码<br> * 处理复合对象<br> * 自动化的用户界面(UI)<br> * 高级篇<br> * 应用BOOST的MPL库<br> * 采用OO思想进行框架设计<br> * 文本编辑器<br> * 图形用户界面<br> * 游戏引擎架构
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值