词法分析程序的设计

合集下载

词法分析及词法分析程序

词法分析及词法分析程序
语义加工过程:
– w,p,n初值为0,e初值为1;
– 处理整数部分时,对于每个di ,令w=w10+di ; – 处理小数部分时,对于每个di ,令w=w10+di ;及n++;
– 处理指数时,E后若有‘-’号,令e=-1;计算指数值 p=p10+d;
– 在出口处,令ICON=w或FCON=w10^(e(p-n)).
(2)设当前处在Ai状态,所扫描的字符为ai+1,在结点Ai所 射出的诸矢线中,寻找标记为ai+1的矢线(若不存在,则 表明w有语法错误),读入ai+1,并进入状态Ai+1;
(3)重复(2),直到w中所有字符被读完且恰好进入终态F 时,宣告整个识别结束,w可被接受.
28
例:G[Z]:
状态转换图:
Z→0U∣1V
{return ( ICON= w ); {n++; w=w*10+d;}
{return (FCON =w*pow(10,e*p-n) ) ;} {n++;w=w*10+d;} error {p=p*10+d;}
e=-1; error {p=p*10+d;} error {p=p*10+d;} {return (FCON=w*pow(10,e*p-n) );
(1)对于G中形如Aa 的产生式,引矢线RA,且标记
为a;
(2)对于G中形如ABa 的产生式,引矢线 BA,且标
记为a。
34
由左线性文法构造状态转换图
已给文法G=({S,U},{0,1},{SS1 |U1, UU0 | 0},S)
R0
0
1
U1 S

词法分析程序的设计原则-单词的描述技术-识别机制及词法

词法分析程序的设计原则-单词的描述技术-识别机制及词法

令 ={a,b}, 上的正规式和相应的正 规集的例子
a ab
(ab)(ab) a (ab)
(ab)()(ab)
{a} {}
{} {}
{ , ……任意个a的串} { ……所有由 a和b 组成的串}
{上所有含有两个相 继的a或两个相继的b 组成的串}
讨论两个例子
例3.1
}; K Z (‘’)
(‘’)
å= { }
不确定的有穷自动机
定义 K, ,f,S,Z ,其中K为状态的有 穷非空集, 为有穷输入字母表,f为 K * 到K的子集(2 K)的一种映射, S K是初始状态集,Z K为终止状态 集.
例子 ({S,P,Z},{0,1},f,{S,P},{Z}) 其中 f(S,0)={P} f(S,1)={S,Z} f(P,1)={Z} f(Z,0)={P} f(Z,1)={P}
)(e(+ - )
)
表示的是无符号数的集合。其中d为0~9的数字。
程序设计语言的单词都能用正规式 来定义.
有穷自动机
有穷自动机(也称有限自动机)作为一种识别装 置,它能准确地识别正规集,即识别正规式所 表示的集合.应用有穷自动机这个理论,为词法 分析程序的自动构造寻找有效的方法和工具。 有穷自动机分为两类:确定的有穷自动机( )和 不确定的有 穷自动机( ) 。
(U,)(f(U,a),b)
(Q,b)
Q属于终态。 得证。
a
Ua b, a
S
b
aQ
b
V
b
M所能接受的符号串的全体记为L(M).
结论:
ห้องสมุดไป่ตู้
上一个符号串集V
是正规的,当
且仅当存在一个 上的确定有穷自动机

编译原理 词法分析程序设计

编译原理 词法分析程序设计

实验1 词法分析程序设计【实验目的】(1)理解词法分析在编译程序中的作用(2)加深对有穷自动机模型的理解(3)掌握词法分析程序的实现方法和技术【实验内容】对一个简单语言的子集编制一个一遍扫描的词法分析程序。

