亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pl0.java

?? pl0的好的編譯程序,通過這個程序可以很好的了解編譯的過程,掌握編譯器的運行原理!
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
package pl0Compiler;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;


public class Pl0 {
	final int tableMax =100;   
	final int numLength = 14;   
	final int identLength =10;    
	final int levMax =3;    
	final int codeMax=200;     
    final int stackSize=500;
    final int symnum=32;
enum Symbol{
	 nul,    ident,     number,     plus,     minus,
	 multiply,   divide,   oddsym,   eql,     neq,
	 lss,     leq,      gtr,     geq,     lparen,
	 rparen,  comma,   semicolon,period,  assign,
	 beginsym, endsym, ifsym,    thensym,  whilesym,
	 writesym, readsym,  dosym,  callsym,  constsym,
	 varsym,  proceduresym	
};
enum Object{
	   constant,
	   variable,
	   procedure,
	};
enum Function{
	lit, opr,  lod,  sto,  cal,  inte,  jmp,  jpc,
};
class Instruction
{
  Function f;
  int l;//層差,標識符引用層減去定義層
  int a;
};
class TableStruct
{
   String name;          
   Object kind;                      
   int val;                            
   int level;                         
   int adr;                         
   int size;                          
};
char ch;
Symbol sym;
String token="";
int  num;
int cc,ll;
int cx;
char[] line=new char[81];
Instruction[] code=new Instruction[codeMax];
Symbol[] kwsym={Symbol.beginsym,Symbol.callsym,Symbol.constsym,Symbol.dosym,Symbol.endsym,Symbol.ifsym,
		Symbol.oddsym,Symbol.proceduresym,Symbol.readsym,Symbol.thensym,Symbol.varsym,Symbol.whilesym,Symbol.writesym};
TableStruct[] table=new TableStruct[tableMax];            
File SourceFile;
RandomAccessFile randomAFile; 
String SourceFileName="E:/三年級課程/編譯原理/編譯原理實驗/pl02.txt";//"E:/三年級課程/編譯原理/PL0源碼C語言版/pl0.txt";
int err;                              

public static void  main(String args[])
{
	Pl0 pl=new Pl0();
   	pl.init();                                         
    pl.getsym();
	pl.block(0,0);			
	if(pl.sym!=Symbol.period)
			pl.error(9);
		System.out.println("The ultimate code is following:");
	pl.listcode(0);
	if(pl.err==0)
    	pl.interpret();
	else
	   System.out.printf("Errors in pl/0 program");

}


void init()
{
	SourceFile = new File(SourceFileName);
	try {
		randomAFile = new RandomAccessFile(this.SourceFile, "r");
	} catch (FileNotFoundException e) {
			e.printStackTrace();
	}
	for(int j=0;j<table.length;j++)
	    table[j]=new TableStruct();
     for(int j=0;j<code.length;j++)
	    	code[j]=new Instruction();
     err=0;
     cc=0;
     cx=0;
     ll=0;
     ch=' ';

}
void error(int n)
 
{
	
	System.out.printf("----------%c\n",ch);
	
	System.out.println("**********"+n);
	err++;
	
}
String contact(String token, char ch) {
	token= token + String.valueOf(ch);
      return token;
  }

void getch()
{   if(cc==ll){
	ll=0;
	cc=0;
	System.out.printf("%d ",cx );
	ch=' ';
	while(ch!=10){
		try{
			ch=(char) randomAFile.readByte();
		} catch (IOException e) {
			line[ll]=0;
			break;
		}
	System.out.printf("%c",ch);
	line[ll]=ch;
	ll++;
	}
	System.out.printf("\n");
}
ch=line[cc];
cc++;

}
void getsym()
{
	while(ch==' '|(byte)ch==13|(byte)ch==10|ch==9)
		getch();
	
	int i,k;
	if(ch>='a'&&ch<='z')
	{ String s="";
		k=0;
		do{
			if(k<identLength)
			{   s=contact(s,ch);
				k++;
			}
			getch(); 
		}while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9');
		token=s;
		s=s+"sym";
		for(i=0;i<kwsym.length;i++){
			
			if(s.equalsIgnoreCase(kwsym[i].name()))
			{    sym=kwsym[i];
        		break;
			}
		}
			
			if(i==kwsym.length)
				sym=Symbol.ident;

	}
	else if(ch>='0'&&ch<='9')
		{  String s="";
			num=0;
			sym=Symbol.number;
			do{
				s=contact(s,ch);
				getch();
			}while(ch>='0'&&ch<='9'); 
			num=Integer.parseInt(s);
			if(s.length()>numLength)
			{
				error(30);
			}
		}
	else if(ch==':')             
	{
		getch();
	if(ch=='=')
	{
		sym=Symbol.assign;
		getch();
		}
	else
		sym=Symbol.nul;           
	}
	else if(ch=='<')         
	{     getch();
		if(ch=='=')
		{
			sym=Symbol.leq;
			getch();
		}
					
		else sym=Symbol.lss;
	}
	else if(ch=='>')          
	{
		getch();
		if(ch=='=')	
		{
			sym=Symbol.geq;
			getch();
			}
		else
		{
			sym=Symbol.gtr;
		}
	}
	else
	{  switch(ch){
	case '+': 
		sym=Symbol.plus;
		break;
	case '-': 
		sym=Symbol.minus;
		break;
	case '*':
		sym=Symbol.multiply;
		break;
	case '/':
		sym=Symbol.divide;
		break;
	case '(': 
		sym=Symbol.lparen;
		break;
	case ')':
		sym=Symbol.rparen;
		break;
	case '=': 
		sym=Symbol.eql;
		break;
	case ',':
		sym=Symbol.comma;
		break;
	case '.': 
		sym=Symbol.period;
		break;
    case '#':
    	sym=Symbol.neq;
    	break;
	case ';': 
		sym=Symbol.semicolon;
		break;
	  }
	if(sym!=Symbol.period)
			getch();
    }
		
}

void gen(Function x,int y,int z)
{
	if(cx>=codeMax)
	{
		System.out.printf("Program is too long!"); 
		System.exit(0);
	}
	code[cx].f=x;
	code[cx].l=y;
	code[cx].a=z;
	cx++;
	
}


void block(int lev,int tx)
{
	
    int i;
    int dx; //名字分配到的相對地址
    int tx0; //保留本過程名在名字表中的位置
    int cx0; //保留本過程目標代碼的起始位置
 
    int[] x=new int[2];
    dx=3;    //為該過程變量分配存儲空間的起始位置,也就是相對基地址的偏移量
    tx0=tx;    //保留當前table表指針值,是該過程名在table表中的位置
    table[tx].adr=cx;//保留當前code指針值到過程名的adr域
    gen(Function.jmp,0,0);//生成轉(zhuǎn)向過程體入口的指令,地址待回填
    if(lev > levMax)
    {
		error(32);                                                                                                                                         
    }
    do{
        if(sym==Symbol.constsym)        
        {
			getsym();
			do{
                x=constdeclaration(tx,lev,dx);  
                tx=x[0];
                dx=x[1];
                while(sym==Symbol.comma)
                {
                   getsym();
                   x=constdeclaration(tx,lev,dx);
                   tx=x[0];
                   dx=x[1];
                }
                if(sym==Symbol.semicolon)
                    getsym();
			    else
					error(5); /*漏掉了逗號或者分號*/
				
			}while(sym==Symbol.ident);
		}
        if(sym==Symbol.varsym)
		{
			getsym();
			do{
				x=vardeclaration(tx,lev,dx);
				tx=x[0];
				dx=x[1];
				while(sym==Symbol.comma)
				{
					getsym();
					x=vardeclaration(tx,lev,dx);
					tx=x[0];
					dx=x[1];
				}
				if(sym==Symbol.semicolon)
					getsym();
				
				else
				    error(5);
				
			}while(sym==Symbol.ident);
		}
		while(sym==Symbol.proceduresym)     
		{
			getsym();
			if(sym==Symbol.ident)
			{
				x=enter(Object.procedure,tx,lev,dx);
				tx=x[0];
				dx=x[1];
				getsym();
			}
			else
			   error(4);//procedure后應(yīng)為標識符
			
			if(sym==Symbol.semicolon)
				getsym();
			
			else
				error(5);//漏掉了分號
				
			block(lev+1,tx);//遞歸進入分程序
			
		   if(sym==Symbol.semicolon)
             getsym();
           else
                error(5); /*漏掉了分號*/
            
		}
		
    }while(sym==Symbol.constsym|sym==Symbol.varsym|sym==Symbol.proceduresym);              
    
    code[table[tx0].adr].a=cx;//回填過程入口地址到code的a中
    table[tx0].adr=cx; //記錄過程在code的入口到table中的adr域

    table[tx0].size=dx;//過程占的空間填 寫在table中,聲明部分中每增加一條聲明都會給dx增加1,聲明部分已經(jīng)結(jié)束,dx就是當前過程數(shù)據(jù)的size
        
    cx0=cx;//保留過程在code中的入口地址,打印目標代碼用
    gen(Function.inte,0,dx);//生成過程入口指令
 
    System.out.print("TABLE:\n");
    if(tx0+1>tx)
        {
			System.out.printf("NULL\n");
        }
        for(i=tx0+1;i<=tx;i++)
        {
            switch(table[i].kind)
            {
                case constant:
                	System.out.println(i+" NAME:"+table[i].name+"  KIND:"+
                			Object.constant+"   VALUE:"+table[i].val);
					break;
                case variable:
                	System.out.println(i+" NAME:"+table[i].name+"  KIND:"+
                			Object.variable+"   LEVEL:"+table[i].level+"  ADDRESS:"+table[i].adr);
                               break;
                case procedure:
                	System.out.println(i+" NAME:"+table[i].name+"  KIND:"+
                			Object.procedure+"  LEVEL:"+table[i].level+"  ADDRESS:"+table[i].adr+"  SIZE:"+table[i].size);
					break;
			}
		}
  
        
	tx=statement(tx,lev);
	gen(Function.opr,0,0); //過程出口都要釋放數(shù)據(jù)段
	listcode(cx0);                
	
}
int[] enter (Object k,int ptx,int lev, int pdx)
{ int[]x=new int[2];
	ptx++;
	table[ptx].name=token;      
	table[ptx].kind=k;
	switch(k)
	{
		case constant:                     
			table[ptx].val=num;
			break;
		case variable:                    
			table[ptx].level=lev;
			table[ptx].adr=pdx;
			pdx++;
			break;                        
		case procedure:
			table[ptx].level=lev;
			break;
	}
	x[0]=ptx;
	x[1]=pdx;
	return x;

}

int position(String idt,int  tx)
{
	int i;
	
	table[0].name=idt;
	i=tx;
	while(table[i].name.compareToIgnoreCase(idt)!=0)
		i--;
	return i;
}

int[] constdeclaration(int ptx,int lev,int  pdx)
{ int[]x=new int[2];
	if(sym==Symbol.ident)
	{
		getsym();
		if(sym==Symbol.eql )
		{			
			getsym();
			if(sym==Symbol.number)
			{
				x=enter(Object.constant,ptx,lev,pdx);
				ptx=x[0];
				pdx=x[1];
				getsym();
			}
			else
			   error(2);                 
			         
		}
		else
			error(3);                       
		
	}
	else
		error(4);                       
	
	return x;
}

int[] vardeclaration(int ptx,int lev,int pdx)
{
	int[]x=new int[2];

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品一区在线观看| 国产一二精品视频| 色综合激情五月| 亚洲视频 欧洲视频| 91亚洲精品乱码久久久久久蜜桃 | 一本一道波多野结衣一区二区| 欧美高清在线精品一区| 成人的网站免费观看| 亚洲欧美日韩一区二区三区在线观看| 日本乱人伦aⅴ精品| 丝袜亚洲精品中文字幕一区| 精品美女一区二区| 高清国产午夜精品久久久久久| 亚洲欧洲精品一区二区三区 | 极品少妇xxxx偷拍精品少妇| 亚洲精品一区二区三区蜜桃下载 | 秋霞午夜av一区二区三区| 欧美一区二区精品| 国产麻豆视频一区| 亚洲欧美日韩国产成人精品影院 | 国产精品剧情在线亚洲| 日本乱人伦aⅴ精品| 日本视频中文字幕一区二区三区 | 精品av综合导航| 成人av片在线观看| 五月激情丁香一区二区三区| 亚洲在线视频一区| 91精品在线免费观看| 国产一区二区视频在线播放| 亚洲另类一区二区| 91精品国产色综合久久不卡电影 | 日本一区二区免费在线| 一本到一区二区三区| 久久精品噜噜噜成人av农村| 国产精品久久久久影院老司| 欧美精品乱码久久久久久按摩| 国产成人午夜精品影院观看视频| 亚洲精品成人精品456| 精品88久久久久88久久久| thepron国产精品| 蜜臀精品久久久久久蜜臀| 国产精品久久久久影视| 欧美一二三四区在线| 97久久久精品综合88久久| 蜜桃av一区二区三区电影| 亚洲免费观看高清完整版在线观看熊| 欧美电视剧在线看免费| 欧美色视频一区| 成人少妇影院yyyy| 狠狠色狠狠色综合| 亚洲国产精品精华液网站| 欧美韩日一区二区三区四区| 777亚洲妇女| 在线观看91精品国产入口| 成人午夜av影视| 经典三级在线一区| 亚洲不卡一区二区三区| 亚洲欧美激情一区二区| 国产午夜精品一区二区三区嫩草| 51精品国自产在线| 欧美性大战xxxxx久久久| 99久久精品免费看国产免费软件| 国产精品中文字幕日韩精品| 蜜桃av噜噜一区| 日韩精品一二三区| 五月激情六月综合| 亚洲成人av免费| 国产午夜一区二区三区| 国产精品白丝jk黑袜喷水| 日韩一区二区三区免费看| 欧美在线free| 色综合咪咪久久| 成年人国产精品| 懂色av一区二区三区免费看| 国产伦精品一区二区三区免费| 久久精品免费观看| 九九国产精品视频| 美女视频黄久久| 久久精品噜噜噜成人88aⅴ| 蜜桃传媒麻豆第一区在线观看| 日欧美一区二区| 视频一区二区三区入口| 日本vs亚洲vs韩国一区三区二区 | 亚洲h精品动漫在线观看| 亚洲精品亚洲人成人网| 亚洲人午夜精品天堂一二香蕉| 亚洲色图一区二区| 一区二区三区四区蜜桃| 一区二区三区不卡视频 | 午夜精品影院在线观看| 亚洲无人区一区| 五月婷婷综合网| 久久精品国产亚洲一区二区三区| 久久99精品久久久久久 | 成人午夜免费视频| av中文一区二区三区| 日本韩国精品一区二区在线观看| 91福利资源站| 欧美一区二区视频在线观看2020| 日韩精品一区二区三区四区视频 | 91在线播放网址| 色先锋久久av资源部| 欧美网站一区二区| 日韩精品最新网址| 国产欧美一区二区在线| 国产精品传媒视频| 午夜精品一区二区三区免费视频| 男女男精品视频| 国产传媒一区在线| 色婷婷国产精品综合在线观看| 欧美日韩一级片网站| 精品国精品国产| 亚洲视频小说图片| 日本午夜精品视频在线观看| 国产精品123区| 欧美中文字幕一区二区三区亚洲| 91精品国产免费久久综合| 国产欧美视频在线观看| 亚洲在线视频网站| 国产精品白丝jk黑袜喷水| 欧美综合在线视频| 久久综合精品国产一区二区三区| 亚洲三级理论片| 老司机免费视频一区二区| 91在线云播放| 久久久久国产精品麻豆| 亚洲国产成人高清精品| 国产99久久久精品| 欧美日韩精品欧美日韩精品| 中文字幕欧美三区| 青青草一区二区三区| 91久久人澡人人添人人爽欧美| 亚洲精品一区二区精华| 亚洲va欧美va国产va天堂影院| 国产成人鲁色资源国产91色综 | 欧美日韩中文精品| 国产欧美日韩综合| 日本不卡的三区四区五区| 99久久精品情趣| 久久久久久9999| 男女视频一区二区| 欧美视频一区二区在线观看| 国产精品久久久一本精品| 精品一二三四区| 宅男噜噜噜66一区二区66| 亚洲猫色日本管| 国产精品综合久久| 欧美成人一区二区三区片免费| 一区二区三区四区在线播放| 成人妖精视频yjsp地址| 久久综合九色综合欧美就去吻| 性做久久久久久免费观看欧美| 色综合久久88色综合天天6| 国产亚洲欧美激情| 狠狠色丁香婷婷综合| 日韩三级高清在线| 性欧美大战久久久久久久久| 色呦呦国产精品| 日本一区二区三区高清不卡| 国产成人在线视频播放| 日韩欧美久久久| 日产精品久久久久久久性色| 欧美日韩中文一区| 亚洲国产三级在线| 欧美日韩卡一卡二| 亚洲一区二区黄色| 在线日韩av片| 亚洲一区二区三区美女| 欧美在线不卡一区| 色综合久久中文字幕综合网| 国产精品麻豆99久久久久久| 成人午夜在线免费| 国产精品女主播av| 99免费精品视频| 亚洲精品亚洲人成人网| 欧美在线制服丝袜| 亚洲成av人片在www色猫咪| 欧美精品色综合| 青青青伊人色综合久久| 精品久久久久久无| 国产精品一级片| 中文字幕一区免费在线观看| 91婷婷韩国欧美一区二区| 亚洲美女免费在线| 欧美日韩国产123区| 另类小说色综合网站| 精品国产3级a| 成人国产精品免费观看动漫| 亚洲精品成人在线| 欧美日韩一级二级三级| 久久国产婷婷国产香蕉| 国产亚洲精品超碰| 91麻豆国产福利在线观看| 亚洲福利一二三区| 日韩一区二区影院| 国产精品99久久久久久宅男| 亚洲视频香蕉人妖| 欧美丰满嫩嫩电影| 国产一区二区福利视频| 亚洲黄色免费网站|