1、实验一 词法分析程序的设计与实现一、实验内容【实验目的和要求】设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解。【实验内容】通过对 PL/0 词法分析程序(GETSYM)的分析,并在此基础上按照附录 A 中给出的PL/0 语言的语法描述,编写一个 PL/0 语言的词法分析程序。此程序应具有如下功能:输入为字符串(待进行词法分析的源程序) ,输出为单词串,即由(单词、类别)所组成的二元组序列。有一定检查错误的能力,例如发现 2A 这类不能作为单词的字符串。【实验环境】Windows PC 机,任何语言。【提交内容】提交实验报告,报告内容如下:目的要求、算法描述、程序结构、主要变量
2、名说明、程序清单、调试情况、设计技巧、心得体会。提交源程序和可执行文件。【学时】4 课时。二、实验说明词法分析程序的任务就是扫描源程序,依据词法规则识别单词并报告构词错误信息。通常将单词分为 5 种类型。1)基本字:也叫关键字、保留字,是程序设计语言用来表示特定语法含义的一种标识符,如 if、begin 等。2)运算符:如+、-、*、/、:=、“ ;/ 关系符 2static public String relation2 = “=“, “ ;static public boolean isOver = false;/处理一个字母开头的词static private char alphapro
3、cess(char buffer) throws Exception int i = -1;StringBuffer sb = new StringBuffer();char temp = buffer;while (Character.isLetter(temp) | Character.isDigit(temp) sb.append(temp);if(temp = (char) reader.read() = -1) isOver = true;if(!search(sb.toString(), 1)search(sb.toString(),2);return temp;/处理数字开头的词
4、static private char digitprocess(char buffer) throws Exception StringBuffer sb = new StringBuffer();char temp = buffer;while(Character.isDigit(temp)sb.append(temp);if(temp = (char) reader.read() = -1) isOver = true;search(sb.toString(), 3);/处理一个数字return temp;/其他字符static private char otherprocess(cha
5、r buffer) throws Exception StringBuffer sb = new StringBuffer();char temp = buffer;sb.append(temp);if(temp = (char) reader.read() = -1) isOver = true;if(search(sb.toString(), 4)return temp;/界符else if(search(sb.toString(), 5)return temp;/运算符else if(search(sb.toString(), 6)return temp;/关系符 1sb.append(
6、temp);if(search(sb.toString(), 7)if(temp = (char) reader.read() = -1) isOver = true;return temp;static private boolean search(String buffer, int wordtype) int i = 0;switch (wordtype) case 1:/确定是否为保留字for(int j=0;jkeyWords.length;j+)if(keyWordsj.equals(buffer)System.out.println(buffer+“保留字“+j);return
7、true;return false;case 2:/标示符,直接打印System.out.println(buffer+“标示符,长度“+buffer.length();return true;case 3:/数字System.out.println(buffer+“数字“+buffer.length();return true;case 4:/是否界符for(int j=0;jborders.length;j+)if(bordersj.equals(buffer)System.out.println(buffer+“界符“+j);return true;return false;case 5
8、:/是否运算符for(int j=0;jarithmetic.length;j+)if(arithmeticj.equals(buffer)System.out.println(buffer+“运算符“+j);return true;return false;case 6:/关系符号 1for(int j=0;jrelation1.length;j+)if(relation1j.equals(buffer)System.out.println(buffer+“关系符“+j);return true;return false;case 7:/关系符号 1for(int j=0;jrelation
9、2.length;j+)if(relation2j.equals(buffer)System.out.println(buffer+“关系符“+j);return true;return false;default:System.out.println(buffer+“未知“);return false;/* param args* throws Exception */public static void main(String args) throws Exception reader = new InputStreamReader(new FileInputStream(“d:/source.c“);char cbuffer;cbuffer = (char) reader.read();while(!isOver)if (Character.isLetter(cbuffer) cbuffer=alphaprocess(cbuffer); else if (Character.isDigit(cbuffer) cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess(cbuffer);