资源简介

山东大学计算机学院的编译原理实验,用java写的,是对PL/0语言的编译程序

资源截图

代码片段和文件信息

package BianYiYuanLi;

import java.io.*;
import java.util.Vector;
public class Block
{
public GetSym CiFa;
public Word word;
public String id = null; // 用于登录名字表时的word名字
public int lineNum; // 用于错误处理时的行数记录
public int errorNumber = 0; // 用于保存语法分析中的错误数目
public Error error;
int cx;
int cx0;
int dx;
int lev = -1;
int errorNum = 0;

Vector CODE = new Vector();; // 生成一个vector矢量! // 此矢量用作存放CodeElement的数组
Vector TABLE = new Vector();// 生成一个存放矢量 作为名字表;

public Block(GetSym CF)// 语法分析构造函数
{
CiFa = CF;// 从主程序传入一个词法分析对象,将其赋给CiFa
word = CiFa.GetWord(); // 获得一个word
analyse(); // 然后调用分析程序
}

public int getErroNumber()
{
return errorNumber;
}
public void printTable() // 用来查看符号表内容的
{
for (int t = 1; t < TABLE.size(); t++)
{
TableElement name = (TableElement) TABLE.get(t);
if(name.kind.equals(“constant“))
name.showConst();
else if(name.kind.equals(“variable“))
name.show();
else if(name.kind.equals(“procedure“))
{
t++;
TableElement tempname=(TableElement) TABLE.get(t);
name.adr=tempname.adr;
name.show(); 
}

}
}

public void printCode()// CodeElement的显示方法,如果没有错误,则打印CodeElement代码
{
for (int n = 2; n < CODE.size(); n++)
{
CodeElement code = (CodeElement) CODE.get(n);
System.out.println(n + “\t“ + code.getF() + “\t“ + code.getL()
+ “\t“ + code.getA());
}
}

public void analyse()
{
int tx0;
lev++;
dx = 3;
tx0 = TABLE.size(); // 用tx0保存当前层的符号在符号表中的起始位置
TABLE.addElement(new TableElement(“ “ “ “ 0 0 0));// 在这里给符号表填加一个元素,否则下一条代码会运行出界
((TableElement) TABLE.get(tx0)).setAdr(CODE.size());// 在上面加的那个元素里的私有字段adr里保存当前层代码的开始位置
CODE.addElement(new CodeElement(“jmp“ 0 0)); // 生成跳转指令  由于跳转位置未知 暂时添0
while (word.getSym().equals(“constsym“)
|| word.getSym().equals(“varsym“)
|| word.getSym().equals(“procsym“))
{
if (word.getSym().equals(“constsym“))// 常量处理
{
word = CiFa.GetWord();
constDefine(); // 调用常量声明,注意常量声明完毕时还要再次读取一个word
while (word.getSym().equals(“sym“))// 若在常量声明后读取的word为逗号,则要继续进行常量声明这里采用while循环,直到word不是逗号
{
word = CiFa.GetWord();
constDefine(); // 调用常量声明注意常量声明完毕时还要再次读取一个word
}
if (word.getSym().equals(“;sym“))// 若word不是逗号,则应该是分号了,标志常量声明结束
{
word = CiFa.GetWord();
} else
{
errorNumber++;
error.error(word.getLineNum() 5);// 如果常量声明完毕后没有遇到分号;则抛出15号错误
}
}
// 变量处理
else if (word.getSym().equals(“varsym“))
{
word = CiFa.GetWord();// 读取一个word,应该是一个ident标识符
varDefine(); // 调用变量声明注意常量声明完毕时还要再次读取一个word
while (word.getSym().equals(“sym“))
{
word = CiFa.GetWord();
varDefine(); // 调用变量声明注意常量声明完毕时还要再次读取一个word
}
if (word.getSym().equals(“;sym“))
{
word = CiFa.GetWord();
} else
{
errorNumber++;
error.error(word.getLineNum() 5);// 如果变量声明完毕后没有遇到分号;则调用错误处理程序抛出5号错误
}
}
// 循环声明各个子过程
while (word.ge

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      20457  2010-11-15 22:05  山东大学计算机学院编译原理实验—PL0语言的设计\Block.java

     文件        447  2010-11-07 15:55  山东大学计算机学院编译原理实验—PL0语言的设计\CodeElement.java

     文件       1318  2010-11-09 09:40  山东大学计算机学院编译原理实验—PL0语言的设计\Error.java

     文件       5576  2010-11-15 19:59  山东大学计算机学院编译原理实验—PL0语言的设计\GetSym.java

     文件       1080  2010-11-15 19:31  山东大学计算机学院编译原理实验—PL0语言的设计\TableElement.java

     文件        689  2010-11-15 16:03  山东大学计算机学院编译原理实验—PL0语言的设计\Word.java

     目录          0  2011-11-24 00:12  山东大学计算机学院编译原理实验—PL0语言的设计

----------- ---------  ---------- -----  ----

                29567                    7


评论

共有 条评论