网站大量收购闲置独家精品文档,联系QQ:2885784924

lex和yacc课件.ppt

  1. 1、本文档共60页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
lex和yacc课件

LEX 和 YACC;12.1 LEX简介;手动生成编译程序的缺点:工作量太大,维护困难 如:ANSI C的词法规则有近100条,相应的状态NFA有600多,DFA有200多;利用LEX自动生成编译程序;例:一个LEX源程序(统计文本文件行数和字符数) TEST.L int num_chars=0,num_lines=0; %% \n {++num_chars;++num_lines;}//一定要顶行写 . ++num_chars; %% main() { yylex(); printf(the line is %d,the char is %d,num_lines,num_chars);} int yywrap() {return 1;};使用过程;12.2 LEX源文件的格式;12.2.1 模式;模 式;白字符的处理:需用""或[ ]括起来 汉字如何匹配? []的使用要注意.如[^]*;12.2.2 定义部分;例: %{ int num_chars,num_lines; }% DIGIT [0-9] ID [a-z][a-z0-9]*;12.2.3 规则部分;12.2.4 用户代码部分;12.3 LEX的工作原理;12.4 yylex()的匹配原则;缺省规则:无模式可匹配时,原样拷贝至yyout. 最短的lex源程序 %%;12.5 动作部分;| 的用法 %% world | water printf(Same action); 一些重要函数、变量和宏 int yywrap(); yyin;yyout;yytext; REJECT;ECHO;条件模式;不用条件模式的程序 int flag; %% ^a {flag=a;ECHO;} ^b {flag=b;ECHO;} \n {flag=0;ECHO} world {switch(flag) {case a: printf(first);break; case b: printf(second);break; default: ECHO;break;}} %%;用条件模式的程序 %start AA BB %% ^a {ECHO;BEGIN AA;} ^b {ECHO;BEGIN BB;} \n {ECHO;BEGIN 0;} AA world printf(first); BB world printf(second);;12.6 LEX部分例题;例二:汉字GB码在文本文件中用两个最高位是1的字节表示,试利用lex设计一程序,统计一个文本文件中的汉字数。 例三:实验一的词法分析器如何用lex来实现?;%{ #include stdio.h #include stdlib.h int num_num=0,num_id=0; %} INTEGER [-+]?[1-9][0-9]* ID [a-zA-Z][a-zA-Z_0-9]* SPACE [ \n\t] ;%% {INTEGER}  {num_num++;ECHO;} {ID} {num_id++;ECHO;} SPACE | . {} %% main() {yylex();printf(num_num=%d,num_id=%d);} int yywrap() {return 1;};例二参考答案;不妨设LEX源程序名为b.l,内容如下 %{ #include stdio.h #include stdlib.h int count=0; %} %% [\x80-\xff][\x80-\xff] count++;ECHO; . | \n;%% void main() { if((yyin=fopen(zp.txt,r))==NULL) { printf(\nCant open filezp.txt);exit(0); } yylex(); printf(\ncount=%d,count); } int yywrap() { return 1;};上例运行步骤: 在dos提示符下运行 flex b.l,此时可生成一lexyy~1.c的C程序. 在C集成环境下(Bc3.1 或Tb2.0)按F9编译此程序,可得可执行文件lexyy~1.exe

文档评论(0)

gm8099 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档