file-type

西安交大:词法分析教程——基于有限自动机与正规表达式

下载需积分: 15 | 1.71MB | 更新于2024-08-21 | 16 浏览量 | 6 下载量 举报 收藏
download 立即下载
在西安交通大学Yinliang Zhao教授的指导下,该PPT聚焦于程序设计中的关键概念——词法分析。词法分析是编程语言处理的第一步,它将源代码分解为更小、有意义的单元,即词汇单元或词法元素。课程内容主要包括以下几个部分: 1. 程序结构:程序由程序首部和分程序组成。程序首部包含`program`标识符,而分程序由复合语句构成,复合语句以`begin`开始,以`end`结束。 2. 语句结构:语句包括赋值语句、复合语句和条件语句。赋值语句用`:=`表示对标识符进行赋值,条件语句则通过`if-then-else`结构根据布尔表达式的值来执行不同的代码块。 3. 表达式和项:表达式由项组成,项又可以是因式。因式包括标识符、无正负号常量(数字)以及操作符应用于表达式的结果。例如,`<项>{(+|-)<项>}`定义了加减运算,`<因式>{(*|/)<因式>}`涵盖了乘除运算。 4. 布尔表达式和关系运算符:布尔表达式是基于两个表达式的关系运算,如等于(=)、小于(<)、大于(>)、大于等于(>=)、小于等于(<=)和不等于(<>)。 5. 词法分析器设计:课程介绍了如何设计和实现词法分析器,包括确定有限自动机和非确定有限自动机的概念,以及它们与正规文法和正规式之间的关系。正规文法用于描述语言的结构,而确定有限自动机则是其机械化的形式,它们之间存在等价性。 6. 正规式与正规集:正规式是字符串模式的描述工具,表示满足特定规则的字符串集合。例如,`ba*`是一个正规式,表示所有以`b`开头,后面跟零个或多个`a`的字符串集合。 7. 正规式的基本操作:包括选择运算(|)、连接运算()、和重复运算(*)。这些运算组合成更为复杂的正规式,并规定了运算的优先级和括号使用规则。 8. 举例与正规集:通过实例展示了如何构造正规式以及它们对应的正规集。比如,`ba*`表示所有以`b`开头,后面跟任意数量`a`的字符串集合。 这个PPT深入浅出地讲解了词法分析的基础理论和应用,对于理解和编写编程语言的解析器或理解计算机科学中的语言学原理具有重要意义。

相关推荐

filetype

