Win7下lex 与 yacc的安装配置
Lex和Yacc从入门到精通(PDF)
Lex和Yacc从入门到精通熊春雷Abstract在开发程序的过程中经常会遇到文本解析的问题,例如:解析C语言源程序,编写 脚本引擎等等,解决这种文本解析的方法有很多,一种方法就是自己手动用C或者 C++直接编写解析程序,这对于简单格式的文本信息来说,不会是什么问题,但是 对于稍微复杂一点的文本信息的解析来说,手工编写解析器将会是一件漫长痛苦 而容易出错的事情。
本系列文档就是专门用来由浅入深的介绍两个有名的Unix工 具Lex和Yacc,并会一步一步的详细解释如何用这两个工具来实现我们想要的任何 功能的解析程序,为了方便理解和应用,我会在该系列的文章中尽可能的采用具 体可行的实例来加以阐释,而且这种实例都是尽可能的和具体的系统平台无关的 ,因此我采用命令行程序作为我们的解析程序的最终结果。
1、环境配置篇开发Lex和Yacc程序最需要的程序就是lex和yacc了,如果你是Unix或者Linux系统,则 系统自带了这两个工具,无需安装,不过值得说明的是GNU/Linux下面的Lex是flex, 而Yacc则是bison。
另外需要的就是一个C/C++语言编译器,由于我们采用的是GNU的 lex和yacc,所以,理所当然的我们就使用GNU的编译器了,如果是Unix或者Linux系统 ,那么编译器应该已经安装了。
在这里我重点讨论的是Windows系统环境下的Lex和 Yacc程序的开发,至于为什么选择Windows系统作为开发平台,则是为了尽可能的让初 学者容易入门。
1.1.必备工具言归正传,首先列举Windows平台下面Lex和Yacc开发环境所需要安装的程序:1.Lex(flex.exe)和Yacc(bison.exe)环境2.C/C++编译器1.2.flex和bison值得说明的是,flex.exe和bison.exe是UnxUtils包中的文件,已经将许多 Unix/Linux平台的程序都移植到了Windows平台,可以直接到UnxUtils网站下载,下载解压缩之后在系统的PATH环境变量中增加UnxUtils所有的exe文件所在的目录,使 得DOS命令行可以直接搜索到flex.exe和bison.exe,除此之外还需要从网络上下载 bison需要的bison.simple和bison.hairy两个文件,并且还要分别设置环境变量 BISON_HAIRY指向bison.hairy,BISON_SIMPLE指向bison.simple。
编译原理lexyacc的联合使用实验报告
编译原理lexyacc的联合使用实验报告《编译原理》课程实验报告题目lex yacc 的联合使用专业班级学号姓名一. 实验题目lex yacc 的联合使用二. 实验日期三. 实验环境(操作系统,开发语言)操作系统是Windows开发语言是C语言四. 实验内容(实验要求)目的:熟悉lex和yacc的接口要求:(1)能对整数、实数进行带变量的四则运算(2)词法分析用lex实现(3)语法分析用yacc实现(4)交源代码和实验报告五. 实验步骤1.在实验二的基础上修改代码,并添加上以下的代码:double { return DOUBLE;}EOF { return 0;}{ID} { return ID;}2.在DOS环境下按照之前的步骤利用flex运行myleb.l,修改其中的错误之后,生成lex.yy.c文件。
3.参照书中第14章第7节和myparser-fifth.y文件中的代码,和老师说的思路修改myparser-sixth.y文件,按照实验要求修改代码。
4.在DOS环境下利用yacc运行myparser-sixth.y文件,会有出错提示,按照出错的地方指示,修改代码,使其最终能通过运行,生成y.tab.c文件。
(此步骤还未完成)5.打开c-free5.0,新建工程,在Source files文件夹中添加之前生成的lex.yy.c文件和y.tab.c文件,然后找到已给的calc.h文件,将其添加到新建工程中的Header files文件夹中,这时就能将三个文件组成一个类似于.exe文件类型的文件,最后运行。
6.运行并调试成功。
六. 实验体会(包括收获、心得体会、存在的问题及解决问题的方法、建议等)这是最后一次实验了,但这次的难度是有史以来最难的一次实验,因为要结合之前我们学到的所有东西。
首先要修改.l文件的代码,再把此文件用lex运行,即词法分析部分用lex 完成;然后是修改myparser-sixth.y文件,尽管有参照的代码,但是要自己实现能对整数和实数进行带变量的四则运算,对于还没有完全掌握.y文件编写的我还是太有难度了,自己先是完成了只对实数的运算,也能运行,但只要添加上实数就会出错,研究了很久,还是没有找出来哪里还有错误;有时候也会出现用yacc运行没错误,但用c-free运行就会出错,提示说.h文件有错误,找了半天,也修改了很多。
Lex和Yacc在软PLC开发系统中的应用
asna n l e wi e e f ac( e a ohr o ir o ir id c se e ae. hnP C y t a a zr t t l o Y c Y t n te c mp e —c mpe) i u sdi t p r T e L x y hhhp l l s s n h p
中 图 分 类 号 :P 7 T23 文 献标 识码 : A
Ap l a i n o x a d Ya c i o t p i t fLe n c n S fPLC g De eo m e tS se c o v l p n y tm
L h a g,W ANG n —ha g,MA o g b IS u n Yo g z n Xi n — o
p o r m’ c mpl g i su i i t . w o a tm aia y d v lp a tk n a a z rwi e h l fL x a d r g a S o i s t d e f s y Ho t u o t l e eo o e n l e t t ep o e n i n d r l c y h h
维普资讯
・
控 制 与检 测 ・
组 床与自 化 合机 动 加工技 术
文 章 编 号 :0 1— 2 5 20 )9— 0 0— 5 10 2 6 (0 6 0 0 3 0
Lx Y c 在软 P C开发 系统中 的应 用 e 和 ac L
lex和Yacc详解
Lex和Y acc工具介绍――编译原理的实用工具1.词法分词器生成工具lexLex的主要功能是生成一个词法分析器(scanner)的C源码。
描述词法分析器的文件,经过lex编译后,生成一个lex.yy.c的文件,然后由C编译器编译生成一个词法分析器。
词法分析器,简单来说,其任务就是将输入的各种符号,转化成相应的标识符(token),转化后的标识符很容被后续阶段处理。
过程如错误!未找到引用源。
图1现在这个lex 文件可以用来生成一个统计行数、字符个数和单词个数的工具。
规则段是由正则表达式和相应的动作组成的。
p 1 {action 1}p 2 {action 2}……p n {action n }值得注意的是,lex 依次尝试每一个规则,尽可能地匹配最长的输入流。
如果有一些内容根可以看出lex的确按照最长的规则匹配。
程序段部分放一些扫描器的其它模块,比如一些动作执行时需要的模块。
也可以在另一个程序文件中编写,最后再链接到一起。
生成C代码后,需用C的编译器编译。
连接时需要指定链接库。
gcc的连接参数为 -ll。
2.正则表达式正则表达式可以描述有穷状态自动机(Finite Automata)接受的语言,也就是定义一个可以接受的串的集合。
转义字符(也称操作符):" \ [ ] ^ - ? . * + | ( ) $ / { } % < >这些符号有特殊含义,不能用来匹配自身。
如果需要匹配的话,可以通过引号(’’)或者转义符号(\)来指示。
比如C”++”C\+\+都可以匹配C++。
非转义字符:所有除了转义字符之外的字符都是非转义字符。
一个非转义字符可以匹配自身。
比如integer匹配文本中出现的integer。
通配符:通配符就是”.”(dot),可以匹配任何一个字符。
字符集:用一对[]指定的字符构成一个字符集。
比如[abc]表示一个字符集,可以匹配a、b、c中的任意一个字符。
使用–可以指定范围。
WIN7下IAR软件安装手册
以上所有资料为力天电子(LT)版权所有
3
WIN7 下 IAR 软件安装手册
运行结果将产生 Host-ID:0xXXXXX,其中“0x”分别为数字“0”和小写字 母“x”代表 16 进制, “XXXXX”代表 ID 号,不同的电脑,ID 号是不一样,下 图是我在安装过程中获取 ID 号的截图
以上所有资料为力天电子(LT)版权所有
1
WIN7 下 IAR 软件安装手册 本文档主要介绍 LT-ARM214X 开发板配套软件 IAR(版本号为 5.3)在 WIN7 操作系统下的安装,安装主要分以下步骤完成。 一、软件解压和安装 找到软件在光盘中的位置,如下图所示:
将该处的 Installserial 后的序列号复制,粘贴到安装界面中需要输入 License 的地方,如下图所示:
以上所有资料为力天电子(LT)版权所有
5
WIN7 下 IAR 软件安装手册
点击下一步,进入到输入 key 的界面,将记事本中的一串 key 值复制(包含 最后的“#”号) ,然后粘贴到安装界面 License Key 处,如下图所示:
技
术
文
件
技术文件名称:WIN7 下 IAR 软件安装手册 技术文件编号:<V1.0> 版 本:<V1.0>
拟 制 审 IAR 软件安装手册 修改记录
文件名 拟制人/ 版本号 拟制/修改日期 修改人 叶红渝 2011-03-22 1.0 更改理由 主要更改内容 (写要点即可)
然后打开记事本,在记事本里写入下面的: iarkg.exe 0xXXXXX >pjhaoma.txt 注意: “XXXXX”中如果有字母,请一律改为大写 然后另存为 pj.bat,如下图所示
应用Lex与Yacc实现设备描述分析
于 17 9 5年研制开发的一个编译程 序 , 能够 自动生成词
法分析程序和语 法分 析程序 的工具 。
1 1 L x和 Y c . e a c的 基 本 原 理
1 11 L x . . e
信接 口对 H R A T智能仪表进行配置 。每个厂家生产不 同类 型的仪 表 , 种 型号 的仪 表 都具 有不 同的特性 。 各
0 引 言
H R A T现 场 总 线 协 议 被 广 泛 地 应 用 于 压 力 、 度 温
1 基本 原理
Lx和 Y c e ac是美 国 贝 尔实 验 室 的 L s ek和 Jh sn ono
和流量等智能仪表之 中。仪表在实际应用前要进行 配
置 , 态 软 件 可 以在 台 式 电 脑 或 者 掌 上 电脑 上 通 过 通 组
实现 分析设 备 描述 , 立多 种设 备的运 行数 据 , H R 建 使 A T现 场总线 协议 的组 态软 件 能够 配置 多 种设 备 。讨 论 了 Lx和 Y c e ac的词法 分 析 和语 法 分析技 术及设 备 描述语 言 , 功开 发 了能够分 析 H R 协 议设 备描 述 的组态 软件 , 成 AT 实现 了 H R A T设备 的互 操作 。
关键 词 :设 备描 述 H R A T协议 变送 器 文献 标志码 :B
中 图分类号 :T 2 6+ 1 P1 .
Ab ta t:Th e ie d s rpin o xen lc aa trsiso sr c e d vc ec t fe tra h r ce t fHART ed e uime th lste h s o ue p r t l kn so ed e i— i o i c i f l q p n ep h o tc mp tro e aeal i d ff l q p i u me t I r e o i lme titr p r bl yo h o tc mp tr。b sn e iae o l fL xa d Ya c。a ayi fd vc e c pin a d n . n od rt mp e n ne o ea it fteh s o ue i y u igd dc td toso e n c n lsso e ied s r to i n etb ih n fo eain aao h q ime taei lme td.r1 s a o e ie a ec n g r d b o g rto ot r eb s d o sa ls me to p rt a d t f ee up n r mpe ne ol t I u 。v r usd vc sc n b o f u e yc n u ain s f 1 i i i f wa a e n HART rtc 1 T e tc n lge flxc la ay i d s na n yi fL x a d Ya c a l a e ie d srp in ln u g r ic se p oo o. h e h oo iso e ia n ssa y tx a a sso e c swels d vc e c to a g a e ae ds u s d。 l n l n i tec n g r to f r eta s n lz h o i f u ain s t o wa t na ay eHART d vc ec pin i de eo d s c esul h eitrpea it fHART d vc si lme ・ h c e ie d s r t s v lp u c sfly,t ne o r bl yo i o e i e iei mp e n td. e K e wo d y r s: De ie d s rpin vc ec to i HART rtc l T a s t r po o o rn mit e
LEX和YACC的使用(例子)
LEX和YACC的使⽤(例⼦)1、简单C语⾔的词法分析程序;%{#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<string.h>%}digit [0-9]letter [A-Za-z]other_char [!-@\[-~]id ({letter}|[_])({letter}|{digit}|[_])*string {({letter}|{digit}|{other_char})+}int_num {digit}+%%[ |\t|\n]+ "auto"|"double"|"int"|"struct"|"break"|"else"|"long"|"switch"|"case"|"enum"|"register"|"typedef"|"char"|"extern"|"return"|"union"|"const"|"float"|"short"|"unsigned"|"continue"|"for"|"signed"|"void"|"default"|"go \"([!-~])*\" {printf("CONST_string,%s\n",yytext);}-?{int_num}[.]{int_num}?([E][+|-]?{int_num})? {printf("CONST_real,%s\n",yytext);}"0x"?{int_num} {printf("CONST_int,%s\n",yytext);}","|";"|"("|")"|"{"|"}"|"["|"]"|"->"|"."|"!"|"~"|"++"|"--"|"*"|"&"|"sizeof"|"/"|"%"|"+"|"-"|">"|"<"|">="|"<="|"=="|"!="|"&"|"^"|"|"|"&"|"||"|"+="|"-="|"*="|"/="|"%="|">>="|"<<="|"&="|"^="|"|="|"=" {printf("%s,NULL\n",yytext);}{id} {printf("ID,%s\n",yytext);}{digit}({letter})+ {printf("error1:%s\n",yytext);}%%#include <ctype.h>Upper(char *s,int l){int i;for(i=0;i<l;i++){s[i]=toupper(s[i]);}}yywrap(){return 1;}注意:要得到输出信息,需要⾃⾏添加main函数,lex默认的main函数没有输出的。
Lex与Yacc学习(七)之环境配置另一种方式
Lex与Yacc学习(七)之环境配置另⼀种⽅式必备⼯具flex与bison安装运⾏flex-2.5.4a-1.exe 和 bison-2.4.1-setup.exe ⽂件安装⾄D:\Software Files\GnuWin32下,然后按配置环境变量:将路径 D:\Software Files\GnuWin32\bin 复制于Path中。
Cygin安装配置运⾏cyg_win_setup.exe⽂件安装⾄D:\cygwin下,然后配置环境变量:将路径D:\cygwin\bin复制于Path中;注意:在D:\cygwin\bin⽂件夹下,有g++.exe ⼤⼩为1KB 与g++ 3.exe ⼤⼩为95KB ,我们需要把95KB的 g++ 3.exe命名为 g++.exe ,1 KB的g++可删除,或者命名为g++3.exe;同理,有gcc.exe ⼤⼩为1KB 与gcc 3.exe ⼤⼩为95KB ,我们需要把95KB的 gcc 3.exe命名为 gcc.exe ,1 KB的gcc可删除,或者命名为gcc 3.exe 。
必要⽂件复制我们发现D:\cygwin\bin下⾯并没有flex.exe 与bison.exe,因此,(1)将安装好的D:\Software Files\GnuWin32\bin下的flex.exe 与bison.exe复制到D:\cygwin\bin下⾯;(2)再将D:\Software Files\GnuWin32的share⽂件夹复制到D:\cygwin下⾯;(3)将D:\Software Files\GnuWin32\lib下的libfl.a 和 liby.a 复制到D:\cygwin\lib下⾯;检测配置是否成功打开D:\cygwin下的Cygwin.bat 或者系统的cmd,按照以下⽅式检验:环境搭建结束!。
应用Lex与Yacc实现设备描述分析(论文)
修改稿收到日期:2006—12—29。 第一作者赵郁峰,男,1974年生,2005年毕业于四川大学检测及自动 化专业,获硕士学位,工程师;主要从事工业控制及现场总线方面的研究 和开发工作。
定义部分 %% 识别规则部分 %%
28
PROCESS AUTOMATION INSTRUMENTATION V01.28 No.6 June 2007
Lex源程序叫j[卜词澈錾器
+
Yacc源程序——L_——i—二—:—— —o1◆碍法分析琴 tyyparse) + c++源代码
图1 Lex和Yacc应用流程
Fig.1 Application process of Lex and Yacc
在C++代码中可以简单调用所生成的词法分析 器和语法分析器,代码如下所示:
同类型的仪表,各种型号的仪表都具有不同的特性。
1.1.1 Lex
传统意义上开发人员把设备特性编写到代码中,这造Lex是一个词法分析器的自动生成程序,这个程 成了用户必须采用与其所使用的设备配套的组态软 序的核心是正规表达式,用它来描述输入串的词法结
件,已经不能适应日益变化的设备特性的需求。
构。同时在这个程序中,用户还可以描述当某一个词
“RESPONSE—CODE” “READ” “WRITE”
{retum RESPON—CODE;} {return READ;} {retum WRITE;}
这些保留关键字必须预先在Yacc中的定义部分
定义:
%token
COMMAND
OPERATION
TRANSACTl0N
REQUEST REPLY RESPON——CODE WRITE READ
定义编写设备描述代码,通过Lex和Yacc分析后建立
编译原理 lex和yacc的综合设计 python
编译原理lex和yacc的综合设计python
1、Lex和Yacc是一种强大的词法分析和语法分析技术,它们常用于编译器的开发和编写编译器前端。
它们分别可以分析和解释输入字符流,并产生相应的输出。
Lex是一个词法分析器,它可以将输入字符流分解为令牌(即识别的节点),这些令牌可以用于编写解释器或编译器的前端。
Yacc则是一种用来构建语法分析器的工具,它可以识别输入的令牌序列,并生成相应的程序。
2、编译原理是编译器的最小系统,它涉及源程序的分析和分解,目标程序的生成和优化,以及中间代码的翻译。
Lex和Yacc则是用来处理字符流和语法检查的两个有力工具,在处理中间代码生成和优化方面非常有用,是编译器的核心部分。
3、Lex和Yacc的综合设计一般需要借助某种语言将可执行模块链接起来,最常用的技术是使用C,C是一种高性能语言,可以让开发者实现快速迭代,也可以利用其标准库实现代码复用,因此是完成Lex和Yacc综合设计的最佳语言。
4、Python是一种脚本语言,不适合用于编写Lex和Yacc综合设计,因为Python 并不专业,不能满足低级程序设计的需求,处理过程中往往性能不佳。
LEX和YACC入门
LEX 将这些规则翻译为词法分析器。每一个规则依次包含一 个正则表达式以及该正则表达式得到匹配时要运行的一些代 码。
任何没有得到匹配的文本则简单地拷贝到标准输出。
2020/5/13
6
三、LEX程序设计
LEX正规表达式(1)
expression: value '+' value { System.out.println("Matched a '+' expression.\n"); }
2020/5/13
23
四、YACC程序设计
类似于 LEX, YACC 也有 一套变量和函数可供用户 来进行功能扩展。
YYSTYPE 定义了用来将 值从 lexer 拷贝到解析器 或者 YACC 的 yylval ( 另一个 YACC 变量)的 类型。默认的类型是 int 。 由于字符串可以从
的值。
2020/5/13
26
四、LEX与YACC结合
2020/5/13
27
public static void main(String args[]) {
int n = 1;
mylexer lexer = new mylexer();
if (lexer.yycreate(null)) {
n = lexer.yylex();
}
System.out.println("word count = "+lexer.wordCount);
两个百分号标记指出了 LEX程序中这一段的结束和三段中第二段 的开始。
10
lex与yacc快速入门
lex与yacc快速⼊门第⼀节、lex和yacc是什么? lex 代表 lexical analyzar(词法分析器),yacc 代表 yet another compiler compiler(编译器代码⽣成器)。
lex和yacc在UNIX下分别叫flex和bison. 可以搜索到很多介绍flex&bison的⽂章,但这类⽂章对初学者来说不太容易看懂。
我们举个简单的例⼦来理解lex和yacc:在linux下,有很多系统配置⽂件,⼀些linux下的软件也有配置⽂件,那么程序是如何读取配置⽂件中的信息的呢?先⽤到lex词法分析器,读取配置⽂件中的关键词(后⾯说到的token标记其实可看做关键词);然后把关键词递交给yacc,yacc对⼀些关键词进⾏匹配,看是否符合⼀定的语法逻辑,如果符合就进⾏相应动作。
上⾯举的例⼦是分析配置⽂件内容的,当然可分析其他⽂件内容,或者制作编译器等。
第⼆节、⼀个简单的lex程序。
1、程序代码。
来看⼀个简单的lex程序,代码见下⾯,这段lex程序的⽬的是:输⼊⼏⾏字符串,输出⾏数,单词数和字符的个数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25/******************************************** Name : test.l* Date : Mar. 11, 2014* Blog : /lucasysfeng/* Description : ⼀个简单的lex例⼦,输⼊⼏⾏字符串,* 输出⾏数,单词数和字符的个数。
*******************************************//* 第⼀段 */%{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);}程序中yytext是lex变量,匹配模式的⽂本存储在这⼀变量中。
Lex和Yacc简明教程
和简明教程 Lex Yacc作者 :Thomas Niemann翻译: 傅惠忠目录序言3 导言4 Lex6 理论6练习7 YACC11 理论11练习,第一部分12练习,第二部分15 计算器18 描述18包含文件20Lex21 输入文件Yacc22 输入文件解释器26编译器27图28Lex34 进阶字符串34保留字35lex35 的调试Yacc37 进阶递归37IfElse37 歧义错误信息38继承属性39内含动作39调试Yacc39 参考书目40lex yacc lex yacc本书将教会你如何使用和构造一个编译器。
Lex与Yacc
|…
进行前执行。
| n { 语义动作n } | 没有{…},则使用缺省的语义动作
; 产生式结束用分号标记
语义动作是C的语句序列(在一对{}中间), 可以引用声明段中定义的C变量、宏等,还可 以使用yacc的伪变量。
规则段(续)
-yacc中的伪变量(类型缺省为整型)
$$ - 产生式左部非终结符的“值”
向前匹配。如果在匹配的模版中的“/”后跟有后 续表达式,只匹配模版中“/”前面的部分。如: 如果输入 A01,那么在模版 A0/1 中的 A0 是匹 配的。 将一系列常规表达式分组。
7
常规表达式举例
常规表达式
含义
joke[rs]
匹配 jokes 或 joker。
A{1,2}shis+ 匹配 AAshis, Ashis, Ashiss, Ashisss。
yywrap()
这一函数在文件(或输入)的末尾调用。如果函 数的返回值是1,就停止解析。 因此它可以用 来解析多个文件。代码可以写在第三段,这 就能够解析多个文件。 方法是使用 yyin 文件 指针(见上表)指向不同的文件,直到所有 的文件都被解析。最后,yywrap() 可以返回 1 来表示解析的结束。
FILE* 类型。 它指向记录 lexer 输出的位置。 缺 省情况下,yyin 和 yyout 都指向标准输入和输出。
yytext 匹配模式的文本存储在这一变量中(char*)。
yyleng 给出匹配模式的长度。
yylineno 提供当前的行数信息。(lexer不一定支持。)
14
Lex 函数
yylex() 这一函数开始分析。 它由 Lex 自动生成。
$i - 产生式右部第i个文法符号的“值”
Lex和Yacc解释程序实现方法
Lex和Yacc解释程序实现方法刘丽娜;杨纯辉;张静【摘要】Lex和Yacc是编译程序和解释程序的设计工具,它们都是20世纪70年代由贝尔实验室开发的,目前已经成为标准的UNIX实用程序.它们的应用范围很广泛,既包括从输入文件中寻找模式的简单文本搜索程序,也包括将源程序变换为最佳的目标代码C编译程序等;具有容易修改、程序维护简单等诸多优点.%The Lex and Yacc, designed by Bell Laboratories in 1970s, are tools of design for compiling program and analysis program, which have been useful and standard UNIX program already. Lex and Yacc, including text searching program searching from the input file, and compiling program translating source program into best object code C, etc. , are used widely. They have many advantages such as easy amending and simple maintenance.【期刊名称】《微处理机》【年(卷),期】2013(034)001【总页数】3页(P38-40)【关键词】Lex词法分析;Yacc语法分析;编译程序【作者】刘丽娜;杨纯辉;张静【作者单位】中国电子科技集团公司第四十七研究所,沈阳110032【正文语种】中文【中图分类】TN471 引言计算机程序输入通常有一些特定的结构,每一个计算机程序的输入都会被定义成可接受的“输入语言”。
输入语言可以是复杂的可编程语言,也可以是简单的数字。
Win7下lex_与_yacc的安装配置
Win7下lex_与_yacc的安装配置Win7下lex 与yacc的安装配置一、如何在windows下安装lex。
首先,下载下载flex和bison。
安装时,设定路径最好不要是在Program Files文件夹里面,因为文件夹名字带空格会影响以后的使用。
可如此:安装在c:\gnuwin32下面。
其次,由于我们使用的flex和bison都是GNU的工具,所以为了方便,采用的C/C++编译器也采用GNU的编译器GCC,目前Windows平台的GCC主要是MinGW编译器。
安装过程中,会自动开启控制台,仅需稍等片刻,任其自动完成。
安装完毕后,将c:\gnuwin32\lib里面的libfl.a和liby.a复制到C:\MinGW\lib里面。
再者,设置环境变量。
现在该安装的都已安装完毕,那么我们该设置环境变量了。
右键点击“计算机”,“属性”、“高级系统设置”、“环境变量”,在下面系统变量里面找到PATH,修改,在后面加上c:\gnuwin32\bin和C:\MinGW\bin。
注意每一个路径是用分号分隔的,然后写第一个路径,然后分号,第二个路径。
如果你的安装的目录和我不一样,就对应修改。
开始两个简单的文件来测试安装是否成功。
1) 新建文本文件,更改名称为lex.l,敲入下面代码%{int yywrap(void);%}%%%%int yywrap(void){return 1;}2) 新建文本文件,更改名称为yacc.y,敲入下面代码%{void yyerror(const char *s);%}%%program:;%%void yyerror(const char *s){}int main(){yyparse();return 0;}打开控制台,进入到刚才所建立文件(lex.l,yacc.y)所在的文件夹。
输入flex lex.l输入bison yacc.y如果看到当前文件夹上多了两个文件(yacc.tab.c,lex.yy.c),那么说明lexyacc已经安装配置成功。
lexyacc使用基础
• 建立空工程 • 通过工程-添加到工程 文件,把经过 通过工程 添加到工程-文件 把经过bison 编 添加到工程 文件, 译之后生成的文件添加到当前工程中( 译之后生成的文件添加到当前工程中(bison 文件中包含main函数的定义) 函数的定义) 文件中包含 函数的定义 • 编译、运行 编译、
• 第四步,用c编译器对上面的两个文件进行 第四步, 编译器对上面的两个文件进行 编译
– gcc –o targer lex.yy.c frame.tab.c – 或者,用visual c++ 编译器进行编译 或者,
用visual c++ 编译器进行编译
• 新建工程
– 工程类型:创建 工程类型:创建win32 控制台应用程序
Lex中的正则表达式规则 中的正则表达式规则
• 转义字符: 转义字符: [ ]:表示一个集合,可以结合 表示一个范围,如 表示一个集合, 表示一个范围, 表示一个集合 可以结合-表示一个范围 [abc],[a-zA-Z] , ? * + :0或1次,任意次,至少一次 或 次 任意次, . :任意一个符号 任意一个符号 |:二选一 : ():分组 括号内的内容被看作一个原子, 分组, () 分组,括号内的内容被看作一个原子,如 (ab) )
使用lex与yacc构建简单计算器
使用lex与yacc构建简单计算器最近从本科时候的资料中翻到了编译原理的资料,翻到了部分lex 与yacc学习的资料和部分程序,后来又模仿老师给我们的例子程序写了一个简单的计算器,供初学者参考,也作为自己的一个学习笔记。
关于lex现在常用的是GNU的Flex,主页是/,其中有相关文档,以及程序源代码。
在 Windows下一版可以直接下载Flex.exe,lex主要是一个词法分析器他只要通过正则对字符串进行分析,生成一系列逻辑单元,通常被称为记号(token),lex的主要工作就是将字符串分解为token串,每个token代表特定的意义。
Yacc是一个LALR(1)的语法分析器,通过与lex相结合,就可以完成比较复杂的功能。
已实现的功能:带括号的整数加减乘除运算。
代码 scan.l[cpp]view plaincopy1.%{2.#include<string.h>3.#include "y.tab.h"4.extern int yylval;5.%}6.numbers ([0-9])+7.plus "+"8.minus "-"9.times "*"10.divide "/"11.lp "("12.rp ")"13.delim [ /n/t]14.ws {delim}*15.%%16.{numbers} {17.sscanf(yytext, "%d", &yylval);18.return INTEGER;19.}20.{plus} {return PLUS;}21.{minus} {return MINUS;}22.{times} {return TIMES;}23.{divide} {return DIVIDE;}24.{lp} {return LP;}25.{rp} {return RP;}26.{ws} ;27.. {printf("Error");exit(1);}28.%%Calcs.y[cpp]view plaincopy1.%{2.#include <stdio.h>3.#include "lex.yy.c"4.#define YYSTYPE int5.%}6.%token INTEGER PLUS MINUS TIMES DIVIDE LP RP7.%%mand : exp {printf("%d/n",$1);}9.exp: exp PLUS term {$$ = $1 + $3;}10.|exp MINUS term {$$ = $1 - $3;}11.|term {$$ = $1;}12.;13.term : term TIMES factor {$$ = $1 * $3;}14.|term DIVIDE factor {$$ = $1/$3;}15.|factor {$$ = $1;}16.;17.factor : INTEGER {$$ = $1;}18.| LP exp RP {$$ = $2;}19.;20.%%21.int main()22.{23.return yyparse();24.}25.void yyerror(char* s)26.{27.fprintf(stderr,"%s",s);28.}29.int yywrap()30.{31.return 1;32.}编译[cpp]view plaincopy1.flex scan.l2.yacc calc.y3.gcc -o mycalc.exe y.tab.c4.mycalc.exe <text1.txt5.pause其中lex 与 yacc 程序需要放在环境变量中的PATH下,gcc 可以换成其他的编译器,按照以上操作,一个简单的计算器就完成了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Win7下lex 与yacc的安装配置
前言
初学lex与yacc,不知所以然。
完全找不到北,看了好几次的lex与yacc介绍,仍然不懂这究竟为何物,受尽了种种折磨,差点以头抢地而。
故而整理此文,以便后者,顺便感谢本文结尾处的三位大神,正因为他们,才有了此文。
lex
Lex 是一种生成扫描器的工具。
扫描器是一种识别文本中的词汇模式的程序。
一种匹配的常规表达式可能会包含相关的动作。
这一动作可能还包括返回一个标记。
当Lex 接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配。
它一次读入一个输入字符,直到找到一个匹配的模式。
如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记)。
另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex 将显示一个错误消息。
yacc
Yacc 代表Yet Another Compiler Compiler。
Yacc 的GNU 版叫做Bison。
它是一种工具,将任何一种编程语言的所有语法翻译成针对此种语言的Yacc 语法解析器。
借助lex和yacc,我们可以很容易地开发出所谓的编译器。
linux下有很多很方便的小工具,linux系统已经自带有扫描器(flex)与解释器(bison)。
幸运的是这些小工具一般都有windows 的版本。
现在我就简单说一下如何在windows下安装这些小工具。
首先
下载下载flex和bison。
网址分别是/packages/flex.htm和/packages/bison.htm。
仅需下载setup文件即可,然后安装。
安装时,设定路径最好不要是在Program Files文件夹里面,因为文件夹名字带空格会影响以后的使用。
可如此:安装在c:\gnuwin32下面。
其次
由于我们使用的flex和bison都是GNU的工具,所以为了方便,采用的C/C++
编译器也采用GNU的编译器GCC,当然我们需要的也是Windows版本的GCC了。
目前Windows平台的GCC主要是MinGW编译器,可以到MinGW的主页下载安装。
下载地址:/projects/mingw/files/latest/download?source=fi les
安装过程中,会自动开启控制台,我们仅需稍等片刻,任其自动完成。
安装完毕后,将c:\gnuwin32\lib里面的libfl.a和liby.a复制到C:\MinGW\lib里面。
再者
现在该安装的都已安装完毕,那么我们该设置环境变量了。
右键点击“计算机”,“属性”、“高级系统设置”、“环境变量”,在下面系统变量里面找到PATH,修改,在后面加上c:\gnuwin32\bin 和C:\MinGW\bin。
注意每一个路径是用分号分隔的,然后写第一个路径,然后分号,第二个路径。
如果你的安装的目录和我不一样,就对应修改就好了。
至此万事俱备,我们可以开始两个简单的文件来测试一下。
1.新建文本文件,更改名称为lex.l,敲入下面代码
%{
int yywrap(void);
%}
%%
%%
int yywrap(void)
{
return 1;
}
2.新建文本文件,更改名称为yacc.y,敲入下面代码
%{
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
如果我们看到当前文件夹上多了两个文件(yacc.tab.c,lex.yy.c),那么说明lex&&yacc已经安装配置成功,接下来就好好享受这两个小工具的魅力吧。
现在我们来试用下lex:
1、新建文本文件,更改名称为a.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);
return 0;
}
int yywrap()
{
return 1;
}
2、新建文本文件,更名为b.c,敲入下面代码--------此为输入源代码
asd asdf 23 q
a1
b2
!#@
while
3、打开菜单,运行,输入cmd。
输入:cd 文件夹路径
输入:flex a.lex 回车后生成一个lex.yy.c文件
输入:gcc -o a lex.yy.c -lfl 回车后生成一个a.exe文件,现在我们已得到了一个简易的词法分析器,下面就是运用次词法分析器,分析下b.c文件
输入:a.exe <b.c> a.txt 回车后生成一个a.txt文件
流程图如下:
结果如下:
到此,lex的基础使用,你已掌握得差不多了。
望深入探究!
致谢(排名不分先后)
笃行者------lex&yacc安装配置/bedusing/article/details/5409495熊春雷------lex和yacc从入门到精通若有想法可点击下面链接下载:
/view/67f307a7284ac850ad02423f.html
泥土笨笨其博客地址为/lowerbyte。