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[l]: =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;
字符对应的单词表: sym[+]: =plus, sym[-]: -minus ssymL,: Semicolon 词法分析如何把单词传递给语法分析 type symbol=(nul, ident, number, plus, a, 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、I和NUM将识别出的单词信息传递给 法分析程序。 SYM:存放单词的类别 如:有程序段落为: begin initial : =60; end 对应单词翻译后变为: begin→ begins, initial→ ident, =Becomes, 60> number, ' 2> semicolon, end→ endsym。 ID:存放用户所定义的标识符的值如: initia1(在 SYM中放 ident,在I中放 initia1) 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)