资源简介
山东大学计算机学院的编译原理实验,用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
相关资源
- mysql数据处理,java用户登录处理
- 法律咨询信息系统(java+jsp+sqlserver)
- Java快速开发平台源码(renren-fast)
- 锐聘学院QST青软JavaWeb十二个打包
- 3.3.6微信支付JAVA版demo
- javaweb网上购物系统源码(附数据库脚
- javaweb校园宿舍系统(附数据库脚本)
- JavaWeb书城项目(附数据库脚本)
- 基于JAVA_JSP电子书系统(源码+数据库
- Java网络编程知识点总结.xmind
- 一站式Java网络编程 BIO-NIO-AIO资料源码
- jsp讲解
- 基于SSH框架的JavaWeb项目—人员信息管
- javaweb实现的邮件收发系统(附数据库
- Java 仿QQ(附客户端以及服务端源码)
- Java TCP IP Socket
- java定时发送邮件(基于quartz)
- Java Swing开发的《星际争霸》游戏
- java+数据库商品交易管理系统(附数据
- 使用java语言编译一个计算器
- java swing工资管理系统(源码+数据库
- JAVALibrary
- 微信企业号回调模式Java版
- 顺丰丰桥接口开发详细教程源码含下
- Java博客概要设计文档
- 药品进销存管理系统(论文范文_JSP
- 奖学金管理系统java+jsp+mysql
- 毕设参考——基于java酒店管理
- Java写的一个简单的字体更改程序
- java8学习教程之lambda表达式的使用方法
评论
共有 条评论