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

📄 byylscanner.java

📁 S语言编译器的完整实现
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	 */
	private int falseLine;  
	/**
	 *真出口地址数组中即将生成的下一个出口的序号
	 */     
	private int trueLine;  
	/**
	 *用于判断简单的复赋值语句(变量:= 数值)是否修改符号表<br>
	 *嵌套在其它语句(如 if 语句)中的简单赋值语句不修改符号表,用isChange=0表示<br>
     *不嵌套在其它语句的简单赋值语句需要修改符号表,用isChange=1表示
     */       
	private int isChange;         
	/**
	 *isFor=1表示是嵌套在for语句中的
	 */
	private int isFor;  
	/**
	 *用于记录(+,t1,1,t1)四元式的序号
	 */          
	private int nextFor;          
	/**
	 *构造函数,生成窗体、菜单及为菜单添加监听事件
	 */
	public ByylScanner(){
		                         //构造函数,即初始化
		frame =new Frame("Simple 语言编译器");
		frame.setSize(800,700); 
    	frame.setBackground(Color.GRAY);
		frame.setLocation(0,0);
		menubar=new MenuBar();
		menuFile=new Menu("文件");
		menuFileOpen=new MenuItem("打开");
		menuFileClose=new MenuItem("关闭");
		menuFileExit= new MenuItem("退出");
		
          //添加监听事件
		menuFileOpen.addActionListener(new ActionListener() //点击menuFileOpen"打开"将要执行的代码
         {
           public void actionPerformed(ActionEvent e)
           {
           	if(fileFlag==2)
                try{ 
		     	     fileSaver= new FileDialog(frame);
		     	     fileSaver.setMode(1);
		     	     fileSaver.setFile(currentFile.toString());
		     	     fileSaver.setTitle("保存原文件为");
		   	         fileSaver.setVisible(true);
		   	         try{
		   	         	currentFile=new File(fileSaver.getFile());
		   	         	}catch(Exception oe) {return;};
		   	         fos=new FileOutputStream(currentFile);
		   	 	     saveText=new String(inputTextArea.getText());
		   	 	     fos.write(saveText.getBytes());
			         }catch(IOException Ioe) {};
			if(fileFlag==1)//打开的文件,保存后退出
			    try{   
		   	         fos=new FileOutputStream(currentFile);
		   	 	     saveText=new String(inputTextArea.getText());
		   	 	     fos.write(saveText.getBytes());
			        }catch(IOException Ioe) {};
			    fileFlag=0; 
			    inputTextArea.setText("");
			    resultTextArea.setText("");
			    tokenTextArea.setText("");
			    symbolTableTextArea.setText("");
			 try{
		   	     fileChooser= new FileDialog(frame);
		   	     fileChooser.setMode(0);
		   	     fileChooser.setTitle("打开文件");
		   	     fileChooser.setVisible(true);
		   	     try{
		   	     	currentFile=new File(fileChooser.getFile());
		   	     	}catch(Exception oe) {return;};
		   	     fis=new FileInputStream(currentFile);
	             len=fis.available();
	             buffer=new byte[len];
	             fis.read(buffer);
	             inputTextArea.setText(new String(buffer));
		        }catch(IOException Ioe) {};
		      frame.setTitle("Simple 语言编译器"+currentFile.toString());	
           
           }
         }
         );
 
	    menuFileClose.addActionListener(new ActionListener() //点击menuFileClose"关闭"将要执行的代码
         {
           public void actionPerformed(ActionEvent e)
           {
            if(fileFlag==2)   //新建的文件,还没有文件名
              try{ 
		     	   fileSaver= new FileDialog(frame);
		     	   fileSaver.setMode(1);
		     	   fileSaver.setFile(currentFile.toString());
		     	   fileSaver.setTitle("保存原文件为");
		   	       fileSaver.setVisible(true);
		   	       try{
		   	      	  currentFile=new File(fileSaver.getFile());
		   	      	 }catch(Exception oe) {return;};
		   	       fos=new FileOutputStream(currentFile);
		   	 	   saveText=new String(inputTextArea.getText());
		   	 	   fos.write(saveText.getBytes());
			      }catch(IOException Ioe) {};
		    if(fileFlag==1)//打开的文件,保存后退出
			   try{   
		   	      fos=new FileOutputStream(currentFile);
		   	 	  saveText=new String(inputTextArea.getText());
		   	 	  fos.write(saveText.getBytes());
			      }catch(IOException Ioe) {};
			          
			   
			currentFile= new File(""); 
		    inputTextArea.setText("");
	       	symbolTableTextArea.setText("");
		    resultTextArea.setText("");
		    tokenTextArea.setText("");
		    fileFlag=0;
		    frame.setTitle("Simple 语言编译器"+currentFile.toString()); 
		    for(int i=0;i<tokenCount;i++)
		    {
		    	tokenList[i].address=0;
		    	tokenList[i].code=0;
		    	tokenList[i].label=0;
		    	tokenList[i].name.delete(0,tokenList[i].name.length());
		    }
		    for(int i=0;i<varCount;i++)
		    {
		    	symbolList[i].addr=0;
		    	symbolList[i].kind.delete(0,symbolList[i].kind.length());
		    	symbolList[i].name.length=0;
		    	symbolList[i].name.start=0;
		    	symbolList[i].sign.delete(0,symbolList[i].sign.length());
		    	symbolList[i].type.delete(0,symbolList[i].type.length());
		    	symbolList[i].val.delete(0,symbolList[i].val.length());
		    }
		   
		    }
		    
	      }  
          );
		menuFileExit.addActionListener(new ActionListener()
         {
           public void actionPerformed(ActionEvent e)
           {
           	
           	if(fileFlag==2)//新建的文件,还没有文件名
               try{ 
		     	   fileSaver= new FileDialog(frame);
		     	   fileSaver.setMode(1);
		     	   fileSaver.setFile(currentFile.toString());
		     	   fileSaver.setTitle("保存原文件为");
		   	       fileSaver.setVisible(true);
		   	       try{
		   	       	   currentFile=new File(fileSaver.getFile());
		   	       	   }catch(Exception oe){return;};
		   	       fos=new FileOutputStream(currentFile);
		   	 	   saveText=new String(inputTextArea.getText());
		   	 	   fos.write(saveText.getBytes());
			      }catch(IOException Ioe) {};
			if(fileFlag==1)//打开的文件,保存后退出
			   try{   
		   	      fos=new FileOutputStream(currentFile);
		   	 	  saveText=new String(inputTextArea.getText());
		   	 	  fos.write(saveText.getBytes());
			      }catch(IOException Ioe) {};
			   fileFlag=0;
			System.exit(0);
	       }
	      } 
         );
        menuFile.add(menuFileOpen);
    	menuFile.add(menuFileClose);
		menuFile.add(menuFileExit);
		
		menuBuild=new Menu("编 译");
		menuBuildMorphemeAnalysis=new MenuItem("词法分析");
		menuBuildParsing=new MenuItem("语法/语义分析");
		
		menuBuildMorphemeAnalysis.addActionListener(new ActionListener()
         {
           public void actionPerformed(ActionEvent e)
           {
           	beginScanner();    //调用词法分析子程序
           	symbolTableTextArea.append("\n\n字符串为"+alphabet.toString());
	       }
	     }  
         );
		menuBuildParsing.addActionListener(new ActionListener()
         {
           public void actionPerformed(ActionEvent e)
           {
           	
           	parser();         //调用语法/语义分析子程序
           	 
	       }
	     }  
         );
		
		menuBuild.add(menuBuildMorphemeAnalysis);
		menuBuild.add(menuBuildParsing);
		
		menuSave=new Menu("保   存");
		menuSaveSymbol=new MenuItem("保存符号表");
		menuSaveSource=new MenuItem("保存原文件");
		menuSaveToken=new MenuItem("保存Token");
		menuSaveCode=new MenuItem("保存四元式");
		
		menuSave.add(menuSaveSource);
		menuSave.add(menuSaveSymbol);
		menuSave.add(menuSaveToken);
		menuSave.add(menuSaveCode);
		
		menuSaveSource.addActionListener(new ActionListener()
         {
           public void actionPerformed(ActionEvent e)
           {
           	System.out.println(fileFlag);
           	if(fileFlag==2)
               try{ 
		     	   fileSaver= new FileDialog(frame);
		     	   fileSaver.setMode(1);
		     	   fileSaver.setFile(currentFile.toString());
		     	   fileSaver.setTitle("保存原文件为");
		   	       fileSaver.setVisible(true);
		   	       try{
		   	        	currentFile=new File(fileSaver.getFile());
		   	       	  }catch(Exception oe) {return;};
		   	       fos=new FileOutputStream(currentFile);
		   	 	   saveText=new String(inputTextArea.getText());
		   	 	   fos.write(saveText.getBytes());
			      }catch(IOException Ioe) {};
			if(fileFlag==1)//打开的文件,保存
			   try{   
		   	       fos=new FileOutputStream(currentFile);
		   	 	   saveText=new String(inputTextArea.getText());
		   	 	   fos.write(saveText.getBytes());
			      }catch(IOException Ioe) {};     
			  fileFlag=0;
			  frame.setTitle("Simple 语言编译器"+currentFile.toString()+"-已保存");  
	       }
	      } 
         );
		menuSaveSymbol.addActionListener(new ActionListener()
         {
           public void actionPerformed(ActionEvent e)
           {
           	try{ 
		        fileSaver= new FileDialog(frame);
		     	fileSaver.setMode(1);
		     	fileSaver.setTitle("保存符号表文件为");
		   	    fileSaver.setVisible(true);
		   	    try{currentFile=new File(fileSaver.getFile());}catch(Exception oe) {return;};
		   	    fos=new FileOutputStream(currentFile);
		   	 	saveText=new String(symbolTableTextArea.getText());
		   	 	for(int i=0;i<saveText.length();i++) //这样可以换行
		   	 	 {
		   	 	  if(saveText.charAt(i)=='\n')
		   	 	   {
		   	 	 	fos.write(13);
		   	 	    fos.write(10);
		   	 	   }
		   	 	  else 
		   	 	   fos.write(saveText.charAt(i));
		   	 	 }
		   	  }catch(IOException Ioe) {};
           	}
	     }  
         );
		menuSaveToken.addActionListener(new ActionListener()
         {
           public void actionPerformed(ActionEvent e)
           {
           	try{ 
		        fileSaver= new FileDialog(frame);
		     	fileSaver.setMode(1);
		     	fileSaver.setTitle("保存token文件为");
		   	    fileSaver.setVisible(true);
		   	    try{
		   	    	  currentFile=new File(fileSaver.getFile());
		   	    	}catch(Exception oe) {return;};
		   	 	fos=new FileOutputStream(currentFile);
		   	    saveText=new String(tokenTextArea.getText());
		   	 	for(int i=0;i<saveText.length();i++)
		   	 	{
		   	 		if(saveText.charAt(i)=='\n')
		   	 	   {
		   	 	 	 fos.write(13);
		   	 	     fos.write(10);
		   	 	   }
		   	 	  else 
		   	 	    fos.write(saveText.charAt(i));
		   	 	}
		   	 }catch(IOException Ioe) {};
	       }
	     }
         );
         menuSaveCode.addActionListener(new ActionListener()
         {
           public void actionPerformed(ActionEvent e)
           {
           	try{ 
		        fileSaver= new FileDialog(frame);
		     	fileSaver.setMode(1);
		     	fileSaver.setTitle("保存四元式文件为");
		   	    fileSaver.setVisible(true);
		   	    try{
		   	    	currentFile=new File(fileSaver.getFile());
		   	    	}catch(Exception oe) {return;};
		   	 	fos=new FileOutputStream(currentFile);
		   	    saveText=new String(tokenTextArea.getText());
		   	 	for(int i=0;i<saveText.length();i++)
		   	 	{
		   	 		if(saveText.charAt(i)=='\n')
		   	 	   {
		   	 	 	 fos.write(13);
		   	 	     fos.write(10);
		   	 	   }
		   	 	  else 
		   	 	    fos.write(saveText.charAt(i));
		   	 	}
		   	 }catch(IOException Ioe) {};
	       }
	     }
         );
         
		menubar.add(menuFile);
		menubar.add(menuBuild);
		menubar.add(menuSave);
		frame.setMenuBar(menubar);
		
		inputTextArea=new TextArea();
		inputTextArea.addTextListener(new TextListener()
		{
		   public void textValueChanged(TextEvent e)
		   {
		  	 if(currentFile.exists())
		  	 fileFlag=1;
		  	 if(!currentFile.exists())
		  	   {
		  	   	if(inputTextArea.getText().equals(new String("")))  //关闭了上一个文件
		  	   	fileFlag=0;
		  	   	else   //inputTextArea有内容,但还没有文件名
		  	   	fileFlag=2;
		  	   	frame.setTitle("Simple 语言编译器"+currentFile.toString());
		  	   	return;
		  	   }
		  	   frame.setTitle("Simple 语言编译器"+currentFile.toString()+"-未保存");
		   }	
		 }
		);
		symbolTableTextArea=new TextArea();
		resultTextArea=new TextArea();
		tokenTextArea=new TextArea();
		
		frame.setLayout(new GridLayout(2,2));
		frame.add(inputTextArea);
	    frame.add(symbolTableTextArea);
		frame.add(resultTextArea);
    	frame.add(tokenTextArea);
		frame.setVisible(true);
		frame.addWindowListener( new WindowAdapter()
		{
			public void windowClosing(WindowEvent e )
			{
				System.exit(0);
			}
		}
		);
				
	}  
	/**
	 *初始化各个属性的值、生成StringBuffer对象及在数组keyWord[]加关键字
	 */  
    public void scannerInit()
    {   
       int i=0;
           charId=-1; 
           varEnd=0;          
	      varCount=0;           //字符串个数统计
          tokenCount=0;         //token计数器
	      errorCount=0;         //错误计数器
	      labelCount=1;         // 序号
          addrCount=0;          //入口地址
  	      rowCount=1;           //行计数器
	      columnCount=1;        //列计数器
	      beginCode=0;         //用于程序是否正常结束
	      endCode=0;
          currentSymbol=new Symbol();
          currentToken=new Token(); 
          alphabet=new StringBuffer();
          symbolList=new Symbol[MAX];     //创建数组
          tokenList=new Token[MAX];
          keyWord=new StringBuffer[LENGTH+1];
          for(i=0;i<MAX;i++)
          symbolList[i]=new Symbol();     //创建对象
          for(i=0;i<MAX;i++)
          tokenList[i]=new Token();       //创建对象
    	  for(i=0;i<LENGTH+1;i++)
    	  keyWord[i]=new StringBuffer();//创建对象
         
          keyWord[1].append("and");
          keyWord[2].append("array");
          keyWord[3].append("begin");
          keyWord[4].append("bool");
          keyWord[5].append("call");
          keyWord[6].append("case");
          keyWord[7].append("char");
          keyWord[8].append("constant");
          keyWord[9].append("do");
 		  keyWord[10].append("else");
  		  keyWord[11].append("end");
  		  keyWord[12].append("false");
  		  keyWord[13].append("for");
  		  keyWord[14].append("if");
 		  keyWord[15].append("input");
 		  keyWord[16].append("integer");
 		  keyWord[17].append("not");
 		  keyWord[18].append("of");
  		  keyWord[19].append("or");
  		  keyWord[20].append("output");
  		  keyWord[21].append("procedure");
  		  keyWord[22].append("program");
  		  keyWord[23].append("read");
  		  keyWord[24].append("real");
  		  keyWord[25].append("repeat");
  		  keyWord[26].append("set");
  		  keyWord[27].append("then");
  		  keyWord[28].append("to");
  		  keyWord[29].append("true");
  		  keyWord[30].append("until");
  		  keyWord[31].append("var");
  		  keyWord[32].append("while");
  	  	  keyWord[33].append("write");
  	  	  
  	  	  resultTextArea.setText("词法分析的结果:\n\n");
  	  	  symbolTableTextArea.setText("词法分析后的符号表:\n\n");
  	  	  symbolTableTextArea.setText("序号"+"   NAME   "+" TYEP "+"  KIND  "+" VAL "+" ADDR "+" 符号\n");
  	  	  tokenTextArea.setText("词法分析后的token串:\n\n");
       
    }
 /**

⌨️ 快捷键说明

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