資源簡介
哈工大 編譯原理 詞法分析 語法分析 語義分析

代碼片段和文件信息
/*
詞法分析程序的功能?
輸入是源程序字符串以‘#’?結(jié)束。
輸出是單詞符號的二元組(?單詞種別碼?單詞自身字符串?)?即(?syn單詞的種別?token單詞自身字符串或sum整型常數(shù)單詞)
例如
輸入:??x:=9;??if??x>0??then??x:=2*x+1/3?fi?#(可以文件方式讀入)
輸出:?(可以寫入文件)
(29???????????x?)??????????????????
(18??????????:=?)??????????????????
(30???????????9?)??????????????????
(26???????????;?)??????????????????
(2????????????if?)??????????????????
(29???????????x?)????
?*/
//package?詞法分析;
import?java.io.*;?
import?java.util.*;?
class?CiFaDisegn{
//聲明處理字符的類型
final?int?NONE=0;????????
final?int?DELIMITER=1;????//操作符運(yùn)算符?
final?int?VAR=2;??????????//字符變量
final?int?Num=3;??????????//數(shù)字
final?int?COMMAND=4;??????//關(guān)鍵字
//final?int?QUOTEDSTR=5;????//帶引號的字符串
//程序終結(jié)符end?of?program
final?String?EOP=“#“;
//聲明關(guān)鍵字
final?int?unKnowKeyword=0;
final?int?FI=1;
final?int?IF=2;
final?int?THEN=3;
final?int?WHILE=4;
final?int?DO=5;
final?int?END=6;
final?int?ELSE=7;
final?int?TO=8;
final?int?READ=9;
final?int?WRITE=10;
final?int?EOL=11;
private?char[]?prog;
private?int?progIdx;
private?String?token;
private?int?tokType;
private?int?kwToken;
final?int?PROG_SIZE=100000;
class?Keyword{
String?keyword;?
int?keywordindex;
Keyword(String?strint?t){
keyword=str;
keywordindex=t;
}
}
//將關(guān)鍵字的外部表示和內(nèi)部表示保存在一個名為KwTable的表中
Keyword?kwTable[]={
new?Keyword(“fi“FI)
new?Keyword(“if“IF)
new?Keyword(“then“THEN)
new?Keyword(“while“WHILE)
new?Keyword(“do“DO)
new?Keyword(“end“END)
new?Keyword(“else“ELSE)
new?Keyword(“to“TO)
new?Keyword(“read“READ)
new?Keyword(“write“WRITE)
};
//CiFaDisegn的構(gòu)造函數(shù)
public?CiFaDisegn(String?programName)?throws?IOException{
char?tempbuf[]=new?char[PROG_SIZE];
int?size;
size=loadProgram(tempbufprogramName);
if(size!=-1){
prog=new?char[size];
System.arraycopy(tempbuf?0?prog?0?size);
}
}
//讀入一個需要分析的程序
private?int?loadProgram(char[]?pString?fname)
throws?IOException{
int?size=0;
try{
FileReader?fr=new?FileReader(fname);
BufferedReader?br=new?BufferedReader(fr);
size=br.read(p?0?PROG_SIZE);
fr.close();
}catch(FileNotFoundException?exc){
System.out.print(“沒有找到該文件!“);
}
if(p[size-1]==(char)31)size--;
return?size;
}
//分析程序代碼
private?void?getToken()?throws?IOException?
??{???
????char?ch;?
?
????tokType?=?NONE;???
????token?=?““;???
????kwToken?=?unKnowKeyword;?
???
????if(progIdx?==?prog.length)?{?
???? token?=?EOP;???
????????return?;??
??????}??
?
????//?跳過空格符??
????while(progIdx? ??????????isSpaceOrTab(prog[progIdx]))?progIdx++;?
???
????????//handle?crlf
????if(prog[progIdx]?==?‘\r‘)?{??
????????progIdx?+=?2;?
????????kwToken?=?EOL;?
????????token?=?“\r\n“;?
????????return;?
??????}?
????
????//?掃描完所有的字符end?program??
????if(progIdx?==?prog.length)?{??
???? ?if(progIdx?==?prog.length)?{??
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????451??2006-10-17?13:08??COMP\詞法分析\CiFaDisegn$Keyword.class
?????文件???????5450??2006-10-17?13:08??COMP\詞法分析\CiFaDisegn.class
?????文件???????7326??2006-10-17?13:08??COMP\詞法分析\CiFaDisegn.java
?????文件????????615??2006-10-17?13:08??COMP\詞法分析\CiFatest.class
?????文件????????421??2006-10-14?09:42??COMP\詞法分析\CiFatest.java
?????文件????????116??2006-10-14?09:46??COMP\詞法分析\test.txt
?????文件????????242??2009-04-19?22:33??COMP\詞法分析\readMe.txt
?????文件?????100864??2009-04-19?22:32??COMP\詞法分析文檔.doc
?????目錄??????????0??2009-04-19?22:33??COMP\詞法分析
?????目錄??????????0??2009-04-19?22:33??COMP
-----------?---------??----------?-----??----
???????????????115485????????????????????10
評論
共有 條評論