编译原理_第二章 词法分析(1)

合集下载

编译原理 语法分析(2)_ LL(1)分析法1

编译原理 语法分析(2)_ LL(1)分析法1

自底向上分析法
LR分析法的概念 LR分析法的概念 LR(0)项目族的构造 LR(0)项目族的构造 SLR分析法 SLR分析法 LALR分析法 LALR分析法
概述
功能:根据文法规则 文法规则, 源程序单词符号串 单词符号串中 功能:根据文法规则,从源程序单词符号串中
识别出语法成分,并进行语法检查。 识别出语法成分,并进行语法检查。
9
【例】文法G[E] 文法G[E] E→ E +T | T 消除左递归 T→ T * F | F F→(E)|i 请用自顶向下的方法分析是否字 分析表 符串i+i*i∈L(G[E])。 符串i+i*i∈L(G[E])。
E→TE’ E’→+TE’|ε T →FT’ T’→*FT’|ε F→(E)|i
编译程序组织结构
表 处 理

端 中
源 程 序
词 法 分 析
语 法 分 析
语 义 分 析
间 代 码 生 成
中 后 目 端 间 标 代 代 码 码 优 生 化 成
目 标 程 序
错 误 处 理
第4章 语法分析
自顶向下分析法
递归子程序法(递归下降分析法) 递归子程序法(递归下降分析法) LL(1)分析法 LL(1)分析法
通常把按LL(1)方法完成语法分析任务的程序叫LL(1)分析程序或者LL(1)分析器。 通常把按LL(1)方法完成语法分析任务的程序叫LL(1)分析程序或者LL(1)分析器。 LL(1)方法完成语法分析任务的程序叫LL(1)分析程序或者LL(1)分析器
输入串
一、分析过程
#
此过程有三部分组成: 此过程有三部分组成: 分析表 总控程序) 执行程序 (总控程序) 分析栈) 符号栈 (分析栈)

清华大学编译原理第二版课后习答案

清华大学编译原理第二版课后习答案

Lw.《编译原理》课后习题答案第一章第1章引论第1题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。

(2)源程序:源语言编写的程序称为源程序。

(3)目标程序:目标语言书写的程序称为目标程序。

