资源简介

哈工大 编译原理 词法分析 语法分析 语义分析

资源截图

代码片段和文件信息

/*
词法分析程序的功能 
输入是源程序字符串以‘#’ 结束。
输出是单词符号的二元组( 单词种别码 单词自身字符串 ) 即( syn单词的种别 token单词自身字符串或sum整型常数单词)
例如
输入:  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;    //操作符运算符 
final int VAR=2;          //字符变量
final int Num=3;          //数字
final int COMMAND=4;      //关键字
//final int QUOTEDSTR=5;    //带引号的字符串
//程序终结符end of program
final String EOP=“#“;

//声明关键字
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;
}
}

//将关键字的外部表示和内部表示保存在一个名为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的构造函数
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 < prog.length &&   
          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


评论

共有 条评论