文档库 最新最全的文档下载
当前位置:文档库 › 编译原理课程设计-福建农林大学java

编译原理课程设计-福建农林大学java

编译原理课程设计-福建农林大学java
编译原理课程设计-福建农林大学java

福建农林大学计算机与信息学院

计算机类

课程设计报告

课程名称:编译原理

课程设计题目:语法分析器

姓名:陈锦灿

系:计算机

专业:计算机科学与技术

年级:2012级

学号:3126010067

指导教师:林清波

2015~2016学年第一学期

福建农林大学计算机与信息学院计算机类

课程设计结果评定

目录

1 正则表达式 (1)

1.1 正则表达式 (1)

1.2 确定化(化简)后的状态转换图 (1)

1.3 分析程序代码 (1)

1.4 程序运行截图 (1)

1.5 小结: (2)

2 LL(1)分析 (3)

2.1 LL(1)文法 (3)

2.2 LL(1)预测分析表 (3)

2.3 分析程序代码 (3)

2.4 程序运行截图 (3)

2.5 小结 (8)

3 算符优先分析 (9)

3.1 算符优先文法 (9)

3.2 算符优先关系表 (9)

3.3 分析程序代码 (9)

3.4 程序运行截图 (9)

3.5 小结 (11)

4 LR分析 (12)

4.1 LR文法 (12)

4.2 LR分析表 (12)

4.3 分析程序代码(代码原创) (12)

4.4 程序运行截图 (12)

4.5 小结 (17)

参考文献: (18)

1 正则表达式

1.1 正则表达式

(a|b)*(aa|bb)(a|b)*

1.2 确定化(化简)后的状态转换图

1.3 分析程序代码

import java.util.Scanner;

public class Test4 {

public static void main(String[] args) {

int[][] s={{1,2},{3,2},{1,4},{3,5},{6,4},{6,4},{3,5}};

System.out.println("文法规则:\n(a|b)*(aa|bb)*(a|b)*");

System.out.println("请输入您所要验证的句子:\n");

Scanner sc = new Scanner(System.in);

String str1 = sc.next();

int len = str1.length();

char ch;

int i,j = 0,t,flag,index;

i=0;index = 0;

t=1;//判断输入是否正确

flag=0;//判断句子是否正确

while(index < len){

ch = str1.charAt(index);

if(ch == 'a')

j = 0;

if(ch == 'b')

j = 1;

if(ch != 'a' && ch != 'b') {

t = 0; break;

}

index++;

1

i = s[i][j];

}

flag = i;

if(flag>=3 && t==1){//flag>2时可终结

System.out.println("\n您所要验证的句子正确!\n\n");

}else{

System.out.println("\n您所要验证的句子错误!\n\n");

}

}

}1.4 程序运行截图

1.5 小结:

通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解。

2

2 LL(1)分析

2.1 LL(1)文法

E→TE'

E'→+TE'|ε

T→FT'

T'→*FT'|ε

F→(E)|i

2.2 LL(1)预测分析表

2.3 分析程序代码

