静态语义检查--java实现

本人博客内编译原理文章的配套资源jar包,包括词法分析,语法分析,中间代码生成,静态语义检查,代码解释执行以及抽象语法树的手动生成:https://download.csdn.net/download/as1072966956/10448935

转载请注明出处。

静态语义检查

Lab4Main.java

package sch.cauc.edu.token;

import edu.ustc.cs.compile.platform.interfaces.InterRepresent;

public class Lab4Main {
	public static void main(String[] args) throws Exception{		
        //String srcFileName = "test/expr401.txt"; 
        //String srcFileName = "test/expr402.txt"; 
        String srcFileName = "test/expr403.txt"; 
        //String srcFileName = "test/testown.txt"; 
        StaticCheck checker=new StaticCheck();
        
        InterRepresent ir=checker.doParse(srcFileName);
        ir.showIR(); 
		
             
    }
}

SymTable.java

package sch.cauc.edu.token;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Iterator;
import java.util.Map;
public class SymTable {
	/**
     * 符号表,采用下推链组织
     */
    private HashMap<String,LinkedList<Symbol>> blockSymTables;
  
    /**
     * BlockSymTable的构造函数.
     */
    public SymTable(){
        blockSymTables = new HashMap<String, LinkedList<Symbol>>();
   
    }
    /**
     * 
     * 将变量名和属性信息插入到符号表中。
     * 方法名:insert
     * 创建人:xrzhang 
     * 时间:2018年5月24日-下午12:26:47 
     * 邮件:jmzhang_15_cauc@163.com
     * @param name
     * @param type
     * @param level void
     * @exception 
     * @since  1.0.0
     */
   
    public void insert(String name,TokenType type,int level){
    	System.out.println("In insert();-----jmzhang-----");
        Kind kind=null;
       
        if ( type==TokenType.KEY_INT ){
        	kind=Kind.INT;
        	} else if(type==TokenType.KEY_BOOLEAN){
        		kind=Kind.BOOLEAN;
        }else{
        	System.out.println("error insert into symtable,found non supported variable type.");
        	System.out.println("name="+name);
        	System.out.println("type="+type);
        	System.out.println("level="+level);
        	System.exit(1);
        }
        System.out.println("kind:"+kind);
        LinkedList<Symbol>entry = blockSymTables.get(name);
        if(null==entry){
        	/**varable not declare before*/
        	entry = new LinkedList<Symbol>();
        }else if (entry.getFirst().getLevel()==level) {
			/*duplicate variable declaration in same level*/
        	System.out.println("error insert into symtable,found duplicate variables.");
        	System.out.println("name="+name);
        	System.out.println("type="+type);
        	System.out.println("level="+level);
        	System.exit(1);
		}
        Symbol symbol=new Symbol(name, kind, level);
        entry.addFirst(symbol);
        blockSymTables.put(name, entry);
    }
    
    /**
     * 
     * 查询符号表
     * 方法名:lookup
     * 创建人:xrzhang 
     * 时间:2018年5月24日-下午12:27:16 
     * 邮件:jmzhang_15_cauc@163.com
     * @param name
     * @param level
     * @return Symbol
     * @exception 
     * @since  1.0.0
     */
    public Symbol lookup(String name,int level) {
		LinkedList<Symbol>entry=blockSymTables.get(name);
		if(null!=entry){
			return entry.getFirst();
		}else {
			return null;
		}
		
	}
    /**
     * 
     * 删除符号表中的一项
     * 方法名:delete
     * 创建人:xrzhang 
     * 时间:2018年5月24日-下午12:27:30 
     * 邮件:jmzhang_15_cauc@163.com
     * @param name void
     * @exception 
     * @since  1.0.0
     */
    public void delete(String name) {
		LinkedList<Symbol> entry=blockSymTables.get(name);
		if(null!=entry){
			entry.removeFirst();
			if (entry.isEmpty()) {
				blockSymTables.remove(name);
			}
		}
	}
    
    public void display() {
		if (blockSymTables.isEmpty()) {
			System.out.println("symTables is enpty");
			return;
		}
		String ret="";
		for(String key:blockSymTables.keySet()){
			LinkedList<Symbol>list=blockSymTables.get(key);
			for(int i=0;i<list.size();i++){
				Symbol symbol=list.get(i);
				ret+=symbol.toString()+"\n";
			}
		}
		System.out.println(ret);
	}
    class Symbol{
    	private int level;
    	private Kind kind;
    	private String name="";
    	public Symbol(String name,Kind kind,int level){
    		this.name=name;
    		this.kind=kind;
    		this.level=level;
    	}
    	public String getName() {
			return name;
		}
    	public Kind getkind() {
			return kind;
		}
    	public int getLevel() {
			return level;
		}
    	public String toString() {
			String ret ="";
			ret+="name="+name;
			ret+=",kind="+kind;
			ret+=",level="+level;
			return ret;
		}
    }
    
    enum Kind{
    	INT,
    	BOOLEAN
    }
}    
    

StaticCheck.java


package sch.cauc.edu.token;
import java.util.LinkedList;






import org.eclipse.jdt.core.dom.*;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;


