⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 byylscanner.java

📁 S语言编译器的完整实现
💻 JAVA
📖 第 1 页 / 共 5 页
字号:

package byyl;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
/**
 *题目:符号表中的名字类<br>
 *描述:作为符号表中的NAME类,它有两个属性,分别存放标志符在字符串的起始地址和长度
 *@author 闫相通(040410206)  哈工大(威海) xiangtongcz@126.com
 *@version 2007.3.13
 */
class WordName
{
	/**
	 *存放标志符在字符串中的起始地址
	 */
	public int start;
	/**
	 *存放标志符的长度
	 */
	public int length;
}
//
/**
 *题目:符号表类<br>
 *描述:存放符号表
 *@author 闫相通 (040410206) 哈工大(威海) xiangtongcz@126.com
 *@version 2007.3.13 
 */
class Symbol
{   
	/**
	 *符号表的每一项的序号
	 */
	public int addr;
	/**
	 *存放标识符,用于输出显示
	 */ 
	public StringBuffer sign;
	/**
	 *符号表的名字栏,对数字来说,它的两个属性都是0
	 */ 
	public WordName name;
	/**
	 *标志符的类型
	 */
	public StringBuffer type;
	/**
	 *标志符的种类
	 */
	public StringBuffer kind;
	/**
	 *标志符的值
	 */
	public StringBuffer val;
	/**
	 *构造函数,将各个属性生成对象
	 */
	public Symbol()
	 {  
	    sign=new StringBuffer();
	    name=new WordName();
	    type=new StringBuffer();
	    kind=new StringBuffer();
	    val=new StringBuffer();
	 }
	
}
/**
 *题目:token类<br>
 *描述:存放种别码,属性值及其对应的字符串
 *@author 闫相通(040410206) 哈工大(威海) xiangtongcz@126.com
 *@version 2007.3.13
 */
class Token
{ 
   /**
    *token的序号
    */
   public int label;
   /**
    *存放标志符或数字
    */
   public StringBuffer name; 
   /**
    *种别码
    */
   public int code; 
   /**
    *在符号表的入口地址
    */ 
   public int address;
   /**
    *构造函数,将name指向一个StringBuffer类对象
    */
   public Token()
   {  
     name=new StringBuffer();
   } 
	
}
/**
 *题目:存放算术表达式或布尔表达式的堆栈类<br>
 *描述:按顺序存放布尔表达式或算术表达式的每一个字符
 *@author 闫相通(040410206) 哈工大(威海) xiangtongcz@126.com
 *@version 2007.3.13
 */
class stack
{
  /**
   *表达式的每一个字符
   */	
  public StringBuffer name;
  /**
   *每一个字符的编码
   */
  public int cod;
  /**
   *每一个字符的入口地址
   */
  public int addr;
  /**
   *构造函数,将name指向一个StringBuffer类对象
   */
  public stack()
  {
  	name=new StringBuffer();
  	}
}
/**
 *题目:存放生成的四元式的堆栈类<br>
 *描述:存放四元式的栈
 *@author 闫相通(040410206) 哈工大(威海) xiangtongcz@126.com
 *@version 2007.3.13
 */
 class equ
{
	/**
	 *操作码
	 */
	public StringBuffer op;
	/**
	 *第一个操作数在符号表中地址
	 */
	public int op1;
	/**
	 *第二个操作数在符号表中地址
	 */
	public int op2;
	/**
	 *运算的结果
	 */
	public int result;
	/**
	 *构造函数,将op指向一个StringBuffer类对象
	 */
	equ()
	{
		op=new StringBuffer();
	}
   
}

