欢迎来到天天文库
浏览记录
ID:39836328
大小:232.50 KB
页数:24页
时间:2019-07-12
《词法分析程序设计与自动构造》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、词法分析程序设计与自动构造彭德巍2011.10.12主要内容词法分析程序设计词法分析程序自动构造1.词法分析程序设计词法分析总控程序见图1。界限符运算符字母数字结束符“#”开始到输入流中读下一字符CharChar是什么?初始化标识符和关键字词法分析子程序无符号数词法分析子程序运算符词法分析子程序界限符词法分析子程序结束图1词法分析总控程序若对自动机的每一个状态赋予一定的功能,并把其边上的符号视为转移条件,那么自动机就成为一个程序了。以无符号数为例:给定语法图2,构造自动机见图3。d.de+-d图2无符号数的语法图图3无符号数的自动机1234560dd
2、+ε-.ed.otherotherddothered7e开始0N,P,j;1e数字d;N*10+dN是数字?Y读字符charNYN整型量标记C1是’-’吗?读字符char是’e’吗?是’-’吗?-1e读字符charYNYN读字符char是数字?Y数字d;N*10+dN;j+1j是数字?Y读字符charERRORNN实型量标记C1是数字?Y数字d;P*10+dPY读字符charERRORNN实型量标记C1N*10e*P-jt结束YN整数部分小数部分是’.’吗?是数字?指数部分N图4无符号数词法分析流程图最后可得到无符
3、号数分析算法流图见图4。2.词法分析程序设计自动构造Flex简介Flex源文件分析Flex词法分析程序设计自动构造演示实验任务和要求2.1Flex简介FLEX通过读取一个有规定格式的文本文件,输出一个如下所示的C语言源程序。输入文件扩展名为.lFlex输出文件Lex.yy.cFlex源文件格式LEX对源文件的格式要求非常严格,所以书写时一定要注意。LEX的源文件由三个部份组成,每个部分之间用顶行的“%%”分割,其格式如下:定义部份%%规则部份%%用户附加C语言部份定义部分定义部份由C语言代码、模式的宏定义组成。除宏定义外,定义部分的其余代码必须用符号%{
4、和%}括起来。另外,flex使用的C语言库文件和外部变量以及部分声明的函数,也应分别置于%{和%}之内。例如下面是一个flex语言的说明部分:%{#include“stdio.h”intnum=0%}DIGIT[0-9]ID[A-Za-z][A-Za-z0-9_]*%%注意:这里起标识符作用的%%和%{、%}必须要顶行写规则部分规则部份是LEX源文件的核心部份,它包括一组模式和在生成分析器识别相应模式后对相应模式进行处理的C语言动作(Action)。格式如下:C语言代码模式1动作1模式2
5、模式3动作3用户附加C语言部份支持规则动作部分所需要的处理过程,是
6、对规则部分中动作的补充。FLEX对此部份不作任何处理,仅仅将其直接拷贝到输出文件lex.yy.c的尾部。Flex中模式的定义digit[0-9]number("-"
7、"+")?{digit}+hexnumber"0x"({digit}
8、[a-fA-F])+letter[a-zA-Z]identifier({letter}
9、_)({number}
10、{letter}
11、_)*newline[]whitespace[t]+string"[^"]*"comment"#"[^#]*"#"Flex中模式的定义-PL/0语言digit[0-9]letter[a
12、-zA-Z]number{digit}+identifier{letter}({letter}
13、{digit})*wrongid({digit}+){letter}({letter}
14、{digit})*newline[]whitespace[t]+Lex.yy.c中的全局变量和函数File*yyin /*指向词法分析器要接收的待分析程序的指针。如果不指定则默认指向标准输入终端(键盘)。如果我们待分析的程序是文件形式我们可以将这个指针指向该文件的地址指针*/File*yyout/*同上,唯一不同是该指针指向输出的文件。默认指向标准输出终端(屏幕)。
15、我们可通过重定向该指针改变输出流方向。*/Char*yytext/*指向识别的单词的地址;用来保存扫描一次匹配的字符串。*/Intyyleng /*匹配的字符串中字符的个数。*/Lex.yy.c中的全局变量和函数ECHO/*flex的默认动作,一般来说是输出字符串*/yywrap()/*扫描一次完后要调用的函数,返回一个值,当这个值为1的时候分flex就不再继续扫描。*/yyrestart()/*重新定向flex的输入*/Flex源文件分析(test.l)%{intwc=0;/*wordcount*/%}%%[a-zA-Z]+{wc++;}%%int
16、main(void){intn=yylex();returnn;}intyywr
此文档下载收益归作者所有