【设计思路】图1.1 词法分析主程序示意图2、源程序代码(1)scan.h //头文件-----扫描程序#include<stdio.h>#include<string.h>#define CLEAR memset(token,'\0',sizeof(token))//清空数组tokenchar prog[80],token[8];char ch;int syn,p,m,n,sum; //p是缓冲区prog的指针,m是token的指针char *rwtab[6]={"begin","if","then","while","do","end"};void scanner() //词法扫描程序{CLEAR;m=0;while(ch==' '){++p;ch=prog[p]; //读下一个字符;}if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){m=0;while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')){token[m++]=ch;++p;ch=prog[p];//读下一个字符;}token[m++]='\0';syn=10;for(n=0;n<6;++n)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}elseif(ch>='0'&&ch<='9'){sum=0;while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';//将ch转换为数字++p;ch=prog[p];}syn=11;}elseswitch(ch)//其他字符情况{case'<':m=0;token[m++]=ch;++p;ch=prog[p];if(ch=='>'){syn=21;++m;token[m]=ch;}else if(ch=='='){syn=22;++m;token[m]=ch;}{syn=20;}break;case'>':token[0]=ch;++p;ch=prog[p];if(ch=='='){syn=24;token[0]=ch;}else{syn=23;}break;case':':token[0]=ch;++p;ch=prog[p];if(ch=='='){syn=18;++m;token[m]=ch;++p;ch=prog[p];}else{syn=17;}break;case'+':syn=13;token[0]=ch;ch=prog[++p];break;case'-':syn=14;token[0]=ch;ch=prog[++p];break;case'*':syn=15;token[0]=ch;ch=prog[++p];case'/':syn=16;token[0]=ch;ch=prog[++p];break;case'=':syn=25;token[0]=ch;ch=prog[++p];break;case';':syn=26;token[0]=ch;ch=prog[++p];break;case'(':syn=27;token[0]=ch;ch=prog[++p];break;case')':syn=28;token[0]=ch;ch=prog[++p];break;case'#':syn=0; token[0]=ch;ch=prog[++p];break;default:syn=-1;}}(2)word.cpp // 词法分析主程序#include"scan.h"void main(void){p=0;printf("\n please input string:\n");do{ch=getchar();prog[p++]=ch;}while(ch!='#');p=0;ch=prog[0];if(ch>='0'&&ch<='9')printf("error!\n");else{do{scanner();//调用扫描子程序switch(syn){case 11:printf("(%d,%d)\n",11,sum);break;case -1:printf("error!\n");break;default:printf("(%d,'%s')\n",syn,token);}} while(syn!=0);}}【思考题】在编程过程中遇到了哪些问题,你是如何解决的。

词法分析程序的设计与实现

词法分析程序的设计与实现

词法分析程序的设计与实现方法1:采用C作为实现语言,手工编制一.文法及状态转换图1.语言说明:C语言有以下记号及单词:(1)标识符:以字母开头的、后跟字母或数字组成的符号串。

(2)关键字:标识符集合的子集,该语言定义的关键字有32个,即auto,break,case,char,const,continue,default,do,double,else,enum, extern,float,for,goto,if,int,long,register,return,short,signed,static, sizeof,struct,switch,typedef ,union,unsigned ,void, volatile和while。

(3)无符号数:即常数。

(4)关系运算符:<,<=,==,>,>=,!=。

(5)逻辑运算符:&&、||、!。

(6)赋值号:=。

(7)标点符号:+、++、-、--、*、:、;、(、)、?、/、%、#、&、|、“”、,、.、{}、[]、_、^等(8)注释标记:以“/*”开始,以“*/”结束。

(9)单词符号间的分隔符:空格。

2.记号的正规文法:仅给出各种单词符号的文法产生式(1)标识符的文法id->letter ridrid->ε|letter rid|digit rid(2)无符号整数的文法digits->digit remainderremainder->ε|digit remainder(3)无符号数的文法num->digit num1num1->digit num1|. num2|E num4|εnum2->digit num3num3->digit num3|E num4|εnum4->+digits|-digits|digit num5digits->digit num5num5->digit num5|ε(4)关系运算符的文法relop-> <|<=|==|>|>=|!=(5)赋值号的文法assign_op->=(6)标点符号的文法special_symbol->+|-|*|%|#|^|(|)|{|}|[|]|:|;|”|?|/|,|.& (7)逻辑运算符的文法logic->&&| || | !(8)注释头符号的文法note->/starstar->*3.状态转换图其中,状态0是初始状态,若此时读入的符号是字母,则转换到状态1,进入标识符识别过程;如果读入的是数字,则转换到状态2,进入无符号数识别过程;……;若读入的符号是/,转换到状态11,再读入下一个符号,如果读入的符号是*,则转换到状态12,进入注释处理状态;如果在状态0读入的符号不是语言所定义的单词符号的开始字符,则转换到状态13,进入错误处理状态。