/**
 *题目:ByylScanner启动运行类<br>
 *描述:Simple语言编译器。包括词法分析,语法/语义分析.<br>
 *     中间生成的有符号表,token串,修改后的符号表和四元式。<br>
 *     运行时您将见到四个显示区域。用途如下<br>
 *     左上 inputTextArea 用于打开和编写simple语言源程序<br>
 *     右上symbolTableTextArea 用于显示词法分析后的符号表和修改后的符号表<br>
 *     左下resultTextArea 用于显示词法分析和语法语义分析的出错情况<br>
 *     右下tokenTextArea 用于显示token串和生成的四元式
 *@author 闫相通(040410206)   哈工大(威海) xiangtongcz@126.com
 *@version 2007.3.13
 */
 public  class ByylScanner {
 	/**
 	 *显示的窗体
 	 */
	private Frame frame;
	/**
	 *窗体上的菜单
	 */
	private MenuBar menubar;
	/**
	 *菜单中的"文件"项
	 */
	private Menu menuFile;
    /**
     *菜单中的"编译"项
     */
	private Menu menuBuild;
	/**
     *菜单中的"保存"项
     */
    private Menu menuSave;
    /**
     *"文件"中的"打开"
     */    
	private MenuItem menuFileOpen;
	/**
     *"文件"中的"关闭"
     */    
	private MenuItem menuFileClose;
	/**
     *"文件"中的"推出"
     */    
	private MenuItem menuFileExit;
	/**
     *"编译"中的"词法分析"
     */    
	private MenuItem menuBuildMorphemeAnalysis;
	/**
     *"编译"中的"语法/语义分析"
     */    
	private MenuItem menuBuildParsing; 
	/**
	 *"保存"中的"保存原文件"
	 */
	private MenuItem menuSaveSource;
	/**
	 *"保存"中的"保存符号表"
	 */
	private MenuItem menuSaveSymbol;
    /**
	 *"保存"中的"保存token串"
	 */
	private MenuItem menuSaveToken;
	/**
	 *"保存"中的"保存四元式"
	 */
	private MenuItem menuSaveCode;
	
	/**
	 *显示程序的输入区
	 */
	private TextArea inputTextArea;
	/**
	 *输出符号表和字符串的区域
	 */
	private TextArea symbolTableTextArea;
	/**
	 *显示此法分析和语法/语义分析的结果
	 */
	private TextArea resultTextArea;
	/**
	 *词法分析时显示token串<br>
	 *语法/语义分析时显示四元式
	 */
	private TextArea tokenTextArea;
	/**
	 *指向当前所处理的文件的指针
	 */
	private File currentFile=new File("");
	/**
	 *fileFlag=0表示可以直接关闭程序<br>
	 *fileFlag=1表示原文件已经被修改,但未保存,点击保存则直接保存,
	 *点击打开则直接保存后再打开,点击关闭则保存后再关闭<br>
	 *fileFlag=2表示新建的文件,要弹出对话框给出文件名。
	 */
	private int fileFlag=0;
	/**
	 *打开文件时弹出对话框以选择文件
	 */
	private FileDialog  fileChooser ; 
	/**
	 *打开文件时弹出对话框以选择文件
	 */
	private FileDialog  fileSaver ;
	/**
	 *将文件内容显示在输入区时所用的输入流
	 */   
	private FileInputStream fis; 
	/**
	 *将输入区内容保存到文件时所用的输出流 
	 */     
	private FileOutputStream fos;     
	/**
	 *当前token串
	 */ 
	private Token currentToken;  
	/**
	 *当前符号表
	 */     
	private Symbol currentSymbol;   
	/**
	 *存放当前分析的程序的所有字符
	 */  
	private String saveText;  
	/**
	 *字母表
	 */        
	private StringBuffer alphabet;  
	/**
	 *读入文件的长度
	 */  
	private int len;   
	/**
	 *读入的文件内容存在byte串中
	 */               
	private   byte []buffer;          
	/*
	 *符号表的每一行存放在数组里面
	 */
	private Symbol []symbolList;   
	/**
	 *token串存放在数组里面
	 */   
	private Token  []tokenList;   
	 /**
	  *当前字符在saveText符号串中的位置
	  */    
	private  int charId;  
	/**
	 *读入的字符
	 */         
	private char ch;                  
	/**
	 *字符串个数统计
	 */
    private int varCount; 
    /**
     *token计数器
     */          
    private int tokenCount;  
    /**
     *说明语句结束的标志位
     */
     private int varEnd;
    /**
     *词法分析时错误计数器
     */       
	private int errorCount; 
	/**
	 *token的计数器
	 */        
	private int labelCount;  
	/**
	 *符号表的计数器
	 */        
	private int addrCount;  
	/**
	 *行计数器
	 */        
	private int rowCount;    
	/**
	 *列计数器
	 */       
	private int columnCount;  
	/**
	 *用于程序是否正常结束,碰到begin,beginCode加2
	 */      
	private  int beginCode; 
	 /**
	  *碰到end后,endCode加一,碰到;或.再加一
	  */       
	private  int endCode;
	/**
	 *设定符号表的最大长度
	 */
	private static final int MAX=500;   
	/**
	 *保留字的个数
	 */
	private static final int LENGTH=33; 
	/**
	 *存放关键字的数组  
	 */
	private StringBuffer []keyWord;          
	
	//以下用于语法/语义分析
	/**
	 *堆栈expr[]的大小
	 */
	private static final int EXP_LEN=100;
	/**
	 *堆栈Equ[]的大小
	 */
	private static final int EQU_LEN=1024;
    /**
     *随即地址的下界
     */
	private static final int TEMPBOUNDARY=5000;
	/**
	 *从tokenList[]取出token的计数器
	 */
	private int tokenId;  
	/**
	 *当前token的种别码
	 */       
	private int code;     
	/**
	 *当前token在符号表中的入口地址(序号)
	 */         
	private int address;     
	/**
	 *语法/语义分析时的行计数器
	 */      
	private int lineOfPro; 
	/**
	 *下一个将要生成的四元式的序号
	 */        
	private int lineOfEqu;         
    /**
     *存放运算表达式和布尔表达式
     */
	private stack []expr;  
	/**
	 *存放四元式的数组
	 */        
	private equ []Equ;             
    /**
     *存放当前token对应的字符串或数字
     */
	private StringBuffer ID;       
    /**
     *expr[]堆栈的计数器
     */
    private int pos;
    /**
     *当前分析的token在堆栈expr[]的位置
     */
	private int nowAddr;
	/**
	 *随即变量地址
	 */
	private int tempCount;
	/**
	 *语法/语义分析时错误计数器
	 */
	private int error_count;
	/**
	 *存放真出口地址数组
	 */
	private int []trueAddress;    
	/**
	 *存放假出口地址
	 */
	private int []falseAddress;   
	/**
	 *假出口地址数组中即将生成的下一个出口的序号

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -