编译原理——变量声明语句(三)

来源:互联网 发布:有机遇成功的数据 编辑:程序博客网 时间:2024/05/22 17:56

词法分析:

代码:

Lexical.java:

package per.eyuan.compile;import per.eyuan.util.*;public class Lexical {String statement;//输入的待分析的语句String keyWord[]={"int","float"};String word="";//保存识别出的字符Num numT[]=new Num[20];//常数表,存放Num对象实例int numT_count=0;TwoItem ti[]=new TwoItem[50];//二元式int ti_count=0;IdTable idt;public boolean isDigit(char ch){if((ch>='0')&&(ch<='9'))return true;elsereturn false;}public boolean isLetter(char ch){if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z')))return true;elsereturn false;}//标志符处理,识别关键字,普通标志符入栈public void letter(String id){int i=0;for(;i<keyWord.length;i++){if(id.equals(keyWord[i])){//关键字ti[ti_count]=new TwoItem(id,"-");ti_count++;i=keyWord.length;//跳出循环后,i的值为keyWord.length+1}}if(i==keyWord.length){//普通标志符,识别为idint j=0;for(;j<idt.getCount();j++){if(idt.getId(j).getName().equals(id)){//标识符表中已有//加入到二元式中ti[ti_count]=new TwoItem("id",j+"");ti_count++;//跳出循环j=idt.getCount();}}if(j==idt.getCount()){//标识符中没有//加入到二元式中,类别为“id”,内码值为Id的indexti[ti_count]=new TwoItem("id",idt.getCount()+"");ti_count++;//加入标识符表中,Id只填写nameidt.addId(id);}}}public void digit(String num){//常数处理,常数入栈int j=0;for(;j<numT_count;j++){if(numT[j].getName().equals(num)){//常数表中已有ti[ti_count]=new TwoItem("num",j+"");ti_count++;j=numT_count;}}if(j==numT_count){//常数表中没有numT[numT_count]=new Num(numT_count,num);ti[ti_count]=new TwoItem("num",numT_count+"");numT_count++;ti_count++;}}public void analyse(){//转换for(int i=0;i<statement.length();i++){char ch=statement.charAt(i);if(isDigit(ch)){//num,整型数据,不考虑小数点word="";word+=ch;for(int j=i+1;j<statement.length()-i;j++){if(!isDigit(statement.charAt(j))){//不是数字i=j-1;j=statement.length();}else{//是数字word+=statement.charAt(j);}}digit(word);}else if(isLetter(ch)){//id,字母开头,包含字母或者数字word="";//清空wordword=word+ch;int j=i+1;while(isLetter(statement.charAt(j))||isDigit(statement.charAt(j))){word=word+statement.charAt(j);j++;}letter(word);i=j-1;}else if(ch=='+'){ti[ti_count]=new TwoItem("+","-");ti_count++;}else if(ch=='-'){ti[ti_count]=new TwoItem("-","-");ti_count++;}else if(ch=='*'){ti[ti_count]=new TwoItem("*","-");ti_count++;}else if(ch=='/'){ti[ti_count]=new TwoItem("/","-");ti_count++;}else if(ch=='%'){ti[ti_count]=new TwoItem("%","-");ti_count++;}else if(ch=='('){ti[ti_count]=new TwoItem("(","-");ti_count++;}else if(ch==')'){ti[ti_count]=new TwoItem(")","-");ti_count++;}else if(ch==','){ti[ti_count]=new TwoItem(",","-");ti_count++;}else if(ch==';'){ti[ti_count]=new TwoItem(";","-");ti_count++;}}}//获取待分析句子public void setStatement(String statement) {this.statement = statement;}//返回二元式(有效内容)public TwoItem[] getTi() {TwoItem twoItem[]=new TwoItem[ti_count];for(int j=0;j<ti_count;j++)twoItem[j]=ti[j];return twoItem;}public IdTable getIdt() {//获取标识符表return idt;}public void setIdt(IdTable idt) {//设定标识符表this.idt = idt;}}

原创粉丝点击