www.pudn.com > grammaranalyse.rar > GrammarAnalyse.java


package jywhu; 
 
public class GrammarAnalyse { 
	private AccAnalyse accAnalyse; 
	private Token token; 
	private String s=" "; 
	public GrammarAnalyse(AccAnalyse accAnalyse,Token token){ 
		this.accAnalyse=accAnalyse; 
		this.token=token; 
	} 
	//输出错误信息 
	public void syntaxError(String message){ 
		System.out.print("Syntax error at line "+token.getLineno()+":"+message); 
	} 
	public void match(String s){ 
		if((token.getTokenType()).equals(s)){ 
			if(accAnalyse.isOut()){ 
				//System.out.println("right"); 
			token=accAnalyse.getToken(); 
			}else{ 
				token=new Token("fileover","fileover,need ;",token.getLineno());} 
		}else{ 
			syntaxError("unexpected token ->"); 
			printToken(token.getToken()); 
			if(accAnalyse.isOut()) 
				token=accAnalyse.getToken(); 
			} 
		} 
	 
	public void printToken(String token){ 
		System.out.println(token); 
	} 
	//开始语法分析 
	//语句序列节点 
	public TreeNode stmtSequence(){ 
		TreeNode t=statement(); 
		TreeNode p=t; 
		while(!token.getTokenType().equals("else")&&(!token.getTokenType().equals("leftbracket")) 
				&&(!token.getTokenType().equals("rightbracket"))&&(!token.getTokenType().equals("bleftbracket"))&& 
				(!token.getTokenType().equals("brightbracket"))&&(!token.getTokenType().equals("mrightbracket"))&& 
				(!token.getTokenType().equals("mleftbracket"))){ 
			 
			//System.out.println(token.getTokenType()); 
			//System.out.println(accAnalyse.isOut()); 
			match("semicolon"); 
			if(token.getTokenType().equals("fileover")){ 
				break; 
			}else{ 
				TreeNode q; 
				q=statement(); 
				if(q!=null){ 
					if(t==null) 
						t=p=q; 
					else{ 
						p.sibling=q; 
						p=q; 
					} 
				} 
			} 
			 
			} 
		return t; 
	} 
	//语句节点 
	public TreeNode statement(){ 
		TreeNode t=null; 
		if(token.getTokenType().equals("if")){ 
			t=if_stmt(); 
		}else if(token.getTokenType().equals("while")){ 
			t=while_stmt(); 
		}else if(token.getTokenType().equals("id")){ 
			t=assign_stmt(); 
		}else if(token.getTokenType().equals("read")){ 
			t=read_stmt(); 
		}else if(token.getTokenType().equals("write")){ 
			t=write_stmt(); 
		}else if(token.getTokenType().equals("int")||token.getTokenType().equals("real")){ 
			t=declare_stmt(); 
		} 
		return t; 
		} 
	//if语句节点 
	public TreeNode if_stmt(){ 
		TreeNode t=new TreeNode(); 
		t.kind="IfK"; 
		match("if"); 
		match("leftbracket"); 
		t.leftChild=exp(); 
		match("rightbracket"); 
		match("bleftbracket"); 
		t.midChild=stmtSequence(); 
		match("brightbracket"); 
		if(token.getTokenType().equals("else")){ 
			match("else"); 
			match("bleftbracket"); 
			t.rightChild=stmtSequence();  
			match("brightbracket"); 
		} 
		return t; 
		 
	} 
	//while语句节点 
	public TreeNode while_stmt(){ 
		TreeNode t=new TreeNode(); 
		t.kind="WhileK"; 
		match("while"); 
		match("leftbracket"); 
		t.leftChild=exp(); 
		match("rightbracket"); 
		match("bleftbracket"); 
		t.midChild=stmtSequence(); 
		match("brightbracket"); 
		return t; 
		} 
	//赋值语句节点 
	public TreeNode assign_stmt(){ 
		TreeNode t=new TreeNode(); 
		t.kind="AssignK"; 
		if((t!=null)&&(token.getTokenType().equals("id"))) 
			t.attr=token.getToken(); 
		match("id"); 
		//为数组赋值 
		 if(token.getTokenType().equals("mleftbracket")){ 
			 match("mleftbracket"); 
			t.attr=t.attr+"[]"; 
			 TreeNode q=exp(); 
			 if(q!=null){ 
			 t.leftChild=q;} 
			 match("mrightbracket"); 
			 } 
		match("equalop"); 
		t.rightChild=exp(); 
		return t; 
	} 
	//read语句节点 
	public TreeNode read_stmt(){ 
		TreeNode t=new TreeNode(); 
		t.kind="ReadK"; 
		match("read"); 
		if((t!=null)&&(token.getTokenType().equals("id"))) 
			t.attr=token.getToken(); 
		match("id"); 
		return t; 
			 
	} 
	//write语句节点 
	public TreeNode write_stmt(){ 
		TreeNode t=new TreeNode(); 
		t.kind="WriteK"; 
		match("write"); 
		if(t!=null) 
			t.leftChild=exp(); 
		return t; 
	} 
	//声明语句节点 
	public TreeNode declare_stmt(){ 
		TreeNode t=new TreeNode(); 
		if(token.getTokenType().equals("int")){ 
			t.kind="intDeclareK"; 
			match("int");} 
		else if(token.getTokenType().equals("real")){ 
			t.kind="realDeclareK"; 
			match("real");} 
		if((t!=null)&&(token.getTokenType().equals("id"))) 
			t.attr=token.getToken(); 
		match("id"); 
		//数组声明 
		 if(token.getTokenType().equals("mleftbracket")){ 
		 match("mleftbracket"); 
		 t.attr=t.attr+"["+token.getToken()+"]"; 
		 match("intNum"); 
		 match("mrightbracket"); 
		 } 
		return t; 
	} 
	//表达式节点 
	public TreeNode exp(){ 
		TreeNode t=simple_exp(); 
		if(token.getTokenType().equals("relop")){ 
			TreeNode p=new TreeNode(); 
			p.kind="OpK"; 
			if(p!=null){ 
				p.leftChild=t; 
				p.attr=token.getToken(); 
				t=p; 
			} 
			match("relop"); 
			if(t!=null){ 
				t.midChild=simple_exp();} 
		} 
		return t; 
	} 
	//简单表达式节点 
	public TreeNode simple_exp(){ 
		TreeNode t=term(); 
		while(token.getTokenType().equals("addop")){ 
			TreeNode p=new TreeNode(); 
			p.kind="OpK"; 
			if(p!=null){ 
				p.leftChild=t; 
				p.attr=token.getToken(); 
				t=p; 
				match("addop"); 
				t.midChild=term(); 
			} 
		} 
		return t; 
	} 
	public TreeNode term(){ 
		TreeNode t=factor(); 
		while(token.getTokenType().equals("mulop")){ 
			TreeNode p=new TreeNode(); 
			p.kind="OpK"; 
			if(p!=null){ 
				p.leftChild=t; 
				p.attr=token.getToken(); 
				t=p; 
				match("mulop"); 
				t.midChild=factor(); 
		} 
	} 
		return t; 
	} 
	//表达式因子节点 
	public TreeNode factor(){ 
		TreeNode t=new TreeNode(); 
		if(token.getTokenType().equals("intNum")){ 
			t.kind="NumK"; 
			if((t!=null)&&token.getTokenType().equals("intNum")){ 
				t.attr=token.getToken(); 
			} 
			match("intNum"); 
		}else if(token.getTokenType().equals("realNum")){ 
			t.kind="NumK"; 
			if((t!=null)&&token.getTokenType().equals("realNum")){ 
				t.attr=token.getToken(); 
			} 
			match("realNum"); 
		}else if(token.getTokenType().equals("id")){ 
			t.kind="IdK"; 
			if((t!=null)&&token.getTokenType().equals("id")){ 
				t.attr=token.getToken(); 
			} 
			match("id"); 
			//数组元素作为表达式因子 
			if(token.getTokenType().equals("mleftbracket")){ 
				 match("mleftbracket"); 
				 t.attr=t.attr+"[]"; 
				 TreeNode q=exp(); 
				 if(q!=null){ 
				 t.leftChild=q;} 
				 match("mrightbracket"); 
				 } 
		}else if(token.getTokenType().equals("leftbracket")){ 
			match("leftbracket"); 
			t=exp(); 
			match("rightbracket"); 
		}else{ 
			syntaxError("unexpected token ->"); 
			printToken(token.getToken()); 
			token=accAnalyse.getToken(); 
		} 
		return t; 
	} 
	public void printSpace(){ 
		 
	} 
	//将抽象语法树打印输出 
	public void printTree(TreeNode t){ 
		 
		while(t!=null){ 
			s=s+" "; 
			System.out.print(s); 
			if(t.kind.equals("IfK")){ 
				System.out.println("if"); 
			}else if(t.kind.equals("WhileK")){ 
				System.out.println("while"); 
			}else if(t.kind.equals("AssignK")){ 
				System.out.println("assign to: "+t.attr); 
			}else if(t.kind.equals("ReadK")){ 
				System.out.println("read: "+t.attr); 
			}else if(t.kind.equals("WriteK")){ 
				System.out.println("write"); 
			}else if(t.kind.equals("intDeclareK")){ 
				System.out.println("int: "+t.attr); 
			}else if(t.kind.equals("realDeclareK")){ 
				System.out.println("real: "+t.attr); 
			}else if(t.kind.equals("OpK")){ 
				System.out.println("op: "+t.attr); 
			}else if(t.kind.equals("NumK")){ 
				System.out.println("num: "+t.attr); 
			}else if(t.kind.equals("IdK")){ 
				System.out.println("id: "+t.attr); 
			}else{ 
				System.out.println("Unknown token"); 
			} 
			if(t.leftChild!=null) 
				//System.out.print(s); 
				printTree(t.leftChild); 
			if(t.midChild!=null) 
				//System.out.print(s); 
				printTree(t.midChild); 
			if(t.rightChild!=null) 
				//System.out.print(s); 
				printTree(t.rightChild); 
			t=t.sibling; 
			s=" "; 
		} 
	} 
 
}