1、第四章 符号表&词法分析,一、符号表及其作用 二、符号表的内容 三、存储分配&符号表的组织 四、标识符的处理 五、符号表的结构和存取 六、词法分析 七、取单词 八、读标识符 九、词法分析器的自动生成 十、一个实例,一、符号表及其作用,1.编译程序逻辑图,表 格 管 理,错误处理,源程序,词法分析,语法分析,中间代码生成,中间代码优化,目标代码生成,目标程序,一、符号表及其作用(续一),符 号 表,(单词属性表),名 字 属 性,一、符号表及其作用(续二),符 号 表,静 态 表:保留字表,标准函数表等,动 态 表:标识符表,过程信息表等,符号表 查填,隐式说明语言的符号表查填 : FORTRA
2、N语言,显式说明语言的符号表查填:pascal,c等,符号表的作用:辅助语义正确性检查、辅助目标代码的生成,二、符号表的内容,单词的基本属性(Pascal语言为例),1、保留字的属性,2、特殊符号的属性,3、常量的属性,eg. begin, end, procedure, to, for, with,属性,eg. +, *,/,等,属性,属性: 名字、值、类型,eg. 100,false,0.5等,二、符号表的内容(续一),4标识 符的属性,标准类型标识符:integer,char,real,常量标识符,简单变量标识符,过程/函数标识符,数组标识符,名字、值、类型,名字、类型、地址,var i
3、,j,k:integer;,var a:array110of integer;,名字、类型、维数、上下界、下标类型、数据区首地址等,Procedure search(a:char);,名字、形参、局部变量、过程/函数入口地址等,eg. const pi=3.1415926,二、符号表的内容(续二),一个单词一个属性值: 1)常量的属性值为常量本身或者存放常量的单元地址,也即指向存放常量有关信息的常量表的入口指针。 2)标识符的属性值为标识符本身或者标识符表的地址,也即存放标识符有关信息的符号表的入口指针,二、符号表的内容(续三),符号表的内容,符号的名字,符号的类型,地址码,数组的维数、下标,
4、过程/函数参数,.,三、存储分配&符号表的组织,存储分配原则:(参见例P81) 1、标号、类型标识符和过程标识符不分配单元。(1)标号对应机器语言是一个地址,不需要分配单元。(2)类型标识符定义了某种类型,不需要分配单元。(3)过程标识符没有值,也不需要分配单元。 2、常量、简单变量、数组、形参和函数等需要分配单元。,三、存储分配&符号表的组织(续一),静态分配:编译时能够确定所需存储空间的大小,并进行存储分配。 1、同一分程序的不同分量分配在不同单元。 2、内外层中的不同量分配在不同的单元。 形参的分配。 eg. Procedure sum1(var sum:integer,I:intege
5、r); beginsum:=sum+I; end;,形参的分配。 eg. Procedure sum1(var sum:integer,I:integer); beginsum:=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 d
6、o sum:=sum+I; end.,四、标识符的处理,标识符的出现,定义性出现,应用性出现,填表,查表,五、符号表的结构和存取,符号表结构:无序符号表有序符号表 树结构符号表栈符号表hash表,六、词法分析,任务: 词法分析阶段:扫描源程序的ASCII码序列,拼出每一个单词,并把每个单词的ASCII码序列替换为所谓的机内表示TOKEN形式(属性字),这时还检查词法错误。,扫描源程序,识别单词,转换成属性字,六、词法分析(续一),词法分析的两种处理结构,1、单词的种类 单词由字符组成。 :=| :=a|b|c|z|A| B|C|.|Z :=0|1|2|3|.|9 :=+|-|*|/|:=|:=
7、| symbol=(ident,constsy,notop,mul,div,add,sub.) 单词的机内表示采用长度统一的二元形式(token字) (单词种别码,单词的自身值),七、取单词,流程图,七、取单词,跳过空格符和回车符,字母,特殊符号,数字,读标识符,查保留字表,保留字sy,取 数,特殊符号sy,identsy,结束,开始,error,N,Y,查到,N,Y,constsysy,N,Y,N,Y,八、读标识符,1、标识符的文法规则 :=| :=a|b|c|z|A| B|C|.|Z :=0|1|2|3|.|9,2、标识符的状态转换图,3、读标识符子程序(略),九、词法分析器的自动生成,词法分析程序的自动生成问题 Lex语言,十、一个实例,1、查填符号表(见书),2、流程图,十、一个实例,流程图,字母,,,数字,Tempword:=Symbol+ch,error,N,Y,在已有的标识符 中查找tempword,编码、填入 tempword,查到,N,Y,N,Y,N,Y,读一个字符ch,。,首字符,|Tempword|=8,error,Y,Y,N,N,Tempword=,;,N,Y,注:tempword是临时的字符串,