资源简介

参照C语言版本,用Java写的语义分析程序,采用递归下降分析法,对算术表达式、赋值语句进行语义分析并生成四元式序列。在实验三递归下降分析法的基础上改的。 用Eclipse做的,有运行结果截图。

资源截图

代码片段和文件信息

package org.test;

import java.util.ArrayList;

import org.test.WordAnalyzer;

public class SemanticAnalyzer {
WordAnalyzer wa = new WordAnalyzer();
private int tempIndex = 1;
private boolean isError = false;

class Quadruple {//用内部类表示四元式
String result;
String ag1;
String op;
String ag2;

public Quadruple(String result String ag1) {
this.result = result;
this.ag1 = ag1;
this.op = ““;
this.ag2 = ““;
}

public Quadruple(String result String ag1 String op String ag2) {
this.result = result;
this.ag1 = ag1;
this.op = op;
this.ag2 = ag2;
}
}

ArrayList quadList = new ArrayList();//四元式序列

public String newtemp() {//生成临时变量
return “t“ + tempIndex++;
}

public int lrparser() {
int schain = 0;
if (wa.syn == 1) {
wa.scaner();
schain = yujuchuan();
if (wa.syn == 6) { // “end”
wa.scaner();
if (wa.syn == 0 && isError == false) // “end”之后是“#”并且没有出错,则分析成功
System.out.println(“语义分析成功!“);
} else {
if (isError == false) // 之前分析都成功,但没有“end”
System.out.println(“语义分析出错!缺少“end”“);
isError = true;
}
} else {
System.out.println(“语义分析出错!缺少“begin”“);
isError = true;
}
return (schain);
}

public int yujuchuan() {//分析语句串
int schain = 0;
schain = statement(); // 分析第一条语句
while (wa.syn == 26) {// 为“;”时,分析下一条语句
wa.scaner();
if (wa.syn == 6)
break;
schain = statement();
}
return (schain);
}

public int statement() {//分析语句
int schain=0;
String txex;
if (wa.syn == 10) { //语句的开始是标识符,读下一个单词符号
tx = wa.token.toString();
wa.scaner();
if (wa.syn == 18) { //为“:=” 赋值时,分析表达式
wa.scaner();
ex = expression();
quadList.add(new Quadruple(tx ex));
schain = 0;
} else {
System.out.println(“语义分析出错!表达式错误“);
isError = true;
}
} else {
System.out.println(“语义分析出错!语句错误“);
isError = true;
}
return schain;
}

public String expression() {//分析表达式
String txe1e2op;
e1 = term(); //分析第一项
while (wa.syn == 13 || wa.syn == 14) { // 为“+”或“-”时,分析下一项
op = wa.token.toString();
wa.scaner();
e2 = term();
tx = newtemp();
quadList.add(new Quadruple(tx e1 op e2));
e1 = tx;
}
return(e1);
}

public String term() {//分析项
String txe1e2op;
e1 = factor(); //分析第一个因子
while (wa.syn == 15 || wa.syn == 16) { //为“*”或“/”时,分析下一个因子
op = wa.token.toString();
wa.scaner();
e2 = factor();
tx = newtemp();
quadList.add(new Quadruple(tx e1 op e2));
e1 = tx;
}
return(e1);
}

public String factor() {//分析因子
String fx = ““;
if (wa.syn == 10) { //为标识符时,这一项分析结束
fx = wa.token.toString();
wa.scaner();
} else if( wa.syn == 11) {//为整数时,这一项分析结束
fx += wa.sum;
wa.scaner();
} else if (wa.syn == 27) { //为“(”时,分析“(”里的表达式
wa.scaner();
fx = expression();
if (wa.syn == 28) //表达式分析结束且下一个单词符号为“)”时,这一项分析结束
wa.scan

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件         301  2017-12-31 16:59  .classpath
     文件         398  2017-12-31 16:59  .project
     目录           0  2017-12-31 16:59  .settings\
     文件         598  2017-12-31 16:59  .settings\org.eclipse.jdt.core.prefs
     目录           0  2017-12-31 16:59  src\
     目录           0  2017-12-25 10:08  src\org\
     目录           0  2017-12-25 10:08  src\org\test\
     文件        4353  2018-01-20 22:45  src\org\test\SemanticAnalyzer.java
     文件        2289  2017-12-25 09:59  src\org\test\WordAnalyzer.java
     文件        8726  2017-12-25 22:27  实验结果.PNG

评论

共有 条评论