编译原理 符号表和词法分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
七、取单词 流程图
开始 跳过空格符和回车符 字母 Y 读标识符 查保留字表 查到 Y 保留字⇒ 保留字⇒sy N N 数字 Y N 特殊符号 Y N error
取 数
ident⇒sy ⇒
constsy⇒sy ⇒
特殊符号⇒ 特殊符号⇒sy
结束
八、读标识符
1、标识符的文法规则 、 <标识符 标识符>::=<字母 字母>{<字母 <数字 } 字母>| 数字 数字> 标识符 字母 字母 <字母 字母>::=a|b|c|..z|A| B|C|...|Z 字母 <数字 数字>::=0|1|2|3|...|9 数字 2、标识符的状态转换图 、
字母
⇒ S0
字母
S1
数字
非字母数字
S2
3、读标识符子程序(略) 、读标识符子程序( 子程序
九、词法分析器的自动生成
词法分析程序的自动生成问题 Lex语言 语言
十、一个实例
1、查填符号表(见书) 、 见书)
2、流程图 、
十、一个实例 流程图
。。。 读一个字符ch 读一个字符 N N N , Y 在已有的标识符 中查找tempword 中查找 查到 Y Tempword:=Symbol+ch error Tempword=‘’ N 编码、 编码、填入 tempword ; error N Y 字母 Y 数字 Y N 首字符 Y Y
标 识 符 的 出 现
五、符号表的结构和存取
符号表结构: 符号表结构: 无序符号表 有序符号表 树结构符号表 栈符号表 hash表 表
六、词法分析
任务: 任务: 词法分析阶段: 词法分析阶段
扫描源程序的ASCII码序列,拼出每一个单词,并把每个 单词的ASCII码序列替换为所谓的机内表示TOKEN形 式(属性字),这时还检查词法错误。 属性字) 这时还检查词法错误。
扫描源程序 识别单词 转换成属性字
续一) 六、词法分析(续一) 词法分析的两种处理结构 源程序 字符 词法分析 符号表 源程序 字符 单词 词法分析 回送单词 语法分析 单词 L1程序
符号表
七、取单词
1、单词的种类
单词由字符组成。 单词由字符组成。 <字符 字符>::=<字母 数字 特定符号 无效字符 字母>|<数字 特定符号>|<无效字符 字符 字母 数字>|<特定符号 无效字符> <字母 字母>::=a|b|c|..z|A| B|C|...|Z 字母 <数字 数字>::=0|1|2|3|...|9 数字 <特定符号 特定符号>::=+|-|*|/|:=|<>|<|…. 特定符号 <无效字符 无效字符>::=<回车符 换行符 制表符 回车符>|<换行符 制表符> 无效字符 回车符 换行符>|<制表符 symbol=(ident,constsy,notop,mul,div,add,sub….) 单词的机内表示采用长度统一的二元形式(token字) 单词的机内表示采用长度统一的二元形式 字 (单词种别码 单词的自身值 单词种别码,单词的自身值 单词种别码 单词的自身值)
数组标识符 名字、类型、维数、上下界、 名字、类型、维数、上下界、 下标类型、 下标类型、数据区首地址等
Procedure search(a:char);
过程/函数标识符 过程 函数标识符 名字、形参、局部变量、过程 名字、形参、局部变量、过程/ 函数入口地址等
续二) 二、符号表的内容(续二)
一个单词一个属性值: 一个单词一个属性值: 1)常量的属性值为常量本身或者存放 ) 常量的单元地址, 常量的单元地址,也即指向存放常量有 关信息的常量表的入口指针。 关信息的常量表的入口指针。 2)标识符的属性值为标识符本身或者 ) 标识符表的地址, 标识符表的地址,也即存放标识符有关 信息的符号表的入口指针
二、符号表的内容
•单词的基本属性(Pascal语言为例) 单词的基本属性( 语言为例) 单词的基本属性 语言为例 eg. begin, end, procedure, to, for, with 1、保留字的属性 、 属性 2、特殊符号的属性 、 eg. +, *,/,<,<>,等 属性 3、常量的属性 eg. 100,false,0.5等 、 属性: 名字、值、类型
续一) 二、符号表的内容(续一)
标准类型标识符: 标准类型标识符:integer,char,real
eg. const pi=3.1415926 4 标 识 符 的 属 性
常量标识符 名字、 名字、值、类型
简单变量标识符
var i,j,k:integer;
名字、类型、 名字、类型、地址
var a:array[1..10]of integer;
续三) 二、符号表的内容(续三)
符号的名字 符号的类型 符号表的内容 地址码 数组的维数、 数组的维数、下标 过程/函数参数 过程 函数参数 …...
三、存储分配&符号表的组织 存储分配 符号表的组织
存储分配原则: 参见例P81) 存储分配原则 (参见例 ) 1、标号、类型标识符和过程标识符不分配单元。 (1)标号对应机器语言是一个地址,不需要 分配单元。 (2)类型标识符定义了某种类型,不需要分 配单元。 (3)过程标识符没有值,也不需要分配单元。 2、常量、简单变量、数组、形参和函数等需要 分配单元。
第四章 符号表&词法分析 符号表 词法分析
一、符号表及其作用 二、符号表的内容 存储分配&符号表的组织 三、存储分配 符号表的组织 四、标识符的处理 五、符号表的结构和存取 六、词法分析 七、取单词 八、读标识符 九、词法分析器的自动生成 十、一个实例
一、符号表及其作用
1.编译程序逻辑图 编译程序逻辑图
表 格 管 理
源 程 序
词 法 分 析
语 法 分 析
中 间 代 码 生 成
处
中 间 代 码 优 化
目 标 代 码 生 成
理
目 标 程 序
错
误
续一) 一、符号表及其作用(续一)
常量表 变量表(标识符表) 变量表(标识符表) 符 号 表 (单词属性表) 保留字表 特殊符号表 数组信息表 过程信息表 …… 名 字 属 性
|Tempword|>=8 N
注:tempword是临时的字符串
三、存储分配&符号表的组织(续二) 存储分配 符号表的组织 续二)
形参的分配。
eg. Procedure sum1(var sum:integer,I:integer); begin sum:=sum+I; end;
原则: 原则:
1、如果形参是按值调用,则分配一个单元存放实参的值 、如果形参是按值调用, 2、如果形参是按名调用,则分配一个单元存放实参的地址。 、如果形参是按名调用,则分配一个单元存放实参的地址。
四、标识符的பைடு நூலகம்理
Program summ(input,output) var I,sum:integer; procedure xxx( I:integer) begin … end; begin sum:=0; for I:=1 to 100 do sum:=sum+I; end.
四、标识符的处理
三、存储分配&符号表的组织(续一) 存储分配 符号表的组织 续一)
静态分配:编译时能够确定所需存储空间的大小, 静态分配:编译时能够确定所需存储空间的大小,并进行
存储分配。 存储分配。
1、同一分程序的不同分量分配在不同单元。 2、内外层中的不同量分配在不同的单元。 形参的分配。 eg. Procedure sum1(var sum:integer,I:integer); begin sum:=sum+I; end;
续二) 一、符号表及其作用(续二)
静 符 号 表 动 态 表:标识符表,过程信息表等 态 表:保留字表,标准函数表等
符号表 查填
隐式说明语言的符号表查填 :
FORTRAN语言 语言
显式说明语言的符号表查填: 显式说明语言的符号表查填:pascal,c等 , 等 符号表的作用:辅助语义正确性检查、 符号表的作用:辅助语义正确性检查、辅助目标代码的生成