本人博客内编译原理文章的配套资源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;
}
}
/**
*