PL/0编译程序词法分析的设计与实现 识别的单词: 保留字或关键字:如:BEGIN、END、IF、THEN等 运算符:如:+、-、*、/、:=、#、>=、《=等 标识符:用户定义的变量名、常数名、过程名 常数: 如:10、25、100等整数 界符: 如:‘,、‘.’、‘;'、‘(、)等
PL/0编译程序词法分析的设计与实现 识别的单词: 保留字或关键字:如:BEGIN、 END、 IF、 THEN等 运算符: 如:+、-、*、/、:=、#、>=、<=等 标识符: 用户定义的变量名、常数名、过程名 常数: 如:10、25、100等整数 界符: 如:‘ , ’ 、 ‘.’ 、 ‘;’ 、 ‘(’ 、 ‘)’等
词法分析过程GETSYM所要完成的任务: 读源程序(getch) 滤空格 识别保留字 识别标识符 拼数 识别单字符单词 拼双字符单词
词法分析过程GETSYM所要完成的任务: 读源程序(getch) 滤空格 识别保留字 识别标识符 拼数 识别单字符单词 拼双字符单词
词法分析过程:GETSYM框图(见教材图2.5) 程序(procedure getsym.) 当识别到标识符时先查保留字表 保留字表:(begin(*main*)) word[1]:=begin word[2]:='call word[13]:=write 查到时找到相应的内部表示 Wsym[1]:=beginsym;wsym[2]:=callsym; wsym[13]:=writesym;
词法分析过程:GETSYM框图(见教材图2.5) 程序( procedure getsym) 当识别到标识符时先查保留字表 保留字表:( begin (* main * ) ) word[1]:=‘begin ‘ ;word[2]:=‘call ‘ ; ... word[13]:=‘write ‘ ; 查到时找到相应的内部表示 Wsym[1]:=beginsym; wsym[2]:=callsym; … wsym[13]:=writesym;
字符对应的单词表: ssym['+]:=plus;ssym[-]:=minus; ssym[;:=semicolon; 词法分析如何把单词传递给语法分析 type symbol=(nul,ident,number,plus,...,varsym,procsym); 3个全程量 sym:symbol; id:alfa; num:integer;
字符对应的单词表: ssym[‘+’]:=plus; ssym[‘-’]:=minus; … ssym[‘;’]:=semicolon; 词法分析如何把单词传递给语法分析 type symbol=(nul,ident,number,plus,…,varsym,procsym); 3个全程量 sym:symbol; id:alfa; num:integer;
通过三个全程量SYM、ID和NUM将识别出的单词信息传递给语 法分析程序。 SYM:存放单词的类别 如:有程序段落为: begin initial =60;end 对应单词翻译后变为: begin>beginsym,initial ident, :=becomes,60number,; semicolon, end>endsym。 ID:存放用户所定义的标识符的值 如:initial(在 SYM中放ident,在ID中放initial) NUM:存放用户定义的数如:60 (在SYM中放在number:在NUM中放60)
通过三个全程量 SYM 、ID和NUM 将识别出的单词信息传递给语 法分析程序。 SYM:存放单词的类别 如:有程序段落为: begin initial := 60;end 对应单词翻译后变为: begin beginsym, initial ident, ‘:= ‘ becomes, 60 number, ‘ ; ’ semicolon, end endsym 。 ID: 存放用户所定义的标识符的值 如: initial (在 SYM中放ident,在ID中放initial) NUM:存放用户定义的数 如:60 (在SYM中放在number在NUM中放60)