c语言词法分析器自动机,词法分析程序设计和自动构造.ppt

词法分析程序设计和自动构造

武汉理工大学计算机科学系陈天煌 词法分析程序设计与自动构造 彭德巍 2011.10.12 主要内容 词法分析程序设计 词法分析程序自动构造 1.词法分析程序设计 词法分析总控程序见图1。 界限符 运算符 字母 数字 结束符“#” 开始 到输入流中读下一字符?Char Char是什么? 初始化 标识符和关键字 词法分析子程序 无符号数 词法分析子程序 运算符 词法分析子程序 界限符 词法分析子程序 结束 图1 词法分析总控程序 若对自动机的每一个状态赋予一定的功能,并把其边上的符号视为转移条件,那么自动机就成为一个程序了。以无符号数为例:给定语法图2,构造自动机见图3。 d . d e + - d 图2 无符号数的语法图 图3 无符号数的自动机 1 2 3 4 5 6 0 ? d d + ε - . e d . other other d d other e d 7 e 开始 0?N,P,j; 1?e 数字?d; N*10+d?N 是数字? Y 读字符?char N Y N 整型量 标记?C1 是’-’吗? 读字符?char 是’e’吗? 是’-’吗? -1?e 读字符?char Y N Y N 读字符?char 是数字? Y 数字?d;N*10+d?N; j+1?j 是数字? Y 读字符?char ERROR N N 实型量 标记?C1 是数字? Y 数字?d; P*10+d?P Y 读字符?char ERROR N N 实型量标记?C1 N*10e*P-j? t 结束 Y N 整数部分 小数部分 是’.’吗? 是数字? 指数部分 N 图4 无符号数词法分析流程图 最后可得到无符号数分析算法流图见图4。 2.词法分析程序设计自动构造 Flex简介 Flex源文件分析 Flex词法分析程序设计自动构造演示 实验任务和要求 2.1 Flex简介 ?FLEX通过读取一个有规定格式的文本文件,输出一个如下所示的C语言源程序。 Flex源文件格式 ?LEX对源文件的格式要求非常严格,所以书写时一定要注意。 ???LEX的源文件由三个部份组成,每个部分之间用顶行的“%%”分割,其格式如下: ???定义部份 ???%% ???规则部份  ???%% ???用户附加C语言部份 定义部分 定义部份由C语言代码、模式的宏定义组成。 除宏定义外,定义部分的其余代码必须用符号%{ 和 %} 括起来。另外,flex使用的C语言库文件和外部变量以及部分声明的函数,也应分别置于%{ 和 %} 之内。 例如下面是一个flex语言的说明部分: %{ #include “stdio.h” int num = 0 %} DIGIT [0-9] ID [A-Za-z][A-Za-z0-9_]* %% 注意:这里起标识符作用的%%和%{ 、%}必须要顶行写 规则部分 规则部份是LEX源文件的核心部份,它包括一组模式和在生成分析器识别相应模式后对相应模式进行处理的C语言动作(Action)。格式如下: ???C语言代码 ???模式1 动作1 ???模式2 | ???模式3 动作3 用户附加C语言部份 支持规则动作部分所需要的处理过程,是对规则部分中动作的补充。 FLEX对此部份不作任何处理,仅仅将其直接拷贝到输出文件lex.yy.c的尾部。 Flex中模式的定义 digit [0-9] number ("-"|"+")?{digit}+ hexnumber "0x"({digit}|[a-fA-F])+ letter [a-zA-Z] identifier ({letter}|_)({number}|{letter}|_)* newline [\n] whitespace [ \t]+ string \"[^"]*\" comment "#"[^#]*"#" Flex中模式的定义-PL/0语言 digit [0-9] letter [a-zA-Z] number {digit}+ identifier {letter}({letter}|{digit})* wrongid ({digit}+){letter}({letter}|{digit})* newline [\n] whitespace [\t]+ Lex.yy.c中的全局变量和函数 File *yyin?? /* 指向词法分析器要接收的待分析程序的指 针。如果不指定则默认指向标准

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值