import edu.ustc.cs.compile.platform.interfaces.InterRepresent;
import edu.ustc.cs.compile.util.ir.HIRPack;
import sch.cauc.edu.token.SymTable.Symbol;
/**
 * 
 * 
 * StaticCheck
 * 创建人:xrzhang 
 * 时间:2018年5月31日-上午9:00:11 
 * @version 1.0.0
 *
 */
public class StaticCheck {
	/*抽象语法树的根节点*/
	private AST ast=null;
	private BlockLexer lexer=null;
	private Token lookAhead=null;
	/*进行语义检查的符号表*/
	private SymTable syTable=new SymTable();


	private int blockLevel=0; 
	
	 public StaticCheck() {
		ast = AST.newAST(AST.JLS3);
	}
	 public InterRepresent doParse(String filePath){
		 lexer=new BlockLexer(filePath);
		 Block mainBody = this.parse();
		 
		 HIRPack ir = new HIRPack();
		 ir.setIR(mainBody);
		 return ir;
	 }
	 public Token matchToken(TokenType type,String functionName){
		
		 if(lookAhead.getType()!=type){
			 parsingError(type.toString(),functionName);
		 }
		 Token matchedSymbol = lookAhead;
		 lookAhead = lexer.nextToken();
		 return matchedSymbol;
		 
	 }
	 public void parsingError(String types,String functionName){
			System.out.println("Parsing Error! in"+functionName);
			System.out.println("encounter "+lookAhead.getLexeme());
			System.out.println("at line "+lookAhead.getLine()+",column "+lookAhead.getColumn());
			System.out.println("while expecting "+types);
			System.exit(1);
		}
	 
	 /**
		 * 调用开始符号对应的方法,进行语法分析
	 * 方法名:parse
	 * 创建人:xrzhang 
	 * 时间:2018年5月16日-上午10:27:14 
	 * 邮件:jmzhang_15_cauc@163.com void
	 * @exception 
	 * @since  1.0.0
	 */
	public Block parse() {
		System.out.println("In parse();-----jmzhang-----");
		lookAhead=lexer.nextToken();
		Block mainBody=simpleblock();
		System.out.println("Parsing Success!");
		return mainBody;
	}
	/**
		 * simpleblock = LBRACE sequence RBRACE
	 * B->{S}
	 * 方法名:simpleblock
	 * 创建人:xrzhang 
	 * 时间:2018年5月19日-下午6:59:57 
	 * 邮件:jmzhang_15_cauc@163.com void
	 * @exception 
	 * @since  1.0.0
	 */
	public  Block simpleblock() {
		System.out.println("In simpleblock();-----jmzhang-----");
		if(lookAhead.getType()==TokenType.LBRACKET){
			matchToken(TokenType.LBRACKET, "simpleblock");
			System.out.println("***********{*********");
			this.blockLevel++;
			LinkedList seq=sequence();
			if (seq==null) {
				seq=new LinkedList();
				}
			matchToken(TokenType.RBRACKET, "simpleblock");
			System.out.println("***********}*********");
			this.blockLevel--;
			Block mainBody=ast.newBlock();
			if (null!=seq) {
				for(int i=0;i<seq.size();i++){
					mainBody.statements().add(seq.get(i));
				}
			}
			return mainBody;
		}else{
			parsingError(TokenType.LBRACKET.toString(), "simpleblock");
			return null;
		}
	}
	/**
		 * sequence=assognmentStatement sequence |
	 * 			ifStatement sequence |
	 * 			whileStatement sequence |
	 * 			epsilon
	 * S->AS | IS |WS | ε
	 * 方法名:Sequence
	 * 创建人:xrzhang 
	 * 时间:2018年5月16日-下午8:54:23 
	 * 邮件:jmzhang_15_cauc@163.com void
	 * @exception 
	 * @since  1.0.0
	 */
	private LinkedList sequence() {
		System.out.println("In Sequence();-----jmzhang-----");
		if(lookAhead.getType()==TokenType.KEY_INT
				||lookAhead.getType()==TokenType.KEY_BOOLEAN){
			
			declareStaement();
			
			LinkedList seq=sequence();
			if (seq==null) {
				seq=new LinkedList();
				}
			return seq;
		}else if(lookAhead.getType()==TokenType.IDENTIFIER){
			ExpressionStatement es=assignmentStatement();
			LinkedList seq=sequence();
			if (seq==null) {
				seq=new LinkedList();
				}
			seq.addFirst(es);
			return seq;
		}else if (lookAhead.getType()==TokenType.KEY_IF) {
			
			IfStatement es=ifStatement();
			LinkedList seq=sequence();
			if (seq==null) {
				seq=new LinkedList();
				}
			seq.addFirst(es);
			return seq;
		}else if (lookAhead.getType()==TokenType.KEY_WHILE) {
			System.out.println("In Sequence();-----jmzhang-----WHILE");
			WhileStatement es=whileStatement();
			LinkedList seq=sequence();
			if (seq==null) {
				seq=new LinkedList();
				}
			seq.addFirst(es);
			return seq;
		}else if (lookAhead.getType()==TokenType.RBRACKET) {
			//match epslon
			return null;
		}else {
			String errorTypes=TokenType.IDENTIFIER.toString()+","+TokenType.RBRACKET.toString();
			parsingError(errorTypes, "sequence");
			return null;
		}
	}
	/**
	
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花月诗人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值