Java实现词法分析:
一、 实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、 实验内容
(1)关键字:所有的关键字都是小写
(2)运算符和界符::= + - * / < <= <> > >= = ; ( ) #
(3)其他单词是标识符和整型常数
(4)词法分析的内容:int num,str;
三、代码实现
- public static TableResult<data> TResult=new TableResult();
- public static List<data> tok=new ArrayList<>();
- public static boolean ifier=false;
- char w[]=new char[1000];//保存有效字符
- String rwtab[]={" ","main","if","then","while","do","static","int","double","struct",
- "break","else","long","switch","case","typedef","char","return","const",
- "float","short","continue","for","void","sizeof","end","true"};
- String fileAddress;
- char rd[]=new char[1000];
- FileReader fr=null;
- int n,m=0,t;
- analyzeWord(String fileAddress)
- {
- this.fileAddress=fileAddress;
- // this.t=t;
- }
-
- public void clear()
- {
- int i,j=0;
- for(i=0;i<t;i++)
- {
- if(rd[i]==' ')//去掉多余空格
- {
- if (w[j-1]!=' ') {
- w[j++]=' ';
- }
- while(rd[++i]==' ')
- {
- }
- i--;
- }
- else if(rd[i]=='\t') //去掉制表符
- {
- if (w[j-1]!=' ') {
- w[j++]=' ';
- }
- while(rd[++i]=='\t')
- {
- }
- i--;
- }
- else if(rd[i]=='\n') //去掉换行
- {
- if (w[j-1]!=' ') {
- w[j++]=' ';
- }
- while(rd[++i]=='\n')
- {
- }
- i--;
- }
- else if(rd[i]=='/' && rd[i+1]=='/') //去掉注释
- {
- while (rd[++i]!='\n')
- {
- }
- i--;
- }
- else if(rd[i]=='\r') //去掉回车
- {
- if (w[j-1]!=' ') {
- w[j++]=' ';
- }
- // while (r[++i]!='\n')
- // {
- // }
- // i--;
- }
- else{
- w[j++]=rd[i]; //其他字符
- }
- }
- }
- public void readChar()
- {
- try {
- fr=new FileReader(fileAddress);
- int n;
- while ((n=fr.read(rd))!=-1)
- {
-
- //将文本数据读入字符数组
- t=n;
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- fr.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- public void analyze()
- {
- tok.clear();
- int i,j=0;
- String syn="";
- int c=0;
- char token[];
- char r[];
- String rds=new String(w).trim();
- r=rds.toCharArray();
- System.out.println(r);
- for(i=0;i<r.length;i++)
- {
-
- token = new char[100];
- if((r[i]>='A'&& r[i]<='Z') || (r[i]<='z' && r[i]>='a'))
- {
- while ((r[i]>='A'&& r[i]<='Z') || (r[i]<='z' && r[i]>='a') ||(r[i]>='0'&&r[i]<='9')||r[i]==',')
- {
-
- token[j++]=r[i];
- i++;
- if(i>=r.length) {
- break;
- }
-
-
- }
- i--;
- syn="未定义"; //先将syn赋值
- String temp=new String(token).trim();
- if(temp.length()==1) {
- if((r[i]>='A'&& r[i]<='Z') || (r[i]<='z' && r[i]>='a'))
- {
- syn="字母";
- }
- }
- if(ifier) {
- ifier=false;
- syn="标识符";
- }
- for(j=1;j<rwtab.length;j++)
- {
- if(temp.equals(rwtab[j]))
- {
- syn="关键词"; //如果存在关键字则重新赋值
- ifier=true;
- break;
- }
- }
-
-
- }//识别字母开头的字母数字串
- else if(r[i]>='0'&&r[i]<='9')
- {
- System.out.println(ifier);
- if(ifier) {
- ifier=false;
- token[j++]=r[i];
- syn="未能识别标识符";
-
- }else {
- while ((r[i]>='0'&&r[i]<='9') )
- {
- token[j++]=r[i];
- i++;
- }
- syn="数字";
- i--;
- }
- }//识别数字NUM
- else if(r[i]==' ')
- {
- continue; //识别空格并直接进入下一次循环
- }
- else if(r[i]=='*'&&r[i+1]=='*') //识别**
- {
- token[j++]='*';
- token[j]='*';
- syn="运算符**";
- i++;
- }
- else if(r[i]=='='&&r[i+1]=='=') //识别==
- {
- token[j++]='=';
- token[j]='=';
- syn="运算符==";
- i++;
- }
- else if(r[i]=='<'&&r[i+1]=='>') //识别<>
- {
- token[j++]='<';
- token[j]='>';
- syn="运算符<>";
- i++;
- }
- else if(r[i]=='<'&&r[i+1]=='=') //识别<=
- {
- token[j++]='<';
- token[j]='=';
- i++; syn="运算符<=";
- }
- else if(r[i]=='='&&r[i+1]=='>') //识别>=
- {
- token[j++]='>';
- token[j]='=';
- syn=">=";
- i++;
- }
- else { //其他符号
- token[j]=r[i];
- switch (token[j])
- {
- case '+':
- syn="运算符+";
- break;
- case '-':
- syn="运算符-";
- break;
- case '*':
- syn="运算符*";
- break;
- case '/':
- syn="运算符/";
- break;
- case '<':
- syn="运算符<";
- break;
- case '>':
- syn="运算符>";
- break;
- case '=':
- syn="运算符=";
- break;
- case '[':
- syn="操作符[";
- break;
- case ']':
- syn="操作符]";
- break;
- case ';':
- syn="分隔符;";
- break;
- case '(':
- syn="分隔符(";
- break;
- case ')':
- syn="分隔符)";
- break;
- case '#':
- syn="分隔符#";
- break;
- case '}':
- syn="分隔符}";
- break;
- case '{':
- syn="分隔符{";
- break;
- default:
- syn="未定义";
- break;
- }
- }
- j=0;
- c++;
- data s = new data();
- String tokens = new String(token);
- s.setPosition(i+1+"");
- if ("未定义".equals(syn))
- {
- s.setTypes("无法识别该字符!");
- }
- else {
- s.setTypes(syn);
-
- }
- if(tokens.indexOf(",")>=0) {
- tokens=tokens.replace(","," ");
- // s.setTypes("关键词");
- }
-
- s.setCode(tokens);
- tok.add(s);
- if("未能识别标识符".equals(syn)) {
- break;
- }
- }
-
- //System.out.println("词法分析完毕!");
- }
四、实验结果:
如需要源码的我也上传在资源中啦:词法分析源码
总结
感谢各位博友的阅读 ,欢迎您们提出意见 让我们一起交流。感谢你们对CYBLOG的支持理解,本次讲解到此结束!