4.1词法分析程序的设计.ppt

4.1词法分析程序的设计.ppt

例: 令={a,b}, 上的正规式和相应的正规集为:
正规式
正规集
a
{a}
ab
{a,b}
ab
{ab}
(ab)(ab) a (ab)
(ab)(aabb)(ab)
{aa,ab,ba,bb}
{ ,a,a, ……任意个a的串} { ,a,b,aa,ab ……所有由a和b组成 的串} {上所有含有两个相继的a或两个 相继的b组成的串}
例: <无符号数>→d<余留无符号数>|.<十进小数>|e<指数 部分> <余留无符号数>→ d<余留无符号数>|.<十进小数>|e< 指数部分>| <十进小数>→ d<余留十进小数> <余留十进小数>→e<指数部分>| d<余留十进小数> | <指数部分>→ d<余留整指数> |s<整指数> <整指数>→ d<余留整指数> <余留整指数>→d<余留整指数> |
前例的DFA 的状态图表 示如右:
DFA的矩阵表示
行表示状态;列表示输入字符则; 矩阵元素表示相应状态行和输入字符列下的新状态,即
第k行a列为f(k,a)的值; 用“=>”标记行或“+”第一行表示初态;终态行右端标以
1,非终态行右端标以0。
前例的DFA的矩阵表示如下:
方便起见,对DFA中转换函数定义进行扩充:
设NFA=(K,,f,S,Z),如果 z0∈f(S,α) 且 z0∈Z,
则称符号串α∈*可被该NFA接受(识别)。

词法分析与语法分析程序设计

词法分析与语法分析程序设计

实验三词法分析与语法分析程序设计一.实验目的基本掌握计算机语言的词法分析程序和语法分析程序的设计方法。

二.实验要求、内容及步骤实验要求:1.根据以下的正规式,画出状态图;标识符:<字母>(<字母>|<数字字符>)*关键字:if then else while do十进制整数:0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 运算符和分隔符:+ - * / > < = ( ) 。

2.根据状态图,设计词法分析函数int scan( ),从键盘读入数据,分析出一个单词。

3.对于只含有+、*运算的算术表达式的如下文法,编写相应的语法分析程序,要求用LL(1)分析表实现,并以id+id*id为例进行测试:E —> TE′E′—> +TE′|εT —> FT′T′—> *FT′|εF —>(E)| id实验步骤:1.根据状态图,设计词法分析算法;2.采用C++语言,实现该算法;3.调试程序:输入一组单词,检查输出结果;4.编制给定文法的非递归的预测分析程序,并加以测试。

三.实验设备计算机、Windows 操作系统、Visual C++ 程序集成环境。

四.实验原理1. 词法分析器读入输入串,将其转换成将被语法分析器分析的词法单元序列。

产生下述小语言的单词序列。

这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表:单词符号种别编码助记符内码值DIMIFDO STOP END标识符常数(整)=+***,()1234567891011121314$DIM$IF$DO$STOP$END$ID$INT$ASSIGN$PLUS$STAR$POWER$COMMA$LPAR$RPAR------内部字符串标准二进形式------对于这个小语言,有几点重要的限制:首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。

所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。

实验一 词法分析程序的设计与实现(C语言)

实验一 词法分析程序的设计与实现(C语言)

实验一 词法分析程序的设计与实现(C 语言)一、实验目的通过C 语言词法分析程序的实现理解编译程序过程中对单词的分析过程。

二、实验重难点DFA 自动机的数据结构表示,程序流程图,词法分析程序实现三、实验内容与要求实验内容:1. 设计存储DFA 自动机的数据结构2.绘制程序流程图3. 词法分析程序设计四、实验学时2课时五、实验设备与环境C 语言编译环境六、根据实验过程填写下列内容1.DFA 自动机的状态转换图和数据结构设计。

