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

📄 worder.java

📁 用java写的一段PL0编译程序.用户可以在文本框内输入一段PL0代码
💻 JAVA
字号:
public class Worder
{
	//代码和扫描位置
	String code;
	int current;
	
	//关键字表
	String[] keywords=new String[13];
	public Worder()
	{
		init_keywords();  //初始化关键字表
	}
	public Worder(String code)
	{
		init_keywords();
		this.code=code;
		this.current=0;
	}
	void init_keywords()
	{
		keywords[0]="const";
		
		keywords[1]="var";
		
		keywords[2]="procedure";
		
		keywords[3]="if";
		
		keywords[4]="then";

		keywords[5]="while";

		keywords[6]="do";

		keywords[7]="begin";

		keywords[8]="end";

		keywords[9]="read";

		keywords[10]="write";
		
		keywords[11]="call";
		
		keywords[12]="ood";		
	}
	public void setText(String code)
	{
		this.code=code;
	}
	///////////////////实际干活的词法分析代码/////////////////////
	WordInfo next_word()
	{
		int temp=current;
		WordInfo w=this.get_a_word();
		this.current=temp;
		return w;
	}
	WordInfo get_a_word()
	{
		Glb.word_start=current;	
		char ch;	//当前分析到的字符
		while(true)
		{
			if(current==code.length())
			{
				Glb.word_err.name="已经没有可供分析的代码";
				return Glb.word_err;
			}
			ch=code.charAt(current);
			if(is_a_bound_sign(ch))
			{
				current++;
				continue;
			}
			if(is_a_letter(ch))
			{
				return build_a_word();
			}
			if(is_a_num(ch))
			{
				return build_a_num();
			}
			if(is_a_sign(ch))
				return(build_a_sign());
		}
			
	}
		
	 WordInfo build_a_word()
	{
		WordInfo w_info=new WordInfo();
		String word_token="";
		int length=0;
		for(;;)
		{
			if(current==code.length())
				break;
			char c=code.charAt(current);	//取得当前字符
			if(!is_a_letter(c)&&!is_a_num(c))	//遇到界符或其他符号,单词识别结束
				break;
			word_token+=c;				//合法字符,添加到word_token的末尾
			current++;					//指针右移
			length++;
		}
		//如果读到的是一个关键字
		if(is_a_keyword(word_token))
		{
			w_info.name=word_token;
			w_info.addr=-1;
			w_info.lever=-1;
			w_info.type=WordType.KEYWORD;
			w_info.val=-1;
			Glb.word_end=current;
			return w_info;
		}
		else
		{
			//读到的是标志符
			if(length<=10)
			{
				w_info.type=WordType.ID;
				w_info.name=word_token;
				Glb.word_end=current;
				return w_info;
			}
		}
		//标志符超长
		{
			Glb.word_err.name="发现超长的标志符";
			Glb.word_end=current;
			return Glb.word_err;
		}
	}
	WordInfo build_a_num()
	{
		WordInfo w_info=new WordInfo();
		String word_token="";
		boolean correct=true;
		for(;;)
		{
			if(current==code.length())
				break;
			char c=code.charAt(current);	//取得当前字符
			//必须是数字,不是数字则数字识别结束
			if(!is_a_num(c))
			{
				if(is_a_letter(c))
					correct=false;			
				else
					break;
			}
			//不错,是一个数字
			word_token+=c;
			current++;
		}
		w_info.name=word_token;
		w_info.type=WordType.NUM;
		
		if(correct)
			w_info.val=Integer.parseInt(word_token);
		else
		{	
			Glb.word_err.name="非法标志符:"+word_token;
			return Glb.word_err;
		}
		Glb.word_end=current;
		return w_info;
	}
	WordInfo build_a_sign()
	{
		WordInfo w_info=new WordInfo();
		String word_token="";
		char second=' ';
		char first=code.charAt(current);
		if(current!=code.length()-1)
			second=code.charAt(current+1);
		switch(first)
		{
			case '+':
				word_token="+";
				current++;	
				break;
			case '-':
				word_token="-";
				current++;	
				break;
			case '*':
				word_token="*";
				current++;	
				break;
			case '/':
				word_token="/";
				current++;	
				break;
			case '>':
				if(second=='=')
				{
					word_token=">=";
					current+=2;
				}
				else
				{
					word_token=">";
					current++;	
				}
				break;
			case '<':
				if(second=='=')
				{
					word_token="<=";
					current+=2;
				}
				else
				{
					word_token="<";
					current++;	
				}
				break;
			case ':':
				if(second=='=')
				{
					word_token=":=";
					current+=2;
				}
				else
				{
					Glb.word_err.name="发现不能识别的运算符";
					return Glb.word_err;
				}
				break;
			case '(':
				word_token="(";
				current++;
				break;
			case ')':
				word_token=")";
				current++;
				break;
			case '=':
				word_token="=";
				current++;
				break;
			case ',':
				word_token=",";
				current++;
				break;
			case '#':
				word_token="#";
				current++;
				break;
			case ';':
				word_token=";";
				current++;
				break;
			default:
				//错误!!!!不能识别的符号
				{
					Glb.word_err.name="发现不能识别的运算符";
					Glb.word_end=current;
					return Glb.word_err;
				}
				;
		}
		w_info.name=word_token;
		w_info.type=WordType.SIGN;
		Glb.word_end=current;
		return w_info;
	}
	boolean is_a_bound_sign(char c)
	{
		if(c=='\r')
			Glb.err_line++;
		if(c==32||c==13||c==10||c==9)
				return true;
			else
				return false;
	}
	boolean is_a_num(char c)
	{
		if(c>='0'&&c<='9')
				return true;
			else
				return false;
	}
	boolean is_a_letter(char c)
	{
		if(c>='a'&&c<='z'||c>='A'&&c<='Z'||c=='_')
				return true;
			else
				return false;
	}
	boolean is_a_sign(char c)
	{
		return true;
	}
	public boolean is_a_keyword(String word)
	{
		//!!!!!!take care of the length!!!!!!!!!!!
		int size=keywords.length;
		for(int i=0;i<size;i++)
		{
			//if(keywords[i].equals(word));
			if(word.equals(keywords[i]))
				return true;
		}
		return false;
	}
	}

⌨️ 快捷键说明

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