中北大学
软件大型实验周
说 明 书
学生姓名:
梁喜梅
学 号:
0
学生姓名:
刘毅敏
学 号:
0
学生姓名:
郑超
学 号:java编程基础实践指导张焕生
0
学生姓名:
张新亮
学 号:
0
学生姓名:
滕明刚
学 号:
0
学 院:
电子与计算机科学技术
专 业:
计算机科学与技术
题 目:
简单高级语言编译器的设计
指导教师: 师志斌 职称:
2010年 12 月 24 日
1.设计目的
学生能够设计并实现简单高级语言编译器,掌握编译器的设计与实现方法。通过课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,提高自己的编程能力,培养好的程序设计风格。同时通过java可视化编程语言的应用,对于程序的编译思想有了进一步的认识,具备初步的Windows环境下的编程思想。
2.设计内容
①能够简单编译链接源程序。
②能够实现词法分析。简单识别关键词、标识符、运算符和界符,并打印输出词法分析结果。
③能够实现语法分析。能够实现对if-else语句、while语句、赋值语句与其他简单语句分析,并打印输出语法分析结果。
④能够实现语义分析。能够实现对if-else语句,while语句,赋值语句分析,实现四元式转化,并打印输出语义分析结果。
3.开发和运行环境介绍
环境:Eclipse
Java分为三个体系JavaSE(Java2 Platform Standard Edition,java平台标准版),JavaEE(Java 2 Platform,Enterprise Edition,java平台企业版),JavaME(Java 2 Platform Micro Edition,java平台微型版)。Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。Java的开源项目有struts、hibernate、spring等。
我们所使用的是eclipse开发环境。Eclipse是一个完整的开发环境,由Project Management Committee(PMC)管理,分成3个子项目:平台(Platform)、开发工具箱和外挂开发环境(Plug-in-Development Environment(PDE))。这些子项目以细分成更多的子项目。开发Java程序用的是Eclipse附随的JDT(Java Development Toolkit)外挂程序,JDT子项目包括三个组件:User Interface(UI)、核心(Core)及排错(Debug)。
Eclipse平台提供多种软件开发工具的整合机制,这些工具是Eclipse的外挂程序。第一次执行Eclipse时,要求在Eclipse目录下建一个Workspace目录,根据预设,所有的工作结果都存在该目录下。
Eclipse平台有数种组件组成:平台核心(platform kernel)、工作台(workbench)、工作区(workspace)、团队组件(team component),以及帮助组件(help)。
Eclipse在最高层级使用,并在项目之下使用文件夹。项目对应workspace目录下的子目录,文件夹对应项目目录下的子目录。
平台核心的任务是让平台上的每个组件能正常运行,加载所需的外挂程序。当启动Eclipse时,先执行的就是平台核心,再由它加载其他外挂程序。
工作区负责管理使用者的资源,这些资源被组织成一个项目,摆在最上层。每个项目对应到Workspace目录下的一个子目录。
工作台是仅次于平台核心的最基本组件,启动Eclipse后出现的主窗口就是工作台的界面。工作台的工作很简单,只是负责找到项目与资源,发现不能做的工作,就转交给其它组件。
工作台有许多不同种类的内部窗口,称之为视图。每个视图以不同的视野看项目。例如,Outline视图看项目中Java类的概略状况,Navigator视图导览项目。视图支持编辑器,提供工作台中信息的可视化表示。要启动在附加卷标的视图,只要按一下标签就行。
视图有两个菜单,一个是用鼠标右键点击视图卷标存取的菜单,它可以利用类似工作台相关的菜单的相同方式来操作视图。另一个菜单为视图下拉菜单,存取方式是点击向下箭头。视图下拉菜单所包含的作业通常会用到视图的全部内容。
语言:Java
4.需求分析
4.1功能需求
①编译源程序模块:编写一个简单C语言程序当做测试程序。
②词法分析模块:建立字符表,能够识别简单关键字,如:if、else、main、int、void、float、double、char、while等。能够识别界符,如:“{”、“(”、“)”、“}”、“;”等。能够识别简单运算符,如:“<”、”>”、“=”、“+”、“-”,“*”、“/”以及标识符。将词法分析得出的字符流保存在输入流集合中和备份集合中供语法分析和语义分析使用。最后打印输出词法分析的结果。
③语法分析模块:通过词法分析得出的输入流集合中,根据字符流,能够对简单if-else语句、while语句和赋值语句做出语法分析。利用分析栈,与输入流中的字符进行匹配进而规约程序。在if-else语句,while语句,赋值语句中,利用文法规则,规约程序,并能检查程序出错。
④语义分析模块:在语法分析的基础上,利用词法分析得出的备份集合中,根据字符流,定义一个四元式类,包括符号、操作符、与中间运算节点,能够对简单控制语句和表达式实现四元式表示。
4.2 系统功能图
图1 系统功能图
4.3 语法树
P P P P P
int P void P main { P { Q K } ( ) P
图2 P的语法树
Q
U V
图3 Q的语法树
U U U U
int double char float
图4 U的语法树
V
i N
图5 V的语法树
N N N
; N = E N , V
图6 v的语法树
K K K K K K K
图7 K的语法树
If K while K else K { K } K ( K ) K V K Q K
图8 E的语法树
G G G G
> E < E + E - E
图9 G的语法树
T
F M
图10 T的语法树
M
E
图11 M的语法树
F F F
i ( E ) = E
图12 F的语法树
T G
E
5.系统设计与实现
5.1 模块功能描述
词法分析:能够将程序中的内容按单词流输出,并判断其属性。并将单词流存入输入流集合以及备份集合中。供语法分析及语义分析使用。(刘毅敏)
语法分析:能够将词法分析输出的单词流进行简单语法分析。并构造LL1表。并能够判断简单语法错误。(if-else语句、while语句-----郑超 赋值语句、其他简单语句------滕明刚)
语义分析:将简单if-else语句、while语句以及赋值语句实现四元式表示。(赋值语句-----梁喜梅 if-else语句、while语句----张新亮)
5.2 软件实现
⒈建立测试源程序:
int main()
{
int a=10;
int c,d,b=10;
int x,y;
if(a>c)
{
a=c+d+y;
a=b;
x=y-b;
}
else
{
a=c;
}
while(a>c)
{
a=c;
}
}
$
⒉建立符号表类:
package org.zhang;
public class Table {
String Type;
String Name;
Object Val;
public Table(String type,String name,Object val){
Type = type;
Name = name;
Val = val;
}
}
⒊建立主程序:
package org.zhang;
import java.util.Vector;
import java.io.*;
class SYS {
String fuhao;
String op1;
String op2;
Node p1;
}
class Node {
String result;
int Address_Num;
}
class a {
static Vector<String> shuruliu = new Vector<String>();// 输入流集合
static Vector<String> beifen = new Vector<String>();// 备份集合
static Vector<String> fenxizhan = new Vector<String>();// 分析栈集合
static Vector<String> Key = new Vector<String>();// 保留字集合
static Vector<String>
jiefu = new Vector<String>();// 界符集合
static Vector<String> yusuanfu = new Vector<String>();// 运算符集合
static Vector<Object> result = new Vector<Object>();
int while_endsign = 0;
static int count = 0;
static int count_sign = 0;
int if_oversign = 0;
int else_beginsign = 0;
int while_beginsign = 10;
static SYS siyuanshi[] = new SYS[40];
{
a.yusuanfu.add("+");
a.yusuanfu.add("-");
a.yusuanfu.add("*");
a.yusuanfu.add("/");
a.yusuanfu.add(">");
a.yusuanfu.add("<");
a.yusuanfu.add("=");
a.yusuanfu.add("%");
a.jiefu.add("(");
a.jiefu.add(")");
a.jiefu.add("{");
a.jiefu.add("}");
a.jiefu.add(";");
a.jiefu.add(",");
a.Key.add("else");
a.Key.add("int");
a.Key.add("if");
a.Key.add("while");
a.Key.add("char");
a.Key.add("float");
a.Key.add("double");
a.Key.add("main");
a.Key.add("i");
}
public static void main(String[] args) throws Exception {
a b = new a();
for (int k = 0; k < 40; k++) {
a.siyuanshi[k] = new SYS();//四元式四十个
siyuanshi[k].p1 = new Node();//
}
System.out.println("输入文件名:");
String filename = null;
BufferedReader brConsole = new BufferedReader(new InputStreamReader(
System.in));
try {
filename = brConsole.readLine();
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader brFile = null;
try {
brFile = new BufferedReader(new FileReader(filename));
} catch (FileNotFoundException e) {
System.out.println("文件未找到!");
}
String str = "";
while ((str = brFile.readLine()) != null) {
Analyse(str.trim());
}
CifaAnalyse();// 调用词法分析器
b.LL1();// 调用LL1文法
b.siyuanshi();
System.out.println("");
b.printSiyuanshi();
}
private void printSiyuanshi() {
System.out.println("四元式结果如下:");
System.out.println();
int i = 0;// siyuan();
System.out.println("序号 "+"op,"+"a1,"+"a2,"+"result");
for (i = 0; i < count; i++) {
if ((siyuanshi[i].fuhao).equals("j")) {
System.out.println(i + " (" + siyuanshi[i].fuhao + ","
+ siyuanshi[i].op1 + "," + siyuanshi[i].op2 + ","
+ siyuanshi[i].p1.Address_Num + ")");
} else if ((siyuanshi[i].fuhao).equals(">"))
System.out.println(i + " (" + siyuanshi[i].fuhao + ","
+ siyuanshi[i].op1 + "," + siyuanshi[i].op2 + ","
+ siyuanshi[i].p1.Address_Num + ")");
else if ((siyuanshi[i].fuhao).equals("<"))
System.out.println(i + " (" + siyuanshi[i].fuhao + ","
+ siyuanshi[i].op1 + "," + siyuanshi[i].op2 + ","
+ siyuanshi[i].p1.Address_Num + ")");
else
System.out.println(i + " (" + siyuanshi[i].fuhao + ","
+ siyuanshi[i].op1 + "," + siyuanshi[i].op2 + ","
+ siyuanshi[i].p1.result + ")");
}
}
private static void CifaAnalyse() {
for (int i = 0; i < a.shuruliu.size(); i++) {
if (a.Key.contains(a.shuruliu.get(i))) {
System.out.println("Key:" + a.shuruliu.get(i));
continue;
} else if (a.yusuanfu.contains(a.shuruliu.get(i))) {
System.out.println("运算符:" + a.shuruliu.get(i));
continue;
} else if (a.jiefu.contains(a.shuruliu.get(i))) {
System.out.println("界符:" + a.shuruliu.get(i));
continue;
} else if (isNum(a.shuruliu.get(i))) {
System.out.println("数字:" + a.shuruliu.get(i));
} else {
System.out.println("标识符:" + a.shuruliu.get(i));
}
}
}
private static boolean isNum(String string) {
int i;
for (i = 0; i < string.length(); i++) {
if (Character.isDigit(string.charAt(i))) {
continue;
} else {
break;
}
}
if (i == string.length()) {
return true;
}
return false;
}
private static void Analyse(String str) {
int wordStart = 0;// 当前单词的开始索引
int wordEnd = 0;// 当前单词的结束索引
int index = 0;// 该行的索引
String word = "";
boolean sign = false;
while (index < str.length()) {
if (Character.isLetter(str.charAt(index))
|| str.charAt(index) == '_') {// 判断该字符是否是字母
sign = true;
wordStart = index;
index++;
while (index < str.length()
&& (Character.isLetter(str.charAt(index))
|| Character.isDigit(str.charAt(index)) || str
.charAt(index) == '_')) {
index++;
}
wordEnd = index;
word = str.substring(wordStart, wordEnd);
index--;
} else if (Character.isDigit(str.charAt(index))) {// 首字符不是字母,判断是不是数字
sign = true;
wordStart = index;
index++;
while (index < str.length()
&& Character.isDigit(str.charAt(index))) {
index++;
}
wordEnd = index;
word = str.substring(wordStart, wordEnd);
index--;
} else {// 首字符不是数字也不是下划线
char ch = str.charAt(index);// 取到当前字符
switch (ch) {
case ' ':
case ' ':
case ' ':
case ' ':
word = null;
break;// 空白字符直接过滤
case '[':
case ']':
case '(':
case ')':
case '{':
case '}':
case ',':
case '"':
case '.':
case ';':
case '+':
case '-':
case '*':
case '/':
case '!':
case '=':
case '%':
case '>':
case '<':
case '#':
word = String.valueOf(ch);
break;
default:
word = "$";
break;
}
}
if (word == null) {
index++;
continue;
}
a.beifen.add(word);
a.shuruliu.add(word);
index++;
}
}
// //标识符和保留字的判断函数
public boolean is_baoliuzi(String name) {
int length = name.length();
boolean q = false;
for (int i = 0; i < length; i++) {
// String n = name.substring(i, i + 1);
String n = String.valueOf(name.charAt(i));
if ((n.compareToIgnoreCase("a") >= 0)
&& (n.compareToIgnoreCase("z") <= 0)) {// 如果n是字符的话
i++;// i++;
if (i < length) {//
n = name.substring(i, i + 1);// n等于下一个字符
}
while ((n.compareToIgnoreCase("a") >= 0)
&& (n.compareToIgnoreCase("z") <= 0)) {// 如果n依然为字符
i++;
if (i >= length) {// 循环到单词流结束为止
q = true;// 把q设置为true
break;
}
if (i < length) {
n = name.substring(i, i + 1);// 索引增加
}
}
if (i == length || n.equals(",") || n.equals(";")|| n.equals("=")
||n.equals("(")||n.equals(")")||n.equals("")|| n.equals("*") || n.equals("/")
|| n.equals("+") || n.equals("-")) {//到达该单词的末尾或遇到一些界符和运算符
q = true;
}
} else {
return false;
}
}
return q;
}
public void LL1() {
fenxizhan.add("P");
System.out.println(fenxizhan.get(0));
fenxizhan.add("$");
System.out.println(fenxizhan.get(1));
String ls = null;
int i = 0, sign = 0, hang = 0;
boolean t = true, judge = false, isnum = false;
while (fenxizhan.size() > 0) {
String s1 = (String) fenxizhan.elementAt(0);
String s2 = (String) shuruliu.elementAt(0);
if (is_baoliuzi(s2)) {
judge = true;
}
if (isNum(s2)) {
isnum = true;
}
if (s1.equals("P"))
i = 0;
if (s1.equals("Q"))
i = 1;
if (s1.equals("U"))
i = 2;
if (s1.equals("V"))
i = 3;
if (s1.equals("N"))
i = 4;
if (s1.equals("K"))
i = 5;
if (s1.equals("E"))
i = 6;
if (s1.equals("G"))
i = 7;
if (s1.equals("T"))
i = 8;
if (s1.equals("M"))
i = 9;
if (s1.equals("F"))
i = 10;
if ((shuruliu.elementAt(0).equals("$"))
&& (fenxizhan.elementAt(0).equals("$"))) {
System.out.println();
fenxizhan.removeElementAt(0);
shuruliu.removeElementAt(0);
System.out.println("语法分析通过!");
break;
}
if(jiefu.contains(s1)||Key.contains(s1)||yusuanfu.contains(s1))
// 终极符时的处理
{
if (jiefu.contains(s1)) {

hang++;
}
if (isnum == true
|| s1.equals(s2)
|| (s1.equals("i") && judge == true && !(Key
.contains(s2)))) {
fenxizhan.removeElementAt(0);
shuruliu.removeElementAt(0);
judge = false;
isnum = false;
} else {
System.out.println();
fenxizhan.removeElementAt(0);
shuruliu.removeElementAt(0);
+ (hang) + "行 error!");
}
} else// 非终极符时的处理
{
switch (i) {
case 0: {// i=0说明最先开头的是P,那么这个就是最开始的地方
if (s2.equals("main")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "main");
fenxizhan.add(1, "(");
fenxizhan.add(2, ")");
fenxizhan.add(3, "{");
fenxizhan.add(4, "Q");
fenxizhan.add(5, "K");
fenxizhan.add(6, "}");
// 遇到main关键字,把栈设为main(){QK}
} else if (s2.equals("int") || s2.equals("void")) {
// 如果遇到int和void
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, s2);
fenxizhan.add(1, "main");
fenxizhan.add(2, "(");
fenxizhan.add(3, ")");
fenxizhan.add(4, "{");
fenxizhan.add(5, "Q");
fenxizhan.add(6, "K");
fenxizhan.add(7, "}");//
} else {
+ hang + "行 error!");// 没有主方法的话,则报错
System.exit(0);
}
break;
}
case 1: {
if (s2.equals("int") || s2.equals("char")// 栈顶为Q
|| s2.equals("float") || s2.equals("double")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);// 如果是基本类型名,则移进
fenxizhan.add(0, "U");
fenxizhan.add(1, "V");
fenxizhan.add(2, ";");// 把栈设为U V;方式代表int x;类型
} else {
+ hang + "行 error!");
System.exit(0);
fenxizhan.removeElementAt(0);
}
break;
}
case 2: {
if (s2.equals("int") || s2.equals("char")
|| s2.equals("float") || s2.equals("double")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, s2);// 移进该类型名,设为栈顶元素
} else {
+ hang + "行 error!");
System.exit(0);
fenxizhan.removeElementAt(0);
}
break;
}
case 3: {
if (judge == true) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "i");
fenxizhan.add(1, "N");
} else {
+ hang + "行 error!");
System.exit(0);
fenxizhan.removeElementAt(0);
}
break;
}
case 4: {
if (s2.equals(";")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
} else if (s2.equals(",")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, ",");
fenxizhan.add(1, "i");
fenxizhan.add(2, "N");
} else if (s2.equals("=")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "=");
fenxizhan.add(1, "E");
} else if (s2.equals("$")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
} else {
+ hang + "行 error!");
fenxizhan.removeElementAt(0);
System.exit(0);
}
break;
}
case 5: {
if (s2.equals("}")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
} else if (judge == true
&& !(s2.equals("else") || s2.equals("if")
|| s2.equals("while")
|| s2.equals("double") || s2.equals("int")
|| s2.equals("float") || s2.equals("char"))) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "i");
fenxizhan.add(1, "=");
fenxizhan.add(2, "E");
fenxizhan.add(3, ";");
fenxizhan.add(4, "K");
judge = false;
} else if (s2.equals("double") || s2.equals("int")
|| s2.equals("float") || s2.equals("char")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "Q");
fenxizhan.add(1, "K");
} else if (s2.equals("if") || s2.equals("while")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, s2);
fenxizhan.add(1, "(");
fenxizhan.add(2, "E");
fenxizhan.add(3, ")");
fenxizhan.add(4, "{");
fenxizhan.add(5, "K");
fenxizhan.add(6, "}");
fenxizhan.add(7, "K");
} else if (s2.equals("else")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, s2);
fenxizhan.add(1, "{");
fenxizhan.add(2, "K");
fenxizhan.add(3, "}");
fenxizhan.add(4, "K");
} else if (s2.equals(";")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, ";");
fenxizhan.add(1, "K");
} else {
+ hang + "行 error!");
fenxizhan.removeElementAt(0);
System.exit(0);
}
break;
}
case 6: {
if (judge == true || isnum == true) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "T");
fenxizhan.add(1, "G");
judge = false;
isnum = false;
} else if (s2.equals("(")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "T");
fenxizhan.add(1, "G");
sign = 1;
} else {
+ hang + "行 error!");
fenxizhan.removeElementAt(0);
System.exit(0);
}
break;
}
case 7: {
if (s2.equals("+") || s2.equals(">") || s2.equals("<")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, s2);
fenxizhan.add(1, "T");
fenxizhan.add(2, "G");
} else if (s2.equals("-")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "-");
fenxizhan.add(1, "T");
fenxizhan.add(2, "G");
}
else if (s2.equals(")")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
} else if (s2.equals(";")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
} else if (s2.equals("$")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
} else {
+ hang + "行 error!");
fenxizhan.removeElementAt(0);
System.exit(0);
}
break;
}
case 8: {
if (judge == true || isnum == true) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "F");
fenxizhan.add(1, "M");
judge = false;
isnum = false;
} else if (s2.equals("(")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "F");
fenxizhan.add(1, "M");
} else if (s2.equals("=")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "F");
fenxizhan.add(1, "M");
} else {
+ hang + "行 error!");
fenxizhan.removeElementAt(0);
System.exit(0);
}
break;
}
case 9: {
if (s2.equals("+") || s2.equals("-") || s2.equals(">")
|| s2.equals("<") || s2.equals(")")
|| s2.equals(";") || s2.equals("$")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
} else if (s2.equals("*") || s2.equals("/")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, s2);
fenxizhan.add(1, "F");
fenxizhan.add(2, "M");
} else {
fenxizhan.removeElementAt(0);
+ hang + "行 error!");
System.exit(0);
}
break;
}
case 10: {
if (judge == true || isnum == true) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "i");
judge = false;
isnum = false;
} else if (s2.equals("(")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "(");
fenxizhan.add(1, "E");
fenxizhan.add(2, ")");
} else if (s2.equals("=")) {
ls = (String) fenxizhan.elementAt(0);
fenxizhan.removeElementAt(0);
fenxizhan.add(0, "=");
fenxizhan.add(1, "E");
} else {
fenxizhan.removeElementAt(0);
+ hang + "行 error!");
System.exit(0);
}
break;
}
}
}
System.out.println();
System.out.print("分析栈:");
for (i = 0; i < fenxizhan.size(); i++)
System.out.print(fenxizhan.elementAt(i));
System.out.print(" ");
System.out.print("输入流为:");
for (int j = 0; j < shuruliu.size(); j++) {
System.out.print(shuruliu.elementAt(j));
}
System.out.print(" ");
}
}
public void cifafenxi() {
int i = 0;
while (i < (shuruliu.size() - 1)) {
String name = (String) shuruliu.elementAt(i);
if (Key.contains(name)) {
System.out.println(name + " " + "is Key");
i++;
} else if (jiefu.contains(name)) {
System.out.println(name + " " + "is 界符");
i++;
} else if (yusuanfu.contains(name)) {
System.out.println(name + " " + "is 运算符");
i++;
} else {
System.out.println(name + " " + "is 标识符");
i++;
}
}
}
public void siyuanshi() {// 四元式
String a = "";
int i = 0;
while (i < beifen.size()) {
String linshi1 = "";
String linshi = (String) beifen.elementAt(i);
String T1 = "T1";
String T2 = "T2";
if (i < (beifen.size() - 1)) {
linshi1 = (String) beifen.elementAt(i + 1);
}
if (linshi.equals("if")) {
if (((String) beifen.elementAt(i + 3)).equals(">")
|| ((String) beifen.elementAt(i + 3)).equals("<")
|| ((String) beifen.elementAt(i + 3)).equals("=")) {
siyuanshi[count].fuhao = (String) beifen.elementAt(i + 3);
siyuanshi[count].op1 = (String) beifen.elementAt(i + 2);
siyuanshi[count].op2 = (String) beifen.elementAt(i + 4);
siyuanshi[count].p1.Address_Num = count + 2;
count++;
siyuanshi[count].fuhao = "j";
siyuanshi[count].op1 = "_";
siyuanshi[count].op2 = "_";
else_beginsign = count;
count++;
}
} else if (linshi.equals("else")) {
siyuanshi[count].fuhao = "j";
siyuanshi[count].op1 = "_";
siyuanshi[count].op2 = "_";
if_oversign = count;
count++;
siyuanshi[else_beginsign].p1.Address_Num = count;
}
else if (linshi.equals("while")) {
if (((String) beifen.elementAt(i + 3)).equals(">")
|| ((String) beifen.elementAt(i + 3)).equals("<")
|| ((String) beifen.elementAt(i + 3)).equals("=")) {
while_beginsign = count;
siyuanshi[count].fuhao = (String) beifen.elementAt(i + 3);
siyuanshi[count].op1 = (String) beifen.elementAt(i + 2);
siyuanshi[count].op2 = (String) beifen.elementAt(i + 4);
siyuanshi[count].p1.Address_Num = count + 2;
count++;
siyuanshi[count].fuhao = "j";
siyuanshi[count].op1 = "_";
siyuanshi[count].op2 = "_";
while_endsign = count;
count++;
}
}
else if (((String) beifen.elementAt(i)).equals("}")
&& linshi1.equals("else")) {
} else if (((String) beifen.elementAt(i)).equals("}")
&& (if_oversign != 0)) {
siyuanshi[if_oversign].p1.Address_Num = count;
if_oversign = 0;
} else if (linshi1.equals("=")) {
if (((String) beifen.elementAt(i + 5)).equals(";")) {
siyuanshi[count].fuhao = (String) beifen.elementAt(i + 3);
siyuanshi[count].op1 = (String) beifen.elementAt(i + 2);
siyuanshi[count].op2 = (String) beifen.elementAt(i + 4);
siyuanshi[count].p1.result = T1;
count++;
siyuanshi[count].fuhao = (String) beifen.elementAt(i + 1);
siyuanshi[count].op1 = siyuanshi[count - 1].p1.result;
siyuanshi[count].op2 = "_";
siyuanshi[count].p1.result = (String) beifen.elementAt(i);
count++;
} else if (((String) beifen.elementAt(i + 3)).equals(";")) {
siyuanshi[count].fuhao = (String) beifen.elementAt(i + 1);
siyuanshi[count].op1 = (String) beifen.elementAt(i + 2);
siyuanshi[count].op2 = "_";
siyuanshi[count].p1.result = (String) beifen.elementAt(i);
count++;
} else if (((String) beifen.elementAt(i + 7)).equals(";")) {
siyuanshi[count].fuhao = (String)beifen.elementAt(i+5);
siyuanshi[count].op1 = (String)beifen.elementAt(i+4);
siyuanshi[count].op2 = (String)beifen.elementAt(i+6);
siyuanshi[count].p1.result = T1;
count++;
siyuanshi[count].fuhao = (String)beifen.elementAt(i+3);
siyuanshi[count].op1 = (String)beifen.elementAt(i+2);
siyuanshi[count].op2 = siyuanshi[count-1].p1.result;
siyuanshi[count].p1.result = T2;
count++;
siyuanshi[count].fuhao = linshi1;
siyuanshi[count].op1 = siyuanshi[count-1].p1.result;
siyuanshi[count].op2 = "_";
siyuanshi[count].p1.result = linshi;
count++;
}
} else if (((String) beifen.elementAt(i)).equals("}")
&& (while_endsign != 0)) {
siyuanshi[count].fuhao = "j";
siyuanshi[count].op1 = "_";
siyuanshi[count].op2 = "_";
siyuanshi[count].p1.Address_Num = while_beginsign;
count++;
siyuanshi[while_endsign].p1.Address_Num = count;
while_endsign = 0;
} else{
}
i++;}
}
}
6.软件测试
图13.程序运行结果
7.总结及心得体会
三个星期的课程设计终于落下帷幕了,其中遇到了很多问题比如:语法分析中各个文法规则的编写,if-else语句中文法规则的编写,while语句中文法规则的编写以及赋值语句中表达式文法规则的编写,怎样循环调用这些文法规约程序。同时在语义分析中,如何结合语法分析,用四元式表示出各个控制语句与赋值语句的翻译。不过,在课程设计的这三个星期中,学到了很多东西,不仅复习了编译原理这门课程,深刻体会了以前课堂中没有重视的内容,理解了编译原理的重要性。同时也复习了Java语言的编写,体会了以前没有用到的函数类,深刻体会到了Java的强大性,学会了简单使用Eclipse平台。在课程设计结束之际感谢师老师这三个星期的细心教导。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/6755.html