实验一、词法分析实验
商务软件工程专业美丽香水201506110093
一.实验目的
通过设计词法分析程序,分析词法,加强词法理解,掌握编程语言的分解和理解。
二、实验内容和要求
在原始程序中输入源代码
字符串表示的源程序
从左到右进行扫描和分解
根据字句规则
识别每个具有独立意义的单词符号
用于语法分析
如果发现词法错误,则返回错误消息
源程序中自动识别单词,将单词分为5种,并输出对应的单词类代码。
识别关键字: mainifintforwhiledoreturnbreakcontinue。 这个班的单词代码是1。
标识符:表示各种名称,如变量名称、数组名称、函数名称等,如char ch、int syn、token、sum等,该类的单词代码为2。
运算符:-,*,/,=,=,=
分隔符:)
常数,例如123,4587
与各单词符号对应的类别代码。
输出格式:
二元公式
单词类型,单词本身的值)
表示单词种类、单词种类、语法分析所需的重要信息
数字
关键字、运算符、界符:一码一码
识别符: 10,常数: 11
单词本身的值
标识符token,常量sum
关键字、运算符和边界token
三.实验方法、程序及结果测试
1 .源程序名称:编译原理实验报告中源程序名称算法分析. c
可执行程序名称:编译原理实验报告. exe
2 .原理分析和流程图
3 .主要分段及其说明:
importjava.awt.*;
importjava.util.Scanner;
//*
* Created by s2002 on 2016/9/30。
*/
公共类com {
publicstaticvoidmain (string [ ] args ) {
//限制字符串的最大值
finalintMAX_LEN=100;
//关键词
string [ ] key _ word=new string [ ] { ' begin ',' end ',' if ',' then ',' while ',' do'};
//输入用户输入
scanner input=new scanner (system.in );
system.out.print (pleaseinputastring : );
String uString=input.nextLine (;
char [ ] analysedata=new char [ max _ len ];
intindex=0,key=0;
List list=newList (;
do{
String compareStr=null;
chartemp=ustring.charat(index );
list=extactcharacters(temp,analyseData,key_word,uString,index,compareStr );
if(list.getitemcount ()==0) )
索引;
连续;
}
将List的第一个要素设为index,第二个要素设为key
index=integer.parseint (list.getitem (0) );
ky=integer.parseint (list.getitem (1);
stringwords=list.getitem(2;
system.out.println(''key ',' words ' );
}while(key!=0;
}
publicstaticlistextactcharacters (chartemp,char[] analyseDate,String[] keywords,String uString,intindex,
String compareStr ) {
intkeyID=-1,m=0;
List list=newList (;
//判断下一个
读入的字符是否为空格,若读取到空格则跳过,提取下一个字符进行判断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
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#
符合个字符的单词码
四、实验总结
学会编写一个简单的词法分析程序,学会了利用词法分析程序分析源代码,逐个单词进行分析拆分,把标识符,保留字区分,并且能识别出空格,并把数据能从文件中读出来,对代码的理解更加的深刻。