在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。
识别关键字:main if int for while do return break continue,该类的单词码为1.
识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
运算符:+、-、*、/、=、>、<、>=、<=、!=
分隔符:,、;、{、}、(、)
常数,如123,4587
各种单词符号对应的种别码。
输出形式:
– (单词种别,单词自身的值)
单词种别,表明单词的种类,语法分析需要的重要信息
– 整数码
关键字、运算符、界符:一符一码
标识符:10, 常数:11
单词自身的值
– 标识符token、常数sum
– 关键字、运算符、界符token
三、
实验方法、步骤及结果测试
1.
源程序名:编译原理
实验报告
中源程序名
算法分析
.c
可执行程序名:编译原理
实验报告
.exe
2.
原理分析及流程图
//录入用户输入
Scanner input = new Scanner(System.in);
System.out.print("Please input a string <end with '#'>:");
String uString = input.nextLine();
char[] analyseData = new char[MAX_LEN];
int index = 0, key = 0;
List list = new List();
String compareStr = null;
char temp = uString.charAt(index);
list = extactCharacters(temp, analyseData, key_word, uString, index, compareStr);
if (list.getItemCount() == 0) {
index++;
continue;
// 规定List的第一个元素为index,第二个元素为key
index = Integer.parseInt(list.getItem(0));
key = Integer.parseInt(list.getItem(1));
String words = list.getItem(2);
System.out.println("< " + key + " ," + words + " >");
} while (key != 0);
public static List extactCharacters(char temp, char[] analyseDate, String[] keywords, String uString, int index,
String compareStr) {
int keyID = -1, m = 0;
List list = new List();
//判断下一个读入的字符是否为空格,若读取到空格则跳过,提取下一个字符进行判断
while (temp != ' ') {
//判断当前字符是字母或者数字和字母的组合
if (temp >= 'a' && temp <= 'z') {
m = 0;
// 当读取到不是大小写字母或者数字时候判断为一个单词读取完成
while (temp >= 'a' && temp <= 'z' || temp >= 'A' && temp <= 'Z' || temp >= '0' && temp <= '9') {
analyseDate[m++] = temp;
compareStr += temp + "";
temp = uString.charAt(++index);
// 与读取出来的字符判断是否为关键字
compareStr = compareStr.substring(4);
for (int i = 0; i < 6; i++) {
if (compareStr.equals(keywords[i])) {
keyID = i + 1;
list.add(index + "");
list.add(keyID + "");
list.add(compareStr);
return list;
//若为非关键字就当作为标识符
keyID = 10;
list.add(index + "");
list.add(keyID + "");
list.add(compareStr);
return list;
//判断当前字符是否为数字
else if (temp >= '0' && temp <= '9') {
m = 0;
String tempTokens = null;
// 对后面的字符进行判断是否为数字
while (temp >= '0' && temp <= '9') {
analyseDate[m++] = temp;
tempTokens += temp;
temp = uString.charAt(++index);
// 不是数字则返回种别码,结束当前方法
keyID = 11;
tempTokens = tempTokens.substring(4);
list.add(index + "");
list.add(keyID + "");
list.add(tempTokens + "");
return list;
m = 0;
//判断当前字符是否为其他关系运算符
String token = null;
switch (temp) {
case '<':
// String token = null;
analyseDate[m++] = temp;
token += temp;
if (uString.charAt(++index) == '=') {
analyseDate[m++] = temp;
keyID = 22;
token += uString.charAt(index++);
} else if (uString.charAt(++index) == '>') {
analyseDate[m++] = temp;
keyID = 21;
token += uString.charAt(index++);
} else {
keyID = 23;
list.add(index + "");
list.add(keyID + "");
token = token.substring(4);
list.add(token);
return list;
case '>':
analyseDate[m++] = temp;
token += temp;
if (uString.charAt(++index) == '=') {
keyID = 24;
analyseDate[m++] = temp;
token += uString.charAt(index++);
} else {
keyID = 20;
list.add(index + "");
list.add(keyID + "");
token = token.substring(4);
list.add(token);
return list;
case ':':
analyseDate[m++] = temp;
token += temp;
if (uString.charAt(++index) == '=') {
keyID = 18;
// analyseDate[m++] = temp;
analyseDate[m++] = uString.charAt(index);
token += uString.charAt(index++);
} else {
keyID = 17;
list.add(index + "");
list.add(keyID + "");
token = token.substring(4);
list.add(token);
return list;
case '*':
keyID = 13;
break;
case '/':
keyID = 14;
break;
case '+':
keyID = 15;
break;
case '-':
keyID = 16;
break;
case '=':
keyID = 25;
break;
case ';':
keyID = 26;
break;
case '(':
keyID = 27;
break;
case ')':
keyID = 28;
break;
case '#':
keyID = 0;
break;
default:
keyID = -1;
break;
analyseDate[m++] = temp;
list.add(++index + "");
list.add(keyID + "");
list.add(temp + "");
return list;
return list;
4.
运行结果及分析
输入源代码:begin x:=0; end#
符合个字符的单词码
四、
实验总结
学会编写一个简单的词法分析程序,学会了利用词法分析程序分析源代码,逐个单词进行分析拆分,把标识符,保留字区分,并且能识别出空格,并把数据能从文件中读出来,对代码的理解更加的深刻。