public class Test {

public static void main(String a[])

{

int id=1;

int index1=1;//记录栈最后一个非终结符的位置

String topStack,topIn,operation;

StringBuffer inString=null;

ArrayList list = new ArrayList();

System.out.println("请输入一个语句:");

Scanner in = new Scanner(System.in);

String ins=in.nextLine().trim();

if(ins.indexOf("#")<0)//假如最后完了输入#号也没事

ins+="#";

else

ins=ins.substring(0,ins.indexOf("#")+1);//截取#号在内的前部

inString = new StringBuffer(ins);

3

int kong=inString.indexOf(" ");

while(kong>=0)//去掉输入串表达式中的空格

{

inString.delete(kong,kong+1);

kong=inString.indexOf(" ");

}

StringBuffer stack=new StringBuffer("#E");//分析栈,初始放入E

String ll[][]={{"","i","+","*","(",")","#"},

{"E","E’T/P","","","E’T/P","",""},

{"E’","","E’T/N","","","ε/P","ε/P"},

{"T","T’F/P","","","T’F/P","",""},

{"T’","","ε/P","T’F/N","","ε/P","ε/P"},

{"F","ε/N","","",")E/N","",""},

{")","","","","","ε/N",""},

{"#","","","","","","acc"}

};//ll(1)分析矩阵

System.out.println("LL(1)分析过程如下:");

System.out.println("\n序号\t分析栈"+getBlank(20)+" 输入数据"+getBlank(20)+"动作");

StringBuffer liutemp = null;

while(stack.length()>0)

{

int x=0,y=0;//记录在分析表中的的横纵坐标

if(stack.toString().endsWith("\'")||stack.toString().endsWith( "’"))//证明是带了一撇的非终结符

index1 = stack.length()-2;//

else

index1=stack.length()-1;

topStack=String.valueOf(stack.substring(index1,stack.length()) );//栈顶元素

if(inString.length()>0)

topIn=String.valueOf(inString.charAt(0));//剩余输入串的第一个元素

else

4

topIn="";

for(int i=1;i

if(topStack.equals(ll[i][0]))

{

x=i;

break;

}

for(int i=1;i

if(topIn.equals(ll[0][i]))

{

y=i;

break;

}

operation=ll[x][y];//动作命令

if(operation.length()>=3)

{

String

first=operation.substring(0,operation.length()-2);//替换部分

String

last=operation.substring(operation.length()-2,operation.length ());//是否换行部分

if(first.equals("ε"))//如果是空字符,有不要加入栈

first="";

if(operation.equals("acc"))

{

if(stack.length()==1&&inString.length()==1)

{

System.out.println(id+"\t"+stack+getBlank(21-stack.length()-in String.length())+inString+getBlank(11-operation.length())+oper ation);

stack.delete(0,1);

inString.delete(0,1);

System.out.println("匹配成功!");

}

else

{

System.out.println(id+"\t"+stack+getBlank(21-stack.length()-in

5

String.length())+inString+getBlank(6)+"error");

System.out.println("不能完整匹配!");

}

}

else if(last.equals("/P"))

{

System.out.println(id+"\t"+stack+getBlank(21-stack.length()-in String.length())+inString+getBlank(11-operation.length())+oper ation);

stack.replace(index1,index1+topStack.length(),first);//把栈顶元素替换为分析表中值

if(first.equals(""))

list.add(ll[x][0]+"->ε");

else{

liutemp = new StringBuffer(first);

list.add(ll[x][0]+"->"+reverse(liutemp));

}

id++;

}else if(last.equals("/N"))

{

System.out.println(id+"\t"+stack+getBlank(21-stack.length()-in String.length())+inString+getBlank(11-operation.length())+oper ation);

stack.replace(index1,index1+topStack.length(),first);

inString.delete(0,1);//相当于读下一个元素

liutemp = new StringBuffer(first);

list.add(ll[x][0]+"->"+topIn+reverse(liutemp)); if(stack.toString().endsWith("\'")||stack.toString().endsWith( "’"))

index1 = stack.length()-2;//重新设置index1值

else

index1=stack.length()-1;

id++;

}else {

System.out.println("分析表构造出错!");

System.exit(0);

6

}

}else if(y==0){

System.out.println(id+"\t"+stack+getBlank(21-stack.length()-in String.length())+inString+getBlank(6)+"error");

System.out.println("输入的符号不符合规定文法!");

System.exit(0);

}else if(x!=0&&y!=0&&operation.length()==0)

{

System.out.println(id+"\t"+stack+getBlank(21-stack.length()-in String.length())+inString+inString+getBlank(6)+"error");

System.out.println("输入符号串不完整!");

System.exit(0);

}

}

System.out.println("\n该语句自顶向下构建语法树过程:");

for(int i = 0;i

System.out.println(list.get(i));

}

public static StringBuffer reverse(StringBuffer buffer){//字母、运算符倒置

StringBuffer buf = new StringBuffer();

int ix=-1;

int length=0;

if(buffer.indexOf("'")<0&&buffer.indexOf("’")<0)

buf.append(buffer.reverse());

else{

while(buffer.length()>0){

length = buffer.length();

if(buffer.charAt(length-1)=='\''||buffer.charAt(length-1)=='’' )

{

buf.append(buffer.substring(length-2,length));

buffer.delete(length-2,length);

}else {

buf.append(buffer.charAt(length-1));

buffer.delete(length-1,length);

}

}

}

7

return buf;

}

public static String getBlank(int n){//得到n个连续空格

String blank="";

for(int i=0;i

blank+=" ";

return blank;

}

}2.4 程序运行截图

2.5 小结

通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。

8

3 算符优先分析

3.1 算符优先文法

E -> E+T|T

T -> T*F|F

F -> P%F|P

P -> (E)|i

3.2 算符优先关系表

3.3 分析程序代码

public class Test2 {

static HashMap m = new HashMap();

static Stack sk;

public static void table() {

m.put("++", ">");m.put("+*", "<");m.put("+%", "<");

m.put("+i", "<");m.put("+(", "<");m.put("+)", ">");

m.put("+#", ">");m.put("*+", ">");m.put("**", ">");

m.put("*%", "<");m.put("*i", "<");m.put("*(", "<");

m.put("*)", ">");m.put("*#", ">");m.put("%+", ">");

m.put("%*", ">");m.put("%%", "<");m.put("%i", "<");

m.put("%(", "<");m.put("%)", ">");m.put("%#", ">");

m.put("i+", ">");m.put("i*", ">");m.put("i%", ">");

m.put("ii", "");m.put("i(", "");m.put("i)", ">");

m.put("i#", ">");m.put("(+", "<");m.put("(*", "<");

m.put("(%", "<"); m.put("(i", "<");m.put("((", "<");

m.put("()", "=");m.put("(#", "");m.put(")+", ">");

m.put(")*", ">");m.put(")%", ">");m.put(")i", "");

m.put(")(", "");m.put("))", ">");m.put(")#", ">");

9

m.put("#+", "<");m.put("#*", "<");m.put("#%", "<");

m.put("#i", "<");m.put("#(", "<");m.put("#)", "");

m.put("##", "=");

}

public static void main(String args[]) {

int k = 1, i = 0, xiabiao = 0, f;

sk = new Stack();

table();

System.out.println("请输入符号串:");

Scanner sc = new Scanner(System.in);

String s = sc.next() + "#";

char c[] = s.toCharArray();

sk.push('#');

System.out.println("分析过程...");

while (i < c.length) {

f = k - 1;

while (f >= 0 && (Character) sk.get(f) == 'A') {

f--;

}

if ((m.get((Character) sk.get(f) + "" + c[i]) == "<") | (m.get((Character) sk.get(f) + ""+ c[i]) == "=")) {

k++;

sk.push(c[i]);

i++;

} else {

xiabiao = f - 1;

while ((xiabiao >= 0)

&& ((m.get((Character) sk.get(xiabiao) + "" + c[i]) == ">") | (Character) sk

.get(xiabiao) == 'A')) {

xiabiao--;

}

for (int t = f; (t >= xiabiao && t > 0); t--) {

sk.pop();

}

sk.push('A');

sk.push(c[i]);

k = sk.size();

i++;

}

for (int a = 0; a < sk.size(); a++) {

if(sk.get(a)!='A')

10

System.out.print(sk.get(a));

}

System.out.print("\n");

}

if ((Character) sk.peek() == '#') {

System.out.println(s.substring(0, s.length()-1) + " success!!");

} else {

System.out.println(s + " error!");

}}

}3.4 程序运行截图

3.5 小结

在这次课程设计中,我就是按照实验指导的思想来完成。加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。

11

4 LR分析

4.1 LR文法

(0)E'->E

(1)E->E+T

(2)E->T

(3)T->T*F

(4)T->F

(5)F->(E)

(6)F->i

4.2 LR分析表

4.3 分析程序代码(代码原创)

public class Test3 {

String[][] sentence = new String[][]{//文法,是内定了

{"E","E+T"},//E->E+T

{"E","T"},//E->T

{"T","T*F"},//T->T*F

{"T","F"},//T->F

{"F","(E)"},//F->(E)

{"F","i"}//F->i

};

12

String[][] table = new String[][]{//为了简单,LR分析表就手工输入了

{"","i","+","*","(",")","#","E","T","F"},

{"S0","S5","","","S4","","","1","2","3"},

{"S1","","S6","","","","acc","","",""},

{"S2","","r2","S7","","r2","r2","","",""},

{"S3","","r4","r4","","r4","r4","","",""},

{"S4","S5","","","S4","","","8","2","3"},

{"S5","","r6","r6","","r6","r6","","",""},

{"S6","S5","","","S4 ","","r1","","9","3"},

{"S7","S5","","","S4","","","","","10"},

{"S8","","S6","","","S11","","","",""},

{"S9","","r1","S7","","r1","r1","","",""},

{"S10","","r3","r3","","r3","r3","","",""},

{"S11","","r5","r5","","r5","r5","","",""} };

String in=null;

public Test3(){

this.printSentence();//打印文法

Scanner sc = new Scanner(System.in);

System.out.println("\n请输入一个句子:");

in = sc.nextLine().toString();

in = removeBlank(in);

int index=0;//记录输入串的索引位置

StringBuffer stateTrack = new StringBuffer("S0");//状态栈,初始时如S0

StringBuffer analysisTrack = new StringBuffer("#");//分析栈,初始放#

ArrayList list = new ArrayList();

String operator = "";//记录分析表中对应的值

String staTrack="";

int x,y;//记录在分析表中的位置

boolean isOver=false;

System.out.println("\n语句分析过程如下:");

13

System.out.println("状态栈"+getBlank(26)+"符号栈

"+getBlank(20)+"输入串\tACTION\tGOTO");

while(!isOver){

x=0;y=0;

String inS = in.charAt(index)+"";//输入串如今读到的位置

for(int i= 1;i

if(table[0][i].equals(inS))

{

y = i;

break;

}

staTrack =

stateTrack.substring(https://www.wendangku.net/doc/3416018482.html,stIndexOf("S"),stateTrack.le

ngth());//读取状态栈最上面一个状态

for(int i=1;i

if(staTrack.equals(table[i][0])){

x = i;

break;

}

operator = table[x][y];//分析表中对应位置的动作

if(operator.length()>0){

System.out.print(stateTrack+getBlank(16-stateTrack.length()) +analysisTrack+getBlank(18-analysisTrack.length()-in.length()+ index)+in.substring(index,in.length())+"\t"+operator);

if(operator.startsWith("S")){//移进

stateTrack.append(operator);

analysisTrack.append(inS);

index++;//输入串指针下移一位

}else if(operator.startsWith("r")){//规约

int m =

Integer.parseInt(operator.substring(1,operator.length()))-1;//

截取后面的数字,用于查产生式,这是从1开始的

String liutemp = sentence[m][1];

list.add(sentence[m][1]+"=>"+sentence[m][0]);//

14

规约步骤

if(analysisTrack.toString().endsWith(liutemp)) analysisTrack.delete(analysisTrack.length()-liutemp.length()

,analysisTrack.length());//在分析栈除去产生式右部的字符串

else{

System.out.println("\n规约时出错!");

System.exit(0);

}

analysisTrack.append(sentence[m][0]);//加上产生式

左部,就相当于规约了

int stindex=https://www.wendangku.net/doc/3416018482.html,stIndexOf("S");

for(int i=0;iT'+F

stateTrack.delete(stindex,stateTrack.length());//一次去掉去掉

一个状态

stindex=https://www.wendangku.net/doc/3416018482.html,stIndexOf("S");

}

x = 0;y = 0;

staTrack =

stateTrack.substring(https://www.wendangku.net/doc/3416018482.html,stIndexOf("S"),stateTrack.le ngth());

for(int i=1;i

if(staTrack.equals(table[i][0])){

x = i;

break;

}

}

for(int i=1;i

if(table[0][i].equals(sentence[m][0])){

y = i;

break;

}

}

operator = table[x][y];//得到GOTO值

15

System.out.print("\t"+operator);

if(operator.matches("\\d+"))

stateTrack.append("S"+operator);

else{

System.out.println("\n待规约项出错!");

System.exit(0);

}

}else if(operator.equals("acc")){

System.out.println("\n该语句符合该合法!");

isOver=true;

}

System.out.println();

}else {

System.out.println("输入的语句不符合给定文法!");

System.exit(0);

}

}

System.out.println("该句子语法树自底向上生成过程:");

for(int i=0;i

System.out.println(list.get(i));

}

public void printSentence(){

System.out.println("假定文法如下:");

for(int i=0;i

System.out.println(sentence[i][0]+"->"+sentence[i][1]);

}

public String getBlank(int n){//打印n个连续空格

String blank="";

for(int i=0;i

blank+=" ";

return blank;

}

public String removeBlank(String s){//消除多余的空格,最后追加#

StringBuffer res = new StringBuffer(s);

int kong=res.indexOf(" ");

while(kong>=0){

res.delete(kong,kong+1);

kong=res.indexOf(" ");}

16

if(s.indexOf("#")==-1)//如果没有#号

res.append("#");

return res.toString();

}

public static void main(String[] args){

new Test3();

}

} 4.4 程序运行截图

4.5 小结

通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。

17

编译原理课程设计

《编译原理》课程设计大纲 课程编号: 课程名称:编译原理/Compiler Principles 周数/学分:1周/1学分 先修课程:高级程序设计语言、汇编语言、离散数学、数据结构 适用专业:计算机科学与技术专业、软件工程专业 开课学院,系或教研室:计算机科学与技术学院 一、课程设计的目的 课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。 要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写。 设计时间: 开发工具: (1) DOS环境下使用Turbo C; (2) Windows环境下使用Visual C++ 。 (3) 其它熟悉语言。 二、课程设计的内容和要求 设计题一:算术表达式的语法分析及语义分析程序设计。 1.目的

通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词 法检查和分析。 2.设计内容及要求: 算术表达式的文法: 〈无符号整数〉∷= 〈数字〉{〈数字〉} 〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉} 〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’ 〈加法运算符〉∷= +|- 〈乘法运算符〉∷= *|/ (1) 分别选择递归下降法、算符优先分析法(或简单优 先法)完成以上任务,中间代码选用逆波兰式。 (2) 分别选择LL(1)、LR法完成以上任务,中间代码选 用四元式。 (3) 写出算术表达式的符合分析方法要求的文法,给出 分析方法的思想,完成分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通 过所设计的分析程序。 设计题二:简单计算器的设计 1.目的 通过设计、编制、调试一个简单计算器程序,加深对语法及语 义分析原理的理解,并实现词法分析程序对单词序列的词法检 查和分析。 2.设计内容及要求 算术表达式的文法:

编译原理课程设计

<PL0编译器-PCompiler> 软件需求说明书 作者:刁诗云、麻汉华、潘彦荃、周津、李程完成日期:2009年6月7日 签收人: 签收日期: 修改情况记录:

目录 软件需求说明书 (1) 1 引言 (1) 1.1 编写目的 (1) 1.2 项目背景 (1) 2 项目概述 (2) 2.1 产品描述 (2) 2.2 产品功能 (2) 2.3 用户特点 (2) 3 具体需求 (3) 3.1 EBNF定义的PL/0文法 (3) 3.2 语法图 (4) 3.3 功能需求 (6) 3.4 系统概要设计 (15)

1 引言 1.1 编写目的 为了清楚表达客户提出的需求,便于用户理解和确认项目所包含的具体功能需求、性能需求以及非公能性需求,因此以文件化的形式,把系统整体及其部分的业务流程、系统功能进行了详细的说明。同时,此文也对开发人员起到引导的作用,请认真阅读。 1.2 项目背景 PL/0是由世界著名计算机科学家、PASCAL语言的创始人N.Wirth教授选择提供的。在选择PL/0语言的过程中,Wirth很费了一番脑筋。一方面他希望借助这个语言,能尽可能把程序设计语言和编译技术一些最重要的内容都讲到;但另一方面又不希望内容太多,太杂,而希望尽可能简单一些,以便与有限的课时和课程范围相适应。于是他精心选择提供了这个PL/0语言。事实证明,它非常适合于编译技术的教学,目前已被国内越来越多的编译教材所采用。 PL/0语言的语句类型比较丰富,能适应各种可能的程序结构。最进本的是赋值语句。组合结构语句有语句串、条件语句和循环语句。还有重要的子程序概念,是通过过程说明和过程调用两部分实现的。至于数据类型和数据结构,PL/0则特别简单,只有整数类型一种,没有数据结构,因此只允许有整常数和整数变量的说明以及相应的算术运算表达式。PL/0允许在一个过程范围内说明常数、变量和过程。这些常数、变量和过程只在它们被说明的过程范围内有效。PL/0语言也允许递归调用,既可以间接递归,也可以直接递归。

java记事本课程设计论文附源码

设计题目:记事本课程设计 专业:电子信息科学与技术 班级:电子1202班 学号:20121210606 姓名:王鹏 2015 年7月

XXX学院本科学生课程设计任务书

摘要 目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并涉及到网络、多线程等重要的基础知识,因此Java语言也是学习面向对象编程和网络编程的首选语言。此次课程设计主要通过编写一个简单的记事本程序使我们深入理解并实践在本课程中所学的有关JAVA程序设计方面的语言基础、异常处理、事件处理、小应用程序以及图形用户界面设计等内容。此简易记事本程序,使用Java程序编写,能够进行输入文字操作,并具有新建文件,打开文件,保存文件,退出,复制,粘贴,剪切等功能。该程序主要用到了Java swing和事件监听等。 关键词记事本程序,java语言,Java swing

目录 摘要 (1) 1 需求分析 (3) 1.1需求分析 (3) 1.2功能设计 (3) 2 概要分析 (4) 2.1概要设计思想 (4) 2.2程序运行界面 (4) 2.3程序模块说明 (4) 2.4流程图 (5) 2.5程序相关说明 (6) 3 程序详细设计与分析 (8) 3.1构建菜单栏及其下拉菜单 (8) 3.2“文件”菜单操作的事件监听 (8) 3.3“编辑”、“格式”等菜单的事件监听 (10) 3.4异常处理 (11) 4 测试分析 (12) 5 源程序清单 (15) 结论 (22) 参考文献 (23)

1 需求分析 1.1需求分析 现在网络上各种文档编辑器数不胜数,有EmEditor ,UEStudio ,GridinSoft Notepad ,Notepad++,win32pad ,SkimEdit,UniRed, xint 。功能也是应有尽有,有能改变字体的,有能改变文字颜色的。但是,这些软件又存在各种各样的瑕疵或问题:有的文件体积相对于一般文字编辑来说太大;有的功能太繁杂,使初级使用者一时难以掌握。仅从日常应用方面来说,一个文本编辑器只需一些简单实用的功能就够了。本程序设计就是依照这样一种使用需要设计了一个简单的记事本程序。 1.2功能设计 本程序要构建的记事本程序参照了Windows操作系统的记事本工具,其功能有以下几个方面: 1、菜单中有“文件”,“编辑”,“格式”,“查看”,“帮助”五个主菜单。 2、“文件”有“新建”“打开”“保存”“另存为”“退出”五个子菜单:分别用于新建文件,打开文件,保存文件,另存文件,退出记事本。 3、“编辑”中有“撤销”“剪切”“复制”“粘贴”“全选”“时间/日期”六个字菜单:用于撤销操作,剪切文字,复制文字,粘贴文字。全部选择,插入日期、时间。 4、“格式”菜单中有“自动换行”和“字体”两个子菜单。 5、“查看”菜单只是显示状态栏。 6、“帮助”菜单中只有“关于记事本”子菜单,主要用于显示该程序的名字,版本等信息。

编译原理课程设计报告(一个完整的编译器)

编译原理程序设计报告 一个简单文法的编译器的设计与实现专业班级:计算机1406班 组长姓名:宋世波 组长学号: 20143753 指导教师:肖桐 2016年12月

设计分工 组长学号及姓名:宋世波20143753 分工:文法及数据结构设计 词法分析 语法分析(LL1) 基于DAG的中间代码优化 部分目标代码生成 组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0) 部分目标代码生成 组员2学号及姓名:孙何奇20143754 分工:符号表组织 部分目标代码生成

摘要 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。 一.编译器的概述 1.编译器的概念 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。 2.编译器的种类 编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语

学生信息管理系统java课程设计含源代码完整版

学生信息管理系统j a v a 课程设计含源代码 HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】

JAVA程序设计课程设计报告 课题: 学生信息管理系统 姓名: 学号: 同组姓名: 专业班级: 指导教师: 1 2 1、功能模块划分 (3) 2、数据库结构描述 (4) 3、系统详细设计文档 (6) 4、各个模块的实现方法描述 (9) 5、测试数据及期望结果 (11)

一、系统描述 1、需求实现的功能 、录入学生基本信息的功能 学生基本信息主要包括:学号、姓名、年龄、出生地、专业、班级总学分,在插入时,如果数据库已经存在该学号,则不能再插入该学号。 、修改学生基本信息的功能 在管理员模式下,只要在表格中选中某个学生,就可以对该学生信息进行修改。 、查询学生基本信息的功能 可使用“姓名”对已存有的学生资料进行查询。 、删除学生基本信息的功能 在管理员模式下,只要选择表格中的某个学生,就可以删除该学生。 、用户登陆 用不同的登录权限可以进入不同的后台界面,从而实现权限操作。 、用户登陆信息设置 可以修改用户登陆密码 2、设计目的 学生信息管理系统是一个教育单位不可缺少的部分。一个功能齐全、简单易用的信息管理系统不但能有效地减轻学校相关工作人员的工作负担,它的内容对于学校的决策者和管理者来说都至关重要。所以学生信息管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案、统计和查询数据,这种管理方式存在着许多缺点,如:效率低、保密性差、人工的大量浪费;另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少困难。随着科学技术的不断提高,计算机科学日渐成熟,其强大的

(重庆理工大学计算机学院)编译原理课程设计报告

编译原理课程设计报告 实验名称编译原理课程设计 班级 学号 姓名 指导教师 实验成绩 2013 年06月

一、实验目的 通过设计、编写和调试,将正规式转换为不确定的有穷自动机,再将不确定的有穷自动机转换为与之等价的确定的有穷自动机,最后再将确定有穷自动机进行简化。 通过设计、编写和调试构造LR(0)项目集规范簇和LR分析表、对给定的符号串进行LR分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G出发生成LR(0)分析表,并对给定的符号串进行分析。 二、实验内容 正规式——>NFA——>DFA——>MFA 1.正规式转化为不确定的有穷自动机 (1)目的与要求 通过设计、编写和调试将正规式转换为不确定的有穷自动机的程序,使学生了解Thompson算法,掌握转换过程中的相关概念和方法,NFA的表现形式可以是表格或图形。 (2)问题描述 任意给定一个正规式r(包括连接、或、闭包运算),根据Thompson算法设计一个程序,生成与该正规式等价的NFA N。 (3)算法描述 对于Σ上的每个正规式R,可以构造一个Σ上的NFA M,使得L(M)=L(R)。 步骤1:首先构造基本符号的有穷自动机。 步骤2:其次构造连接、或和闭包运算的有穷自动机。

(4)基本要求 算法实现的基本要求是: (1) 输入一个正规式r; (2) 输出与正规式r等价的NFA。(5)测试数据 输入正规式:(a|b)*(aa|bb)(a|b)* 得到与之等价的NFA N

(6)输出结果 2.不确定的有穷自动机的确定化 (1)目的与要求 通过设计、编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。DFA的表现形式可以是表格或图形。(2)问题描述 任意给定一个不确定的有穷自动机N,根据算法设计一个程序,将该NFA N变换为与之等价的DFA D。 (3)算法描述 用子集法将NFA转换成接受同样语言的DFA。 步骤一:对状态图进行改造 (1) 增加状态X,Y,使之成为新的唯一的初态和终态。从X引ε弧到原初态结点, 从原终态结 点引ε弧到Y结点。 (2) 对状态图进一步进行如下形式的改变

编译原理课程设计

编译原理课程设计报告 课题名称: C-语言编译器设计(scanner和parser) 提交文档学生姓名: 提交文档学生学号: 同组成员名单:无 指导教师姓名:金军 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间: 2011年 6 月 17 日

1.课程设计目标 设计C-Minus编译器分为scanner和parser两个部分。scanner主要作用是对目标代码进行扫描,列出关键字,变量等内容;parser主要对语法进行分析并生成语法树。 2.分析与设计 ●实现方法:代码用C语言编译而成。其中scanner为手工实现,主要采用switch-case结构实现 状态转换;parser部分采用递归下降分析方法实现。 ●扫描器:C-的词法如下: 1、语言的关键字:i f el se i nt return void while 2、专用符号:+ - * /< <= > >= == != =; , ( ) [ ] { } /* */ 3、其他标记是变量(ID)和数字(NUM),通过下列正则表达式定义: ID = letter letter* NUM = di git digi t* letter = a|..|z|A|..|Z digi t = 0|..|9 4、空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字 5. 注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在 标记内)上,且可以超过一行。注释不能嵌套 其DFA图如下:

分析器:以下为C-的语法规则BNF:

学生信息管理系统java课程设计(含源代码)

JAVA程序设计课程设计报告 课题: 学生信息管理系统 姓名: 学号: 同组姓名: 专业班级: 指导教师: 设计时间: 评阅意见: 评定成绩:

目录 一、系统描述 (2) 1、需要实现的功能 (3) 2、设计目的 (3) 二、分析与设计 (3) 1、功能模块划分 (3) 2、数据库结构描述 (4) 3、系统详细设计文档 (6) 4、各个模块的实现方法描述 (9) 5、测试数据及期望结果 (11) 三、系统测试 (16) 四、心得体会 (23) 五、参考文献 (24) 六、附录 (24)

一、系统描述 1、需求实现的功能 、录入学生基本信息的功能 学生基本信息主要包括:学号、姓名、年龄、出生地、专业、班级总学分,在插入时,如果数据库已经存在该学号,则不能再插入该学号。 、修改学生基本信息的功能 在管理员模式下,只要在表格中选中某个学生,就可以对该学生信息进行修改。 、查询学生基本信息的功能 可使用“姓名”对已存有的学生资料进行查询。 、删除学生基本信息的功能 在管理员模式下,只要选择表格中的某个学生,就可以删除该学生。 、用户登陆 用不同的登录权限可以进入不同的后台界面,从而实现权限操作。 、用户登陆信息设置 可以修改用户登陆密码 2、设计目的 学生信息管理系统是一个教育单位不可缺少的部分。一个功能齐全、简单易用的信息管理系统不但能有效地减轻学校相关工作人员的工作负担,它的内容对于学校的决策者和管理者来说都至关重要。所以学生信息管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案、统计和查询数据,这种管理方式存在着许多缺点,如:效率低、保密性差、人工的大量浪费;另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少困难。随着科学技术的不断提高,计算机科学日渐成熟,

编译原理课程设计

编译原理课程设计 自顶向下语法分析器 学院(系):计算机科学与技术学院学生姓名:xxxxxxxxx 学号:xxxxxxxxx 班级:电计1102 大连理工大学 Dalian University of Technology

目录

1 系统概论 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。语法分析器在编译程序中的地位如图1所示: 图1 语法分析器在编译程序中的地位 语言的语法结构是用上下文无关文法描述的。因此,语法分析器的工作本质上就是按文法的产生式,识别输入符号串是否为一个句子。这里所说的输入串是指由单词符号(文法的终结符)组成的有限序列。对一个文法,当给你一串(终结)符号时,怎样知道它是不是该文法的一个句子呢?这就要判断,看是否能从文法的开始符号出发推导出这个输入串。或者,从概念上讲,就是要建立一棵与输入串相匹配的语法分析树。 自顶向下分析法就是语法分析办法中的一类。顾名思义,自顶向下就是从文法的开始符号出发,向下推导,推出句子。这种方法是带“回溯”的。 自顶向下分析的主旨是,对任何输入串,试图用一切可能的办法,从文法开始符号(根结)出发,自上而下地为输入串建立一棵语法树。或者说,为输入串寻找一个最左推导。这种分析过程本质上是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程。 实现这种自顶向下的带回溯试探法的一个简单途径是让每个非终结符对应一个递归子程序。每个这种子程序可作为一个布尔过程。一旦发现它的某个候选与输入串相匹配,就用这个候选去扩展语法树,并返回“真”值;否则,保持原来的语法树和IP值不变,并返回“假”值。 2 需求分析 以前,人们对语法的分析都建立在人工的基础上,人工分析虽然能够做到侧类旁推,但终究人力有限,再精密的分析都会出现或多或少的错误。为减少因人为产生的错误,并加快

CMinus词法分析和语法分析设计编译器编译原理课程设计报告书

编译原理课程设计报告 课题名称:C- Minus词法分析和语法分析设计 提交文档学生姓名:X X X 提交文档学生学号:XXXXXXXXXX 同组成员名单:X X X 指导教师姓名:X X 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:2015年6月10日

1.课程设计目标 实验建立C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。 2.分析与设计 C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。 2.1 、扫描程序scanner部分 2.1.1系统设计思想 设计思想:根据DFA图用switch-case结构实现状态转换。 惯用词法:

①语言的关键字:else if int return void while ②专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 大写和小写字母是有区别的 ④空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM 关键字。 ⑤注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套 scanner的DFA

说明:当输入的字符使DFA到达接受状态的时候,则可以确定一个单词了。初始状态设置为START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA与对此字符的类型分析,转换状态。重复此步骤,直到DONE为止,输出token类型。当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”时转到ENDCOMMENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。 2.1.2程序流程图

Java课程设计实验报告及全部源码流程图

课程设计 一、实验目的 1.加深对课堂讲授内容的理解,掌握解决实际应用问题时所应具有的查阅资料、技术标准和规范,以及软件编程、调试等能力,掌握面向对象的编程思想及Java语言程序设计的规律与技巧,为进一步学习web应用开发及今后从事专业工作打下基础。 2. 使用本学期学习的Java SE技术(也可以使用课堂教学中没有学习过的Java技术,但是应当以Java SE技术为主)完成多功能日历GUI程序的设计,使之具有如下基本功能:一年日历用12页显示,每页显示一个月的日历。日历可以按年或月前后翻动,能够显示当前的日期,可以为每页日历选择背景图片。 3.在完成基本功能的基础上发挥自己的想象力与创造力,使程序凸显出与众不同的特点与功能,形成本小组的特性色。 二、实验要求 1.问题描述准确、规范。 2.程序结构合理,调试数据准确、有代表性.。 3.界面布局整齐,人机交互方便。 4.输出结果正确。 5.正确撰写实验报告。 三、实验内容 编写一个GUI程序实现日历的功能。一年日历用12页显示,每页显示一个月的日历。日历可以按年或月前后翻动,能够显示当前的日期以及当前农历,可以为每页日历选择背景图片。可以实现显示时钟,时钟能进行整点报

时。可以实现备忘记事功能,能在每天添加、修改、删除记事等操作。 四、实验步骤 1.在上机实验前,小组成员进行选题讨论,确定小组感兴趣而又伸缩性强的题目多功能日历。 2.在第一次上机实验时讨论分工,分工明确之后,分头合作进行。 3.各成员完成自己的任务后,最后进行统筹合并,以及程序最后的优化。 4. 根据实验结果,写出合肥工业大学实验报告。实验报告应当包括:实验内容,程序流程图,类结构,程序清单,运行结果,以及通过上机取得的经验。 5.详细的上机实验步骤见任务分工及程序设计进度表。 五、实验结果 经过小组成员的共同努力,最终我们小组设计的多功能日历程序能够实现实验的基本要求——一年日历用12页显示,每页显示一个月的日历。日历可以按年或月前后翻动,能够显示当前的日期,可以为每页日历选择背景图片。另外,在完成基本要求的基础上,我们增添了显示农历、显示时钟、添加备忘录、修改备忘录等功能。整体程序运行流畅、功能齐全、符合操作习惯。 下面是程序运行效果截图: 日历主界面(可以实现每个月的日历,可以按年或按月前后翻动,能够显示当前日期,并能够选择背景图片):

编译原理课程设计-词法分析器(附含源代码)

编译原理-词法分析器的设计 一.设计说明及设计要求 一般来说,编译程序的整个过程可以划分为五个阶段:词法分析、语法分析、中间代码生成、优化和目标代码生成。本课程设计即为词法分析阶段。词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。如保留字(关键字或基本字)、标志符、常数、算符和界符等等。 二.设计中相关关键字说明 1.基本字:也称关键字,如C语言中的 if , else , while , do ,for,case,break, return 等。 2.标志符:用来表示各种名字,如常量名、变量名和过程名等。 3.常数:各种类型的常数,如12,6.88,和“ABC” 等。 4.运算符:如 + ,- , * , / ,%, < , > ,<= , >= 等。5.界符,如逗点,冒号,分号,括号,# ,〈〈,〉〉等。 三、程序分析 词法分析是编译的第一个阶段,它的主要任务是从左到右逐个字符地对源 程序进行 扫描,产生一个个单词序列,用以语法分析。词法分析工作可以是独立的一遍,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件做为语法分析程序的输入而继续编译过程。然而,更一般的情况,常将

词法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则 调用该子程序。词法分析程序每得到一次调用,便从源程序文件中读入一 些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止。 四、模块设计 下面是程序的流程图 五、程序介绍 在程序当前目录里建立一个文本文档,取名为infile.txt,所有需要分析的程序都写在此文本文档里,程序的结尾必须以“@”标志符结束。程序结果输出在同一个目录下,文件名为outfile.txt,此文件为自动生成。本程序所输出的单词符号采用以下二元式表示:(单词种别,单词自身的值)如程序输出结果(57,"#")(33,"include")(52,"<")(33,"iostream") 等。 程序的功能:(1)能识别C语言中所有关键字(共32个)(单词种别分别为1 — 32 ,详情见程序代码相关部分,下同) (2)能识别C语言中自定义的标示符(单词种别为 33) (3)能识别C语言中的常数(单词种别为0) (4)能识别C语言中几乎所有运算符(单词种别分别为41 — 54) (5)能识别C语言中绝大多数界符(单词种别分别为 55 — 66)六、运行结果 输入文件infile.txt 运行结果(输出文件 outfile.txt)

5_Java课程设计源代码

package zhouchuan; import java.applet.*; import java.awt.*; import java.awt.event.*; import https://www.wendangku.net/doc/3416018482.html,.*; public class zhouchuan extends Applet implements ActionListener { AudioClip clip; Button buttonPlay, buttonLoop, buttonStop; public void init(){ try{ URL url=new URL("file:"+"F://ding.wav"); clip=getAudioClip(url);}catch(Exception e){ } buttonPlay=new Button("开始播放"); buttonLoop=new Button("循环播放"); buttonStop=new Button("停止播放"); buttonPlay.addActionListener(this); buttonStop.addActionListener(this); buttonLoop.addActionListener(this); add(buttonPlay); add(buttonLoop); add(buttonStop); } public void stop(){ clip.stop(); } public void actionPerformed(ActionEvent e){ if(e.getSource()==buttonPlay) clip.play(); else if(e.getSource()==buttonLoop) clip.loop();

编译原理课程设计----C语言编译器的实现

$ 编译原理课程设计报告 设计题目编译代码生成器设计 、 学生姓名 班级 学号 指导老师 成绩 `

一、课程设计的目的 编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。 二、课程设计的要求 1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。 2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正 确。 3、@ 4、写出完整的算法框架。 5、编写完整的编译程序。 三、课程设计的内容 课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。通过课程设计可以达到综合设计编译程序的目的。本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。 四、总体设计方案及详细设计 总体设计方案: 1.总体模块

【 2. \ 详细设计: 界面导入设计 (1)一共三个选项: ①choice 1--------cifafenxi ②choice 2--------yufafenxi ③choice 3--------zhongjiandaima (2)界面演示 } 图一

编译原理课程设计

编译原理: 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。编译原理是计算机专业设置的一门重要的专业课程。编译原理课程是计算机相关专业学生的必修课程和高等学校培养计算机专业人才的基础及核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。编译原理课程内容主要是原理性质,高度抽象。 编译原理课程设计: 《编译原理课程设计》是2007年11月浙江大学出版社出版的图书,作者是冯雁、鲁东明、李莹。 内容简介: 本书围绕着编译技术的基本原理和方法,以模拟程序设计语言SPL的编译器的设计和实现为主线,结合词法分析、语法分析、语义分析、代码生成、代码优化、错误处理等各个基本模块,对原理和实现方法进行了详细分析。该编译器可接受SPL的程序,并将其翻译成汇编语言程序,最终实现汇编语言到8086/8088机器语言的翻译。本书为编译技术等相关课程的实验提供了参考。在附件中还提供了三类不同类型和难度的实验题,可供课程实验选择。 第1章引论: 1.1本书介绍 1.2SPL语言的特点及实验安排

1.2.1SPL语言的特点 1.2.2SPL语言编译器的主要结构1.2.3实验安排 1.3平台的选择和介绍 1.3.1LEX简介 1.3.2YACC简介 第2章词法分析: 2.1词法分析器的基本框架 2.2词法分析器的基本原理 2.2.1DFA的构造和实现 2.2.2词法分析的预处理 2.2.3实现词法分析器的注意要点2.3词法分析器的实现 2.3.1SPL语言单词属性字 2.3.2SPL词法分析器的输入和输出2.3.3SPL词法分析器的分析识别第3章语法分析: 3.1语法分析的基本框架 3.1.1上下文无关文法 3.1.2语法分析过程 3.1.3语法分析过程中的数据结构3.2语法分析的基本方法

编译原理课程设计报告

2011-2012学年第二学期 《编译原理》课程设计报告 学院:计算机科学与工程学院 班级: 学生姓名:学号: 成绩: 指导教师: 时间:2012年5 月

目录 一、课程设计的目的 ---------------------------------------------------------------- - 1 - 二、课堂实验及课程设计的内容 -------------------------------------------------- - 1 - 2.1、课堂实验内容-------------------------------------------------------------- - 1 - 2.2、课程设计内容-------------------------------------------------------------- - 1 - 三、visual studio 2008 简介------------------------------------------------------- - 2 - 四、问题分析及相关原理介绍 ----------------------------------------------------- - 3 - 4.1、实验部分问题分析及相关原理介绍 ---------------------------------- - 3 - 4.1.1、词法分析功能介绍及分析------------------------------------- - 3 - 4.1.2、语法分析功能介绍及分析------------------------------------- - 3 - 4.1.3、语义分析功能介绍及分析------------------------------------- - 4 - 4.2、课程设计部分问题分析及相关原理介绍 ---------------------------- - 5 - 4.2.1、编译程序介绍 ----------------------------------------------------- - 5 - 4.2.2、对所写编译程序的源语言的描述(C语言) -------------- - 6 - 4.2.3、各部分的功能介绍及分析 -------------------------------------- - 7 - 4.3、关键算法:单词的识别-------------------------------------------------- - 8 - 4.3.1、算法思想介绍 ----------------------------------------------------- - 8 - 4.3.2、算法功能及分析 -------------------------------------------------- - 8 - 五、设计思路及关键问题的解决方法 ------------------------------------------ - 10 - 5.1、编译系统------------------------------------------------------------------ - 10 - 5.1.1、设计思路 --------------------------------------------------------- - 10 - 5.2、词法分析器总控算法--------------------------------------------------- - 12 - 5.2.1、设计思路 --------------------------------------------------------- - 12 - 5.2.2、关键问题及其解决方法 --------------------------------------- - 13 - 六、结果及测试分析-------------------------------------------------------------- - 14 - 6.1、软件运行环境及限制--------------------------------------------------- - 14 - 6.2、测试数据说明------------------------------------------------------------ - 14 - 6.3、运行结果及功能说明--------------------------------------------------- - 16 - 6.4、测试及分析说明--------------------------------------------------------- - 16 - 七、总结及心得体会 --------------------------------------------------------------- - 17 - 7.1、设计过程------------------------------------------------------------------ - 17 - 7.2、困难与收获 ------------------------------------------------------------- - 17 - 八、参考文献 ------------------------------------------------------------------------ - 18 -

java课程设计2013级大纲以及设计报告

珠海学院课程教学大纲 课程名称:java程序课程设计 适用专业: 2013级计算机科学与技术 课程类别:专业基础课 制订时间:2014年12月 计算机科学与技术系制

目录 1java程序课程设计教学大纲 2 java程序课程设计说明书 3 java程序课程设计报告(模板) 4 java程序课程设计成绩评定表 java程序课程设计教学大纲 (2011年制订,2014年修订) 一、课程编号: 二、前修课程:java程序设计 三、学分:2学分 四、学时: 32学时 五、课程性质与任务: 1.课程性质:《java程序课程设计》是吉林大学珠海学院计算机科学与技术系为本科生各专业开设的专业实践课。计算机科学与技术系本科生在完成《java 程序设计》课程学习后,通过本课程进入专业实践训练环节,其主要目的是使学生深入理解并实践在《java程序设计》课程中所学的有关知识,通过课程设计增强学生的实践动手能力,提高学生独立分析和解决实际问题的能力。培养学生配合完成任务的能力,为学生毕业后的实际工作打好基础。 课程设计是培养学生综合运用所学知识锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。Java语言的应用十分广泛,例如大型信息系统、通信、网络控制等。java课程设计对增强学生对基础知识的掌握和综合运用是非常必要,对后续许多专业课程的学习和实践训练都具十分重要的意义。 2.课程任务:本课程要求学生在学习了java基础编程的相关技术后,将课本中多个章节的编程技术灵活运用到一些复杂的综合例题中去,使学生了解应用问题

的分析方法和设计解决实际问题的具体过程,掌握应用java进行程序设计的基本规范和技巧,掌握面向对象编程的设计思想,重点掌握java的基本语法规则、输入输出方法、网络编程、多线程编程、小应用程序、数据库编程的综合应用。通过编程掌握调试java程序的基本技巧、模块化应用程序和测试运行复杂应用程序的基本流程。 六、课程教学基本要求提供足够多的程序设计选题,题目应覆盖面较为广泛,部分题目要具有开放性,要求每个学生根据自己的实际情况选择题目,经教师批准后即可进入实际工作阶段。 课程设计结束对每个学生进行验收,要求每个学生提交合格的课程设计报告,还要保证程序能够运行,能够讲清楚自己的工作。老师在检查过程中可针对程序提出问题,学生回答,若程序无法运行得到结果并且具有大量编译错误,而且对程序的内容无法正确解释,则实践老师可以根据实际情况给予评分为不及格,若程序可以运行,但完成的界面以及方法不够完善,则酌情扣分,若程序运行无问题,则提问回答不好的也要相应扣分。课程设计课程集中安排在第十一周。每个同学都要提交初期、中期和最后的文档,提交课程设计报告,要求在规定时间内提交文档。最后验收时,若文档不全,成绩受到一定影响。 七、学时分配表 2011年 12 月8日 java程序课程设计说明书

编译原理课程设计

河海大学 编译原理课程设计 学生姓名: 学号: 班级: 专业:--------- 指导教师:

编译原理 课程设计指导书

题目一基于语法制导翻译的表达式转换编译器 一、设计目的 通过本课程设计获得对实际编译器的构造原理、过程和方法的感性认识,全面掌握语法制导翻译技术。 二、设计内容 采用语法制导翻译模式设计一个包含词法分析、语法分析、符号表管理、错误处理及输出等功能模块的、由中缀表达式到后缀表达式的完整编译器。该翻译器的规格说明如下: start → list eof list → expr;list |ε expr → expr + term { print(‘+’) } | expr –term { print(‘-’) } | term term → term * factor { print(‘*’) } | term / factor { print(‘/’) } | term div factor { print(‘DIV’) } | term mod factor { print(‘MOD’) } factor → ( expr ) | id { print( https://www.wendangku.net/doc/3416018482.html, ) } | num { print( num.value ) } 三、设计要求 1、使用模块化设计思想来设计该编译器; 2、词法分析模块用于读入输入串,并将其转换成供语法分析模块使用的记号流。其中包括滤掉空格和注释、识别常数、识别标识符和关键字等功能; 3、要求在语法分析模块中利用语法制导翻译技术完成具体的中缀表达式到后缀表达式的翻译,其中包括按前述翻译器的规格说明构建对应表达式、项、因子的非终结符expr、term 和factor的函数以及检查记号是否匹配的函数;并在不匹配时调用错误处理模块; 4、要求符号表管理模块主要完成符号表对应数据结构的具体实现功能; 5、错误处理模块负责报告错误信息及位置,并终止分析过程; 6、输出模块完成翻译后所得到的后缀表达式的输出。

编译原理课程设计

先简要分析一下语法分析的大致流程: 当有句子要进行处理时,首先要对其进行词法分析来分解出该句子中的每个符号,然后将该句子按照算符优先算法压入归约栈中,如果可以顺利归约,则说明这是一个合法的句子,否则该句子非法。 这里有一个需要考虑的地方,就是如何进行归约。由于文法已经给定,所以我们考虑设计一个文法表,文法表中的内容就是可归约串的种别码的顺序,比如v=E可以表示为9,1,13。这样的话当我们要进行一次归约时,只用按顺序存储最左素短语中符号的种别码,然后拿这个种别码序列与文法表进行匹配,就可知道当前归约需要执行哪些操作。 还有一点需要注意,就是如何对一个表达式进行求值。这里需要我们设计一个二元组的变量名表,这个变量名表可以根据变量的名称来返回变量的数据。变量名表的具体设计见详细设计部分。 由于是简化分析,所以这个程序只考虑整数的处理。 有了上面的分析,可以构造出算符优先分析算法的流程图,如下图所示。

详细设计 (1)词法分析部分 由于词法分析的内容在课程设计1中已经介绍,并且这次的状态转换图与课程设计1中的非常相似,所以这里就不过多介绍。(2)优先关系表 在程序中我们用一个二维数组priTable[][]来存储算符间的优先关系。priTable[a][b]=1表示a>b; 。priTable[a][b]=0表示a=b; 。priTable[a][b]=-1表示a

相关文档