a /b2. 程序流程图(见附页)3. 代码#include<stdio.h>int f(int x,char e){ int df[4][2]={{2,3},{4,3},{2,4},{4,4}};U a a a S b Q bV bint i;if(e=='a')i=df[x][1];if(e=='b')i=df[x][2];return(i);}void main(){ int S=1,U=2,V=3,Q=4;int k=S;char c;printf("请输入字符,按#结束:\n");c=getchar();while(c!='#'){k=f(k,c);c=getchar();}if(k==Q) printf("你输入的字符串能被DFA所识别\n");else printf("你输入的字符串能被DFA所识别\n");}4.测试数据及结果分析(结果见附页)分析:从实验的结果可以看出上面程序代码基本上可以实现所给DFA的要求,但是有关实验的可读性和功能方面还有待进一步改进。

程序流程图教师评语:是否完成实验程序的预备设计? 是: 不是: 程序能否正常运行? 是: 不是: 有无测试数据及结果分析 是: 不是: 是否在本次规定时间完成所有项目? 是: 不是: 实验成绩等级: 教师签名:N0:时间:开始初始化输入句子判断是否退出标志判断是否被接受?接受不接受输出错误位置NY NY结束。

词法分析程序设计

词法分析程序设计

词法分析程序设计词法分析是编译器设计中的一个关键步骤,它负责将源代码文本转换成一系列的词法单元(tokens),这些词法单元是语法分析阶段的输入。

词法分析程序的设计通常包括以下几个主要部分:定义词法规则、构建词法分析器、生成词法单元以及错误处理。

1. 定义词法规则词法规则是词法分析器识别源代码中各种词法单元的基础。

这些规则通常包括关键字、标识符、常量(如数字和字符串)、运算符和分隔符等。

例如,对于C语言,词法规则可能包括识别`int`、`float`等关键字,以及识别变量名、数字和字符串字面量等。

2. 构建词法分析器构建词法分析器的过程通常涉及到选择一个合适的算法或工具。

常见的方法有手工编写词法分析器、使用词法分析生成器(如Lex或Flex)来自动生成词法分析器。

手工编写词法分析器手工编写词法分析器需要程序员根据词法规则,使用编程语言(如C、Java等)实现一个扫描器(scanner)。

扫描器的主要任务是逐字符地读取源代码,并根据词法规则识别出词法单元。

使用词法分析生成器使用词法分析生成器可以大大简化词法分析器的开发过程。

开发者只需定义词法规则,并使用生成器工具来生成扫描器代码。

例如,Flex是一个基于正则表达式的词法分析生成器,它可以从定义的规则中自动生成C或C++代码。

3. 生成词法单元词法单元是词法分析器输出的基本单位。

每个词法单元通常包含两个部分:类型和值。

类型指明词法单元的种类(如关键字、标识符等),而值则是词法单元的具体内容(如标识符的名称、数字的值等)。

在生成词法单元时,词法分析器需要根据识别出的词法规则,将源代码中的字符序列转换成相应的词法单元。

例如,当词法分析器读取到`123`时,它应该识别这是一个整数常量,并生成一个类型为`INTEGER`,值为`123`的词法单元。

4. 错误处理在词法分析过程中,可能会遇到不符合词法规则的字符序列,这时就需要进行错误处理。

