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

📄 grammaranalyse.java

📁 一个用java实现的词法和语法分析器
💻 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=" ";
		}
	}

}

⌨️ 快捷键说明

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