首页 > 编程知识 正文

词法分析实验过程,词袋法的图像检索实验报告

时间:2023-05-05 13:31:49 阅读:156380 作者:4927

实验一、词法分析实验

商务软件工程专业美丽香水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#

符合个字符的单词码

四、实验总结

学会编写一个简单的词法分析程序,学会了利用词法分析程序分析源代码,逐个单词进行分析拆分,把标识符,保留字区分,并且能识别出空格,并把数据能从文件中读出来,对代码的理解更加的深刻。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。