(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。

通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。

(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。

(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。

第2题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。

答案:一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。

其各部分的主要功能简述如下。

词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。

语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。

语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。

中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。

盛威网()专业的计算机学习网站1《编译原理》课后习题答案第一章目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。

表格管理程序:负责建立、填写和查找等一系列表格工作。

编译原理_第二章 词法分析(1)

编译原理_第二章  词法分析(1)
第二章
词法分析
主要内容: 词法分析过程涉及的几个问题 模式的形式化描述-正规式与正规集 记号的识别-有限自动机 从正规式到词法分析器 词法分析器生成器简介
2019/2/16
编译原理
1
一、词法分析过程涉及的几个问题
词法分析是编译过程中的第一个阶段。 执行词法分析的程序称为词法分析程序,也称 为词法分析器或扫描器。 任务是:从左至右逐个字符地对源程序进行扫 描,产生一个个单词符号,把字符串形式的源 程序改造成为单词符号串形式的中间程序。 功能是输入源程序,输出单词符号,并检查词 法错误。
2019/2/16
编译原理
7
注意:一个程序语言的保留字、运算符和 界符的个数是确定的,而标识符或常数 的使用则不限定个数。 将产生和识别单词的规则称为模式 (patten)。 按照某个模式(规则)识别出的元素称为记 号(token)。 单词(lexeme)一词是指被识别出元素自 身的值。
编译原理 2



2019/2/16
1、词法分析器的三种工作方式:

词法分析器作为主程序; 词法分析器作为子程序; 并行工作方式
2019/2/16
编译原理
3
图2.1 作为子程序的词法分析器
图2.2 词法分析器进行单独一遍扫描
2019/2/16 4
编译原理
图2.3 并行工作模式
2019/2/16



2019/2/16
编译原理
10





(2) 单词自身的值。 单词自身的值是编译中其它阶段所需要的信息。 对于单词符号来说: 如果一个种别只含有一个单词符号,那么对于这个单词符号,其 种别编码就完全代表了它自身的值。 如果一个种别含有多个单词符号,那么对于它的每个单词符号, 除了给出种别编码之外还应给出单词符号自身的值,以便把同一 种类的单词区别开来。 注意:标识符自身的值就是标识符自身的字符串,而常数自身的 值是常数本身的二进制数值。此外,我们也可用指向某类表格中 一个特定项目的指针来区分同类中的不同单词。 例如,对于标识符,可以用它在符号表的入口指针作为它自身的 值;而常数也可用它在常数表的入口指针作为它自身的值。

编译原理课后习题答案+清华大学出版社第二版

编译原理课后习题答案+清华大学出版社第二版
也称基地址。 SL: 静态链,指向定义该过程的直接外过程(或主程序)运行时最新数据段的基地址,
用以引用非局部(包围它的过程)变量时,寻找该变量的地址。 DL: 动态链,指向调用该过程前正在运行过程的数据段基地址,用以过程执行结束释放
数据空间时,恢复调用该过程前运行栈的状态。 RA: 返回地址,记录调用该过程时目标程序的断点,即调用过程指令的下一条指令的地
编译程序大致有哪几种开发技术?
答案:
(1)自编译:用某一高级语言书写其本身的编译程序。 (2)交叉编译:A 机器上的编译程序能产生 B 机器上的目标代码。 (3)自展:首先确定一个非常简单的核心语言 L0,用机器语言或汇编语言书写出它的编
译程序 T0,再把语言 L0 扩充到 L1,此时 L0⊂ L1 ,并用 L0 编写 L1 的编译程序 T1,再把语 言 L1 扩充为 L2,有 L1 ⊂ L2 ,并用 L1 编写 L2 的编译程序 T2,……,如此逐步扩展下 去, 好似滚雪球一样,直到我们所要求的编译程序。 (4)移植:将 A 机器上的某高级语言的编译程序搬到 B 机器上运行。
(main).
答案: 程序执行到赋值语句 b∶=10 时运行栈的布局示意图为:
1
《编译原理》课后习题答案第二章
第 3题 写出题 2 中当程序编译到 r 的过程体时的名字表 table 的内 容。
name
kind
level/val
adr
size
答案:
题 2 中当程序编译到 r 的过程体时的名字表 table 的内容为:
盛威网()专业的计算机学习网站
2
《编译原理》课后习题答案第一章
合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。

编译原理第三版课后习题答案

编译原理第三版课后习题答案

编译原理第三版课后习题答案编译原理是计算机科学中的一门重要课程,它研究的是如何将高级程序语言转换为机器语言的过程。

而《编译原理》第三版是目前被广泛采用的教材之一。

在学习过程中,课后习题是巩固知识、提高能力的重要环节。

本文将为读者提供《编译原理》第三版课后习题的答案,希望能够帮助读者更好地理解和掌握这门课程。

第一章:引论习题1.1:编译器和解释器有什么区别?答案:编译器将整个源程序转换为目标代码,然后一次性执行目标代码;而解释器则逐行解释源程序,并即时执行。

习题1.2:编译器的主要任务是什么?答案:编译器的主要任务是将高级程序语言转换为目标代码,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等过程。

第二章:词法分析习题2.1:什么是词法分析?答案:词法分析是将源程序中的字符序列划分为有意义的词素(token)序列的过程。

习题2.2:请给出识别下列词素的正则表达式:(1)整数:[0-9]+(2)浮点数:[0-9]+\.[0-9]+(3)标识符:[a-zA-Z_][a-zA-Z_0-9]*第三章:语法分析习题3.1:什么是语法分析?答案:语法分析是将词法分析得到的词素序列转换为语法树的过程。

习题3.2:请给出下列文法的FIRST集和FOLLOW集:S -> aAbA -> cA | ε答案:FIRST(S) = {a}FIRST(A) = {c, ε}FOLLOW(S) = {$}FOLLOW(A) = {b}第四章:语义分析习题4.1:什么是语义分析?答案:语义分析是对源程序进行静态和动态语义检查的过程。

习题4.2:请给出下列文法的语义动作:S -> if E then S1 else S2答案:1. 计算E的值2. 如果E的值为真,则执行S1;否则执行S2。

第五章:中间代码生成习题5.1:什么是中间代码?答案:中间代码是一种介于源代码和目标代码之间的表示形式,它将源代码转换为一种更容易进行优化和转换的形式。

编译原理课后答案2010

编译原理课后答案2010
空串。
2.4 为下列语言写正规定义
C 语言的注释,即以 /* 开始和以 */ 结束的任意字符串,但它的任何前缀
(本身除外)不以 */ 结尾。
[解答]
other → a | b | …
other 指除了*以外 C 语言中的其它字符
other1 → a | b | …
other1指除了*和/以外C语言中的其它字符
=> S0 = ((00|11)|(01|10) (00|11)*(01|10))*((00|11) + (01|10) (00|11)* (01|10)) => S0 = ((00|11)|(01|10) (00|11)* (01|10))+
因为S0→ε所以由偶数个 0 和偶数个 1 构成的所有 0 和 1 的串的正规定义为: S0 → ((00|11)|(01|10) (00|11)* (01|10))*
标记状态S1 S3 = ε-closure(move(S1, a)) = ε-closure({5, 8, 12}) = {1, 2, 4, 5, 6, 7, 8, 9, 11,
12, 13, 14, 16} S4 = ε-closure(move(S1, b)) = ε-closure({3, 10}) = {1, 2, 4, 5, 6, 7, 10, 13, 14,
S0 = 1S1 + 0S2
S1 = 1S0 + 0S3 + 1
S2 = 1S3 + 0S0 + 0 S3 = 1S2 + 0S1
所以:
S0 = (00|11) S0 + (01|10) S3 + 11 + 00
(1)
S3 = (00|11) S3 + (01|10) S0 + 01 + 10

编译原理词法分析和ll(1)文法判定

};
struct SYMINFO//词法分析信息结构体
{
int num;
struct SYM sym[MAX_SYM];
struct FORM form;
};
//取词函数(返回读字符数量,如果是0则表示结束,lin表示当前行数)
int __stdcall getsym(const char *in,struct SYM *out,int *ln,struct FORM *form);
#include <stdlib.h>//For memset()
#include <string.h>//For strcpy()
#define ISLETTER(c)((c)>='A'&&(c)<='Z'||(c)>='a'&&(c)<='z')
#define ISNUMBER(c)((c)>='0'&&(c)<='9')
#define IDC_INPUT 1001
#define IDC_OUTPUT 1003
#define IDC_ERRPUT 1004
#define IDC_BUTTON1 1005
#define ID_START 40001
#define ID_ABOUT 40003
#define ID_OPEN 40005
out->id=ERR_OVERNUMFORM;
return m+n;
}
form->numf[form->numnum].id=form->numnum;

编译原理词法分析和语法分析报告+代码(C语言版)[1]

词法分析一、实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

二、实验要求2.1 待分析的简单的词法(1)关键字:begin if then while do end所有的关键字都是小写。

(2)运算符和界符:= + - * / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。

空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

2.2 各种单词符号对应的种别码:输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。

例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……三、词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

3.1 主程序示意图:主程序示意图如图3-1所示。

其中初始包括以下两个方面:⑴关键字表的初值。

关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。

如能查到匹配的单词,则该单词为关键字,否则为一般标识符。

关键字表为一个字符串数组,其描述如下:Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,};图3-1(2)程序中需要用到的主要变量为syn,token和sum3.2 扫描子程序的算法思想:首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。

词法分析实验报告(实验一)

编译原理词法分析实验报告软工082班兰洁200831104044一、实验内容二、实验目的三、实验预期四、程序规定五、实验原理●程序流程图●判别浮点功能扩展流程图●状态转换图六、程序代码与浮点判别功能扩展七、测试用例●扩展功能测试用例;●普通功能测试用例八、输出结果九、实验心得一、实验内容:词法分析:1、识别简单语言的单词符号;2、识别关键字、标识符、数字、运算符等。

并扩展浮点识别功能。

二、实验目的调试词法分析程序,加深对词法分析原理的理解,掌握编写简单词法分析程序的一般步骤。

三、实验预期结果:经过调试源代码程序,程序能够成功运行编译,对输入的简单字符串,能够别关键字、标识符、数字、运算符等,并且给出单词符号的对应编码。

四、程序规定:1、关键字:"function","if","then","while","do","endfunc";2、算术运算符:”+”,”-”,”*”,”/”,”=”;3、关系运算符:"<" ">" "<=" ">=" "==" "!=";4、界符:"(" ")" ";" "#";5、标识符规定以字母开头,字母均为小写;6、空格和换行符跳过;7、单词对应编码:十、实验原理:输入串--------------------〉词法分析程序————————〉单词符号串输入:字符串以#结束。

输出:单词的二元组(syn,token/sum)程序流程图分析浮点数功能扩展部分流程图:shuzi()函数状态转换图六、程序代码:备注:红色字体部分为程序功能的功能扩展,使程序能够分析浮点数!我把浮点数的syn设置为80!/*词法分析源代码*/#include<stdio.h>#include<string.h>scaner();char prog[80],token[8];char ch;int syn,p,m,n,sum;char * rwtab[6]={"function","if","then","while","do","endfunc"}; int i=0,k,c,sumint,f;char fenshu[80],sum1[80];double sumf=0,fudian;int shuzi(){if(ch>='0' && ch<='9')syn=80;elsesyn=-2;return syn;}main(){p=0;printf("\n please input string :\n");do{scanf("%c",&ch);prog[++p]=ch;}while(ch!='#');p=0;do{scaner();switch(syn){ case 11:printf("\n(%d,%d)",syn,sum);break;case -1:printf("\n error");break;case 80:printf("\n(%d,%f)",syn,fudian);break; default:printf("\n(%d,%s)",syn,token);}}while(syn!=0);}scaner(){for(n=0;n<8;n++)token[n]=NULL;//if(1+2!=3)ch=prog[++p];while(ch==' ' || ch=='\n')ch=prog[++p];//跳过空格if(ch>='a' && ch<='z'){m=0;while(ch>='a' && ch<='z' || ch>='0' && ch<='9') {token[m++]=ch;//token[0]=f,m=1ch=prog[++p];}token[m]='\0';ch=prog[--p];syn=10;for(n=0;n<6;n++){if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}}elseif(ch>='0' && ch<='9'){c=p;k=0;do{ sum1[k]=ch;ch=prog[++c]; //ch取后一个数字k++;shuzi();//这个函数用来分析浮点数的整数部分是否已经输入到数组里f=syn;} while(f==80)if(ch=='.'){for(n=0;n<k;n++){sumint=sumint*10+sum1[n]-'0';} //计算整数部分i=0;do{ch=prog[++c];fenshu[i]=ch;i++;shuzi();//这个函数用来分析浮点数的小数部分是否已经输入到数组里} while(syn==80);sumf=0;for(k=i-2;k>=0;k--){sumf=sumf*0.1+(fenshu[k]-'0')*0.1;} //计算浮点数的小数部分fudian=sumint+sumf; //浮点数计算syn=80;p=--c;}else{ch=prog[p];//若是整数,ch等于原来的值 sum=0;while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=prog[++p];}ch=prog[--p];syn=11;}}elseswitch(ch){case'<':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=22;token[m++]=ch;}elseif(ch=='>'){syn=21;token[m++]=ch;}else{syn=20;ch=prog[--p];}break;case'>':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=24;token[m++]=ch;}else{syn=23;ch=prog[--p];}break;case'=':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=25;token[m++]=ch;}else{syn=18;ch=prog[--p];}break;case'!':m=0;token[m++]=ch;ch=prog[++p];if(ch=='='){syn=22;token[m++]=ch;}else{syn=-1;p--;}break;case'+':syn=13;token[0]=ch;break;case'-':syn=14;token[0]=ch;break;case'*':syn=15;token[0]=ch;break;case'/':syn=16;token[0]=ch;break;case';':syn=26;token[0]=ch;break;case'(':syn=27;token[0]=ch;break;case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break;default:syn=-1;}}七、测试用例:补充:功能扩展测试用例:八、程序输出结果:功能扩展测试用例输出结果用例一:用例二:用例三:普通功能测试用例显示结果九、实验心得通过编译原理实验一词法分析实验,使得自己对词法分析的流程有了更深刻的了解,虽然源代码并非由自己设计,但是在调试程序的过程中,尤其是进行测序功能扩展的过程中,想了很多种办法,终于找到了最合适的方法,而且还进行了代码的优化,这个过程虽然有时有些枯燥,但是更多时候是欣喜的,不仅复习了c语言的许多内容,并且有了更深的理解。

第2章 词法分析-编译原理及实践教程(第3版)-黄贤英-清华大学出版社


=> 0 >
1=
2
>
3=
4
其他
Hale Waihona Puke 其他6*5*
识别>、>=、>>、>>=四个单词的状态转换图
数值型常量的识别
0~9
1~9
=> 0
1
其他
* 2
0
十进制整型数
=> 0
0~7 0 3 其他 4 *
八进制整型数
=> 0 0
0~9
0~9 |a~f
|a~f |A~F
3 x/X 5 |A~F 6 其他 7 *
十六进制整型数
字母或数字
* 0 字母 1 其它 2
识别标识符的转换图
一个状态图可用于识别一定的字符串,大多数程序 设计语言的单词符号都可以用转换图来识别。
字母或数字
* 0 字母 1 其它 2
识别过程是:从初始状态0开始,若读入一个字母, 转入1状态,若再读入字母或数字,仍处于1状态, 否则转向2状态,结束一个标识符的识别过程。状 态上的*表示多读入一个符号。
错误处理程序
源 程 序









析单 析 语

词 记

法 单
析 器
语 法 单
中 间 代 码 生 成 器
中 间 代
代 码 优 化

中 间 代
目 标 代 码 生 成

目 标 代 码





表格管理程序
2.1 词法分析器概述
• 功能:
源程序
词法分析程序 Token串 语法分析程序
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2010-7-22 编译原理 8
第二章 词法分析
3,词法分析器输出单词的形式 ,
词法分析程序的输入是源程序字符串, 而输出是与源程序等价的单词符号序列, 词法分析器输出单词的形式 并且所输出的单词符号通常表示成如下 的二元式: 单词种别,单词自身的值) (单词种别,单词自身的值)
2010-7-22
2010-7-22
编译原理
11
第二章 词法分析
二,模式的形式化描述-正规式与正规集 模式的形式化描述-
1,字符串与语言 , 从词法分析的角度看,程序设计语言 是由记号组成的集合,每个记号又是由 若干字母按照一定规则组成的字符串.
2010-7-22
编译原理
12
第二章 词法分析
定义2.1 语言 是有限字母表 上有限长度字 语言L是有限字母表 是有限字母表∑上有限长度字 定义 符串的集合. 符串的集合. 定义2.1明确指出,语言是一个集合,集 明确指出, 定义 明确指出 语言是一个集合, 合中的元素是字符串,并且强调了两个有限: 合中的元素是字符串,并且强调了两个有限 字母表是有限的, ① 字母表是有限的,即字母表中元素是 有限多个; 有限多个; 字符串的长度是有限的, ② 字符串的长度是有限的,即字符串中 字符个数是有限多个. 字符个数是有限多个. 这是由于计算机所能表示的字符个数和 字符串的长度都是有限的. 字符串的长度都是有限的.
第二章 词Hale Waihona Puke 分析第二章词法分析
主要内容: 主要内容: 词法分析过程涉及的几个问题 模式的形式化描述模式的形式化描述-正规式与正规集 记号的识别记号的识别-有限自动机 从正规式到词法分析器 词法分析器生成器简介
2010-7-22
编译原理
1
第二章 词法分析
一,词法分析过程涉及的几个问题
词法分析是编译过程中的第一个阶段. 词法分析是编译过程中的第一个阶段. 执行词法分析的程序称为词法分析程序, 执行词法分析的程序称为词法分析程序,也称 为词法分析器或扫描器. 为词法分析器或扫描器. 任务是 任务是:从左至右逐个字符地对源程序进行扫 产生一个个单词符号, 描,产生一个个单词符号,把字符串形式的源 程序改造成为单词符号串形式的中间程序. 程序改造成为单词符号串形式的中间程序. 功能是输入源程序 输出单词符号, 是输入源程序, 功能是输入源程序,输出单词符号,并检查词 法错误. 法错误.
2010-7-22
编译原理
16
第二章 词法分析
定义2.2中①和②规定了正规式的基本操作数或基本正规 中 定义 式. 定义2.2的③给出了正规式上的三种运算 (a)或运算, 或运算, 定义 的 给出了正规式上的三种运算: 或运算 (b)连接运算和 闭包运算. 连接运算和(c)闭包运算 连接运算和 闭包运算. 对于由多个操作数和多个操作符组成的正规式, 对于由多个操作数和多个操作符组成的正规式,可以 利用(d)所给的括号规定运算的先后次序. 所给的括号规定运算的先后次序. 利用 所给的括号规定运算的先后次序 如果对或,连接和闭包运算进行如下约定: 如果对或,连接和闭包运算进行如下约定 三种运算均具有左结合性质; ① 三种运算均具有左结合性质; 运算的优先级从高到低顺序排列为: 闭包运算, ② 运算的优先级从高到低顺序排列为 闭包运算, 连接运算,或运算. 连接运算,或运算. 则正规式中不必要的括号可以被省略.例如, 则正规式中不必要的括号可以被省略.例如, (a)|((b)*(c))可以简化成 可以简化成a|b*c. 可以简化成 .
2010-7-22
编译原理
7
第二章 词法分析
注意:一个程序语言的保留字,运算符和 保留字, 保留字 界符的个数是确定的,而标识符或常数 界符 的使用则不限定个数. 将产生和识别单词的规则称为模式 模式 (patten). 按照某个模式(规则)识别出的元素称为记 记 号(token). 单词(lexeme)一词是指被识别出元素自 身的值.
2010-7-22
编译原理
13
第二章 词法分析
字符串的基本概念: 字符串的基本概念:
2010-7-22
编译原理
14
第二章 词法分析
字符串集合上的基本运算
2010-7-22
编译原理
15
第二章 词法分析
2,正规式与正规集 正规式与正规集
定义2.2 令∑是一个有限字母表,则∑上的正规式及其 是一个有限字母表, 定义 是一个有限字母表 上的正规式及其 表示的集合递归定义如下: 表示的集合递归定义如下 是正规式, ① ε是正规式,它表示集合 是正规式 它表示集合L(ε)=ε; ; 上的字符, 是正规式, ② 若a是∑上的字符,则a是正规式,它表示集合 是 上的字符 是正规式 L(a)=; ; 若正规式r和 分别表示集合 分别表示集合L(r)和L(s),则 ③ 若正规式 和s分别表示集合 和 , (a) r|s是正规式,表示集合 是正规式, 是正规式 表示集合L(r)∪L(s); ∪ ; (b) rs是正规式,表示集合 是正规式, 是正规式 表示集合L(r)L(s); ; (c) r*是正规式,表示集合 是正规式, 是正规式 表示集合(L(r))*; ; (d) (r)是正规式,表示的集合仍然是 是正规式, 是正规式 表示的集合仍然是L(r). . 可用正规式描述的语言称为正规语言或正规集. 可用正规式描述的语言称为正规语言或正规集.
2010-7-22 编译原理 2
第二章 词法分析
1,词法分析器的三种工作方式: ,词法分析器的三种工作方式:
词法分析器作为主程序; 词法分析器作为主程序; 词法分析器作为子程序; 词法分析器作为子程序; 并行工作方式
2010-7-22
编译原理
3
第二章 词法分析
图2.1 作为子程序的词法分析器
图2.2 词法分析器进行单独一遍扫描
2010-7-22
编译原理
18
第二章 词法分析
正规式的代数性质
2010-7-22
编译原理
19
第二章 词法分析
3,记号的说明 记号的说明
用自然语言对模式进行了非形式化的描述, 用自然语言对模式进行了非形式化的描述,例如标识符模式的非形 式化描述是"以字母打头的字母数字串" 这一描述很不精确, 式化描述是"以字母打头的字母数字串".这一描述很不精确,存在一 些问题,如哪些符号是字母,哪些符号是数字, 些问题,如哪些符号是字母,哪些符号是数字,字母数字串的长度可以 是多少等等. 是多少等等. 正规式是严格的数学表达式,采用正规式来描述模式,解决了精确 正规式是严格的数学表达式,采用正规式来描述模式, 描述模式的问题.另外,从词法分析器的角度上看程序设计语言, 描述模式的问题.另外,从词法分析器的角度上看程序设计语言,用正 规式说明的记号是一个正规集. 规式说明的记号是一个正规集. 用正规式说明记号的公式为: 正规式,可以读作为" 左边 左边) 用正规式说明记号的公式为:记号 = 正规式,可以读作为"(左边 记号定义为(右边 正规式 记号定义为 右边)正规式",或者"记号是正规式".通常,在不引起 右边 正规式" 或者"记号是正规式" 通常, 混淆的情况下,也把说明记号的公式简称为正规式,或者规则. 混淆的情况下,也把说明记号的公式简称为正规式,或者规则.
2010-7-22
编译原理
20
第二章 词法分析
中的记号relation,id和num分别是 分别是Pascal的关系运 例2.5 表2.1中的记号 中的记号 , 和 分别是 的关系运 算符,标识符和无符号数,它们的正规式表示如下所示: 算符,标识符和无符号数,它们的正规式表示如下所示: relation = < | <= | <> | > | >= | = id = (a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x |y|z |A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V |W|X|Y|Z) (a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x |y|z |A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V |W|X|Y|Z|0|1|2|3|4|5|6|7|8|9)*
2010-7-22
编译原理
4
第二章 词法分析
图2.3 并行工作模式
2010-7-22
编译原理
5
第二章 词法分析
2,单词符号的分类 ,
单词符号分类: 词法分析程序简单地说就是读单词程序,该程 描用高级语言编写的源程序,将源程序中由单 词符号组成的字符串分解出一个个单词来.因 此,单词符号是程序语言的基本语法单位 基本语法单位,具 基本语法单位 有确定的语法意义. 程序语言的单词符号通常可分为下面五种:
编译原理
9
第二章 词法分析
(1) 单词种别. 单词种别. 单词种别表示单词的种类,它是语法分析所需要的信息. 单词种别表示单词的种类,它是语法分析所需要的信息. 一个语言的单词符号如何划分种类,分为几类, 一个语言的单词符号如何划分种类,分为几类,如何编码都属于技术性 问题,主要取决于处理上的方便. 问题,主要取决于处理上的方便. 通常让每种单词对应一个整数码, 通常让每种单词对应一个整数码,这样可最大限度地把各个单词区别开 来. 对于保留字,可将其全体视为一种,也可一字一种, 对于保留字,可将其全体视为一种,也可一字一种,采用一字一种的分 类方法处理起来比较方便; 类方法处理起来比较方便; 标识符一般统归为一种; 标识符一般统归为一种; 常数可统归为一种,也可按整型,实型,布尔型等分为几种; 常数可统归为一种,也可按整型,实型,布尔型等分为几种; 运算符和界符可采用一符一种的分法,也可统归为一种. 运算符和界符可采用一符一种的分法,也可统归为一种.
相关文档
最新文档