欢迎来到天天文库
浏览记录
ID:5262922
大小:305.82 KB
页数:18页
时间:2017-12-07
《ch03--词法分析-lex》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第3章词法分析——LEXLIWensheng,SCST,BUPT使用LEX的流程LEX源文件格式LEX工作原理一、使用LEX的流程LEX源程序LEX编译器Lex.yy.clex.llex.yy.cC编译器Lex.yy.o或a.out字符流源程序a.out记号序列WenshengLiBUPT2二、LEX源程序一个LEX源程序由三部分组成:1.说明部分2.翻译规则3.辅助过程说明部分%%翻译规则%%WenshengLiBUPT辅助过程31.说明部分包括:–变量说明–标识符常量说明–正规定义正规定义中的名字可在翻译规则中用作正规表达式的成分Wensh
2、engLiBUPTC语言的说明必须用分界符“%{”和“%}”括起来。42.翻译规则形式:P1{动作1}P2{动作2}…Pn{动作n}Pi是一个正规表达式,描述一种记号的模式。WenshengLiBUPT动作i是C语言的程序语句,表示当一个串匹配模式Pi时,词法分析器应执行的动作。53.辅助过程对翻译规则的补充翻译规则部分中某些动作需要调用的过程,如果不是C语言的库函数,则要在此给出具体的定义。这些过程也可以存入另外的程序文件中,单独编译,然后和词法分析器连接装配在一起。WenshengLiBUPT6LEX源程序举例正规定义式:if
3、ifthenthenelseelserelop<
4、<=
5、=
6、<>
7、>
8、>=idletter(letter
9、digit)*numdigit+(.digit+)?(E(+
10、-)?digit+)?WenshengLiBUPT7相应的LEX源程序框架/*说明部分*/%{#include/*C语言描述的标识符常量的定义,如LT、LE、EQ、NE、GT、GE、IF、THEN、ELSE、ID、NUMBER、RELOP*/externyylval;%}/*正规定义式*/delim[t]ws{delim}+letter[A-Za-z
11、]WenshengLiBUPTdigit[0-9]id{letter}({letter}
12、{digit})*num{digit}+(.{digit}+)?(E[+-]?{digit}+)?%%8相应的LEX源程序框架/*规则部分*/{ws}{/*没有动作,也不返回*/}if{return(IF);}then{return(THEN);}else{return(ELSE);}{id}{yylval=install_id();return(ID);}{num}{yylval=install_num();return(NUMBER);}“<”{yyl
13、val=LT;return(RELOP);}“<=”{yylval=LE;return(RELOP);}“=”{yylval=EQ;return(RELOP);}WenshengLiBUPT“<>”{yylval=NE;return(RELOP);}“>”{yylval=GT;return(RELOP);}“>=”{yylval=GE;return(RELOP);}%%如果没有return语句,则,处理完整个输入之后才会返回!!9相应的LEX源程序框架/*辅助过程*/intinstall_id(){/*把单词插入符号表并返回该单词在符号表中的位置y
14、ytext指向该单词的第一个字符yyleng给出它的长度*/}intinstall_num(){/*类似于上面的过程,但单词是常数*/}WenshengLiBUPT10二、LEX的工作原理1.LEX的工作过程2.处理二义性问题的两条规则3.LEX工作过程举例4.控制执行程序WenshengLiBUPT111.工作过程扫描每一条翻译规则Pi,为之构造一个非确定的有限自动机NFAMi将各条翻译规则对应的NFAMi合并为一个新的NFAMq1NFAM1p1开始0q2NFAM1p2qnNFAM1pnWenshengLiBUPT将NFA
15、M确定化为DFAD,并生成该DFAD的状态转换矩阵和控制执行程序。122.二义性处理最长匹配原则–在识别单词符号过程中,当有几个规则看来都适用时,则实施最长匹配的那个规则优先匹配原则–如有几条规则可以同时匹配一字符串,并且匹配的长度相同,则实施最上面的规则。WenshengLiBUPT133.工作过程举例%%a{}abb{}{a}*b{b}*{}%%WenshengLiBUPT14读LEX源程序,分别生成非确定的有限自动机开始aa12abb开始abb3456ab{a}*b{b}*开始7b8WenshengLiBUPT15合并为一个NFAMa2
16、1开始abb03456abb78WenshengLiBUPT16将该NFAM确定化为DFADDFAD=({a,b},{
此文档下载收益归作者所有