错误处理通常包括以下几个方面:- 识别错误:当遇到无法识别的字符或字符序列时,词法分析器应该能够识别出这是一个错误。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3. 特殊问题的处理
❖ 标识符和保留字的区分 ❖ 事先构造保留字表,拼出的标识符单词先
查保留字表,若有,则把它做为保留字处理 ❖ 空格符和制表符()以及换行符的处理 ❖ 无用的空格符和制表符要删掉; ❖ 字符串内的空格不能删; ❖ 换行符不能删,对于错误处理起作用。 ❖ 复合型特殊符,如“”的处理 ❖ 读到“:”时不能判断是否为冒号,必须读
源程序
Token序列
独立词法分析器
语法分析
源程序 附属词法分析器
调用 Token
语法分析
2. 确定单词分类和结构
设计词法分析器的首要任务是,对于源语言的 单词进行仔细的分析,并列出所有可能的不同 单词,然后再确定单词的内部表示 程序设计语言中的大部分单词,一般可分为以下 几类: 1.基本字(关键字):如 ,, 等 2.标识符:用来表示常量、变量、过程等名字 3.常数:各种类型的常数,如 15,3.14, 4.运算符:如 +,—,*,/ 5.界符:如逗号,分号,括号等
单词的机内表示
二元式(单词种别,单词自身的值)
种别是语法分析需要的信息
自身值是编译其他阶段需要的信息
种别编码(常用整数编码)
方法一:按单词的5大种类每种一个码,例 如标识符为l,常数为2,基本字为3,运算符为 4,界符为5。
方法二:每个基本字一个编码;所有标识符为 一个编码;常数按类型分类,每类一个编码; 每个运算符一个编码;每个界符一个编码。
单词自身值
对常数,基本字,运算符,界符就是他们本 身的值
对标识符,将标识符的名字登记在符号表 中,“自身值”是指向该标识符所在符号 表中位置的指针.
例如 源程序 5 ; 种别编码:标识符为l,常数为2,基本字
为3,运算符为4,界符为5 词法分析后输出的单词序列是: (3,‘’) (1,指向i的符号表入口) (4,‘=’) (2,‘5’) (3,‘’) (1,指向x的符号表入口) (4,‘’) (1,指向y的符号表入口) (5,‘;’)
例:状态结点 i 对应的程序段
();
(()) {状态 j 的对应程序段;}
(()) {状态 k 的对应程序段;}
(‘/’) {状态 l 的对应程序段;}
{错误处理;}
字母
i
j
其中:
数字
k
和:布尔函数,
/
l
分别判别字符是否为字母或数字
➢ 终态结点,一般对应一个
return(code , value) 语 句 , code 是 单 词 种 别码,value是单词自身值,意为返回调用者:
4. 用状态转换图构造词法分析程序
可通过状态转换图来实现词法分析程序的构 造,步骤: 画状态转换图。 由正规文法构造状态转换图 由正规表达式构造状态转换图 将正规文法或正规表达式转换成(经历的构 造,将确定化,最小化的过程),将以状态 转换图的形式表现出来。
按状态转换图写出词法分析程序
对于状态图中的每一状态构造一段代 码具体构造程序时:
回顾:
词法分析的主要任务是:从左到右逐个字 符地扫描源程序,产生一个个单词(), 同时检查源程序中的词法错误。执行词 法分析的程序称为词法分析程序或扫描 程序()。
单词是语言中具有独立意义的最小单位, 包括保留字、标识符、运算符、标点符 号和常量等。
1. 确定词法分析器的接口
确定词法分析器是作为语法分析的一个子程 序还是作为独立一遍 词法分析作为独立一遍 将字符流的源程序变成单词序列,输出到一 个中间文件上,做为语法分析的输入。 词法分析作为语法分析的子程序 每当语法分析程序需要一个单词时,则调用 该子程序,从源程序中分析和返回左注释符和右注释符的配 对。也可以把 … …,[ ],{ },( )等语法配 对在词法分析中进行处理
❖ 处理方法:
❖ 对每类括号设置一个计数器(初值=0)
❖ 每当遇到左括号,则计数器加1
❖ 每当遇到右括号时,计数器减1
❖ 词法分析结束时,如果计数器 0,则表明括 号不匹配。
❖当词法分析作为语法分析的子程序,返回到语 法分析
❖当词法分析作为独立一遍,返回进行新的单词 识别
➢ 开始结点
➢ 开始结点是一个单词识别的开始,单词开
始符是非空白字符,首先把非空白字符读入, 再按该字符的特征进入不同种类单词的识别
➢ ();/*从输入串读一个字符,放入 中*/
➢ ();/*检查中字符是否空白,若是则调用, 直至中为非空白字符*/

(…) …

(…) …



错误处理;
➢ 不含回路的分叉结点,对应语句或一组……语 句
相关文档
最新文档