SAMPLE语言定义 一、字符集定义 1.<字符集> → <字母>│<数字>│<单界符> 2.<字母> → A│B│…│Z│a│b│…│z 3.<数字> → 0│1│2│…│9 4.<单界符> → +│-│*│/│=│<│>│(│)│[│]│:│. │; │, │' 二、单词集定义 5.<单词集> → <保留字>│<双界符>│<标识符>│<常数>│<单界符> 6.<保留字> → and│array│begin│bool│call│case│char│constant│dim│do│else│end│false│for│if│input│integer│not│of│or│output│procedure│program│read│real│repeat│set│stop│then│to│true│until│var│while│write 7.<双界符> → <>│<=│>=│:= │/*│*/│.. 8.<标识符> → <字母>│<标识符> <数字>│<标识符> <字母> 9.<常数> → <整数>│<布尔常数>│<字符常数> 10.<整数> → <数字>│<整数> <数字> 11.<布尔常数> → true│false 12.<字符常数> → ' 除 {'} 外的任意字符串 ' 三、数据类型定义 13.<类型> → integer│bool│char 四、表达式定义 14.<表达式> → <算术表达式>│<布尔表达式>│<字符表达式> 15.<算术表达式> → <算术表达式> + <项>│<算术表达式> - <项>│<项> 16.<项> → <项> * <因子>│<项> / <因子>│<因子> 17.<因子> → <算术量>│- <因子> 18.<算术量> → <整数>│<标识符>│( <算术表达式> ) 19.<布尔表达式> → <布尔表达式> or <布尔项>│<布尔项> 20.<布尔项> → <布尔项> and <布因子>│<布因子> 21.<布因子> → <布尔量>│not <布因子> 22.<布尔量> → <布尔常量>│<标识符>│( <布尔表达式> )│ <标识符> <关系符> <标识符>│<算术表达式> <关系符> <算术表达式> 23.<关系符> → <│<>│<=│>=│>│= 24.<字符表达式> → <字符常数>│<标识符> 五、语句定义 25.<语句> → <赋值句>│<if句>│<while句>│<repeat句>│<复合句> 26.<赋值句> → <标识符> := <算术表达式> 27.<if句>→ if <布尔表达式> then <语句>│if <布尔表达式> then <语句> else <语句> 28.<while句> → while <布尔表达式> do <语句> 29.<repeat句> → repeat <语句> until <布尔表达式> 30.<复合句> → begin <语句表> end 31.<语句表> → <语句> ;<语句表>│<语句> 六、程序定义 32.<程序> → program <标识符> ;<变量说明> <复合语句> . 33.<变量说明> → var <变量定义>│ε 34.<变量定义> → <标识符表> :<类型> ;<变量定义>│<标识符表> :<类型> ; 35.<标识符表> → <标识符> ,<标识符表>│<标识符> 七、SIMPLE语言单词编码 单 词 种别码 单 词 种别码 单 词 种别码 and 1 output 21 * 41 array 2 procedure 22 */ 42 begin 3 program 23 + 43 bool 4 read 24 , 44 call 5 real 25 - 45 case 6 repeat 26 . 46 char 7 set 27 .. 47 constant 8 stop 28 / 48 dim 9 then 29 /* 49 do 10 to 30 : 50 else 11 true 31 := 51 end 12 until 32 ; 52 false 13 var 33 < 53 for 14 while 34 <= 54 if 15 write 35 <> 55 input 16 标识符 36 = 56 integer 17 整数 37 > 57 not 18 字符常数 38 >= 58 of 19 ( 39 [ 59 or 20 ) 40 ] 60

filetype

以C语言小子集定义表(见表1)为例实现词法分析; 表1 C语言小子集定义表 image.png 2. 设计单词属性字,及各类表格(表示符表、常量表、单词符号及机内表示); 3. 画出总控流程图,确定各个子程序的功能并画出控制流程图; 4. 编码实现词法分析程序 采用标准输入和输出的方式。程序从键盘接收代码,遇到代码结束符“#”时结束,并将词法分析的结果输出到屏幕上。 要求实现: (1)对正确源程序的识别; (2)对包含有注释//和/* */的源程序的识别; (3)对包含错误标识符的源程序的识别。(注意,行号的计算不包含空行,详见样例3) 5. 设计3-5个测试实例,要求覆盖上述功能,并完成测试 【输入形式】c语言小子集的程序片段 【输出形式】单词序列 【样例输入1】 int i = 3; int j = 10; int m = max(i, j); while(i<=m) do { i = i+ 1; } void max(int x, int y) { int temp = 0; if(x > y) temp = x; else temp = y; return temp; } # 【样例输出1】 <4,->,<1,i>,<27,->,<2,3>,<34,->, <4,->,<1,j>,<27,->,<2,10>,<34,->, <4,->,<1,m>,<27,->,<1,max>,<28,->,<1,i>,<35,->,<1,j>,<29,->,<34,->, <9,->,<28,->,<1,i>,<20,->,<1,m>,<29,->,<10,->, <32,->, <1,i>,<27,->,<1,i>,<14,->,<2,1>,<34,->, <33,->, <3,->,<1,max>,<28,->,<4,->,<1,x>,<35,->,<4,->,<1,y>,<29,->, <32,->, <4,->,<1,temp>,<27,->,<2,0>,<34,->, <7,->,<28,->,<1,x>,<21,->,<1,y>,<29,->, <1,temp>,<27,->,<1,x>,<34,->, <8,->, <1,temp>,<27,->,<1,y>,<34,->, <12,->,<1,temp>,<34,->, <33,->,

filetype

PL/0的词法分析程序GETSYM是一个独立的过程,其功能是为语法语义分析提供单词,把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析。其主要任务为:1、滤空格;2、识别基本字;3、识别标识符;4、拼数;5、拼复合词;6、输出源程序。 PL/0编译程序一般设置3个全程变量: SYM:存放每个单词的类别,用内部编码形式表示; ID: 存放用户所定义的标识别符的值; NUM:存放用户定义的数。 PL/0语言的单词的种类分成保留字(亦称基本字)、运算符、标识符、常数、界符5个大类,以下是针对这5类单词的一种EBNF描叙: <无符号整数>::=<数字>{<数字>} <标识符> ::=<字母>{<字母>|<数字>} <字母> ::=a|b|……|X|Y|Z <数字> ::=0|1|2|……|8|9 <保留字> ::= const | var | procedure | begin | end | odd | if | then | call | while | do | read |write <运算符> ::= + | - | * | / | = | # | < | <= | > | >= | := <界符> ::= ( | ) | , | ; | . 保留字、运算符和界符这几类在实践中一般将每个单词符号设计为独立的词法单元,即每个单词符号拥有独立的类别。这样PL/0编译程序所设计的单词符号就对应到31个单词种别,这31个单词种别采用枚举类型表示。(分类请参考课本53-54页) 例:PL/0程序片段: const a=10; var b,c; procedure p; begin c:=b+a end; begin //中间片段略 studentid:201812345 name:Jenny end. name:Mike ************************************************************** 词法分析器运行结果: 1 基本字 const 2 标识符 a 3 运算符 = 4 数字 10 5 界符 ; 6 基本

filetype
xxxibb
  • 粉丝: 26
上传资源 快速赚钱