FOR循环语句的翻译程序设计(简单优先法、三地址码)JAVA资料
发布时间:2018-11-14 17:31:27
发布时间:2018-11-14 17:31:27
课内实践报告
课程名称 编译原理
课内实践任务书
学生姓名: 李潇颖 专业班级: 计算机1201班
指导教师: 林泓 工作单位:计算机科学与技术学院
题目: FOR循环语句的翻译程序设计(简单优先法、输出三地址码)
初始条件:
理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。
要求完成的主要任务: (包括课内实践工作量及其技术要求,以及说明书撰写等具体要求)
(1) 写出符合给定的语法分析方法的文法及属性文法。
(2) 完成题目要求的中间代码三地址码的描述。
(3) 写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5) 设计报告格式按附件要求书写。课内实践报告书正文的内容应包括:
1 系统描述(问题域描述);
2 文法及属性文法的描述;
3 语法分析方法描述及语法分析表设计;
4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;
5 编译系统的概要设计;
6 详细的算法描述(流程图或伪代码);
7 软件的测试方法和测试结果;
8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);
9 参考文献(按公开发表的规范书写)。
时间安排:
设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课内实践报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 年 月 日
系主任(或责任教师)签名:
目录
1 系统描述(问题域描述) 3
1.1设计目的 3
1.2设计内容描述 3
2.文法的描述 3
3 语法分析方法描述及语法分析表设计 4
3.1语法分析方法描述 4
3.2 分析法操作步骤 4
3.3优先关系矩阵 5
4 中间代码形式的描述 6
5 编译系统的概要设计(主要函数) 6
6 详细的算法描述(流程图) 7
6.1词法分析过程 7
6.2语法分析过程 0
6.3三地址码的输出 0
7 测试方法和测试结果 1
8.心得体会 4
9.代码(完整) 5
10.本科生课内实践成绩评定表 14
FOR循环语句的翻译程序设计(简单优先法、输出三地址码)
通过学习编译原理的相关内容,设计并编写FOR循环语句的翻译程序,使用简单优先法,按三地址码输出,能够实现词法分析,语法和语义的分析,加深对所学知识的理解,并且能够熟练运用到实际当中。
FOR循环语句的基本格式如下:
FOR(表达式1;表达式2;表达式3){赋值语句}
根据所给题目要求,设计出符合FOR循环语句的文法及属性文法的描述,语法分析方法以及三地址码的输出方式,罗列出词法分析和语法分析的流程,根据语法规则设计输入输出方法,简单优先法中的优先关系表格。设计好并且进行编译,设计若干输入输出用例(包括正确的输入和错误的输入,用来检查程序的完整性)。
根据For语句的特点,制定的产生式规则及由产生式对应的语义动作如下:
H->f(G;A;B){S;} GOTO
H->f(G;C;D){S;} GOTO
G->i1=i2 i1.CODE=i2.CODE
A->i12 IFi1.CODE>=i2.CODE GOTO OVER
B->id i.CODE=i.CODE+1
C->i1>i2 IFi1.CODE<=i2.CODE GOTO OVER
D->ia i.CODE=i.CODE-1
S->j=M j.CODE=M.CODE
M->E M.CODE=E.CODE
E->W E.CODE=W.CODE
W->W+U W.CODE=W.CODE+U.CODE
W->W-U W.CODE=W.CODE-U.CODE
W->U W.CODE=U.CODE
U->T U.CODE=T.CODE
T->T*F T.CODE=T.CODE”F.CODE
T->T/F T.CODE=T.CODE/F.CODE
T->F T.CODE=F.CODE
F->(E) F.CODE=(E.CODE)
F->j F.CODE=j.CODE
(备注:其中d表示--,a表示++)
本次课内实践要求使用简单优先关系方法。
简单优先分析法的基本思想史对一个文法按照一定原则求出该文法所有符号即包括终结符和非终结符之间的优先关系确定归约过程中的句柄,它的归约实际上是一种规范归约。一个文法是简单优先文法必须满足以下条件
(1)在文法符号集V中,任意两个符号之间最多只有一种优先关系成立;
(2)在文法中任意两个产生式没有相同的右部。
三种优先关系及其判定方法如下所示:
(1)X=Y 表示X和Y的优先关系相等,当且仅当G中存在产生式规则A→…XY…;
(2)X
A→…XB…,且BY…;
(3)X>Y表示X的优先性比Y的优先性大,当且仅当G中存在产生式规则
A→…BD…,且B…X和DY…;
(4)对任何X,若文法开始符号S→X…,则#
由简单优先分析法的基本思想设计的如下算法,首先要构造优先关系矩阵(如3.3所示),并将文法产生式保存,设置符号数组S:
(1)将输入符号串a1a2…an # 依次逐个保存符号数组S中,直到遇到数组中第一个符号ai的优先性>下一个待输入符号aj为止。
(2)数组当前符号ai为句柄尾,由此向左在数组中找句柄的头符号ak,即找到ak-1k为止。
(3)由句柄ak…ai在文法的产生式中查找右部为ak…ai的产生式,若找到则用相应左部代替句柄,找不到则为出错,这是可断定输入串不是该文法的句子。
(4)重复(1)(2)(3),直到归约完输入符号串,数组中只剩文法的开始符号为止。
空白表示,没有优先级关系
三地址码是由下面一般形式的语句构成的序列: x:=y op z
其中,xyz为名字、常数或变量;op代表运算符。
对于本程序的具体三地址码输出,预计显示结果如下:
给定输入程序for(i=0;i<10;i++){j=b+c;}
三地址码输出为
<1> i=0
<2> goto <5>
<3> i++
<4> if i<10 goto<5> else goto<7>
<5> j=b+c
<6> goto<3>
<7> end
主要函数及对应实现的功能如下表所示:
给定输入程序for(i=0;i<10;i++){j=b+c;}
词法分析结果为
关键字为:1;
标识符为:2;
常数为:3;
运算符为:4;
界符为:5
<( 5>
<= 4>
<0 3>
<; 5>
<< 4>
<10 3>
<; 5>
<++ 4>
<) 5>
<{ 5>
<= 4>
<+ 4>
<; 5>
<} 5>
给定输入程序for(i=0;i<10;i++){j=b+c;}
三地址码输出为
<1> i=0
<2> goto <5>
<3> i++
<4> if i<10 goto<5> else goto<7>
<5> j=b+c
<6> goto<3>
<7> end
计算机系统:Windows 7
编译调试环境:Eclipse
程序语言:JAVA
设计测试用例:
(1)data.txt中保存如下程序段for(i=0;i<10;i++){j=b+c;}
输出如下结果
(2)data.txt中保存如下程序段for(i=5;i>0;i--){j=a*(h+c);}
输出如下结果
经过这次课内实践,使我更加扎实的掌握了有关编译原理方面的知识,在编写程序的过程中遇到了许多问题,但经过一遍遍的调试终于使得程序可以顺利运行。但是程序中存在着很大的不足:例如在for循环语句的循环体中只能有一个赋值语句。对for()括号中的格式也有着严格的输入要求等等,这些都是以后要改进的地方。
过而能改,善莫大焉。在课内过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课内实践终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
回顾这次课内实践,是一个痛并快乐的过程,在构造简单优先文法的矩阵时我尝试了5次构造,花费了许多时间,但是当成功构造出来时那种喜悦也是难以言表的。学习是个不断提升自我的过程。
package lxy;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.*;
public class Bianyiyuanlikeshe{
public static String sy[]=new String[100];
static int js=0;
static String m[]=new String[4];
public static String sh=new String();
public static void main(String[] args)
{
String s[]=new String[19];
s[0]="f(G;A;B){S;}";
s[1]="f(G;C;D){S;}";s[2]="i=i";
s[3]="i;s[4]="id";s[5]="i>i";
s[6]="ia";s[7]="j=M";s[8]="E";
s[9]="W";s[10]="W+U";s[11]="W-U";
s[12]="U";s[13]="T";
s[14]="T*F";s[15]="T/F";
s[16]="F";s[17]="(E)";
s[18]="j";
char ss[]=new char[19];
ss[0]='H';ss[1]='H';
ss[2]='G';ss[3]='A';
ss[4]='B';ss[5]='C';
ss[6]='D';ss[7]='S';
ss[8]='M';ss[9]='E';
ss[10]='W';ss[11]='W';
ss[12]='W';ss[13]='U';
ss[14]='T';ss[15]='T';
ss[16]='T';ss[17]='F';
ss[18]='F';
cifafenxi();
String pp=new String();
pp="";
for(int i=0;i<sh.length();i++){
if(!sy.equals("null"))pp=pp+sy[i];}
String[] re=pp.split(";|\\{|r");
m[0]=re[1];
char tt[]=m[0].toChar();m[0]="";
for(int i=1;i<m.length;i++)m[0]=m[0]+String.valueOf(tt[i]);
m[1]=re[2];
m[2]=re[3];
char ttt[]=m[2].toChar();m[2]="";
for(int i=0;i<m.length-1;i++)m[2]=m[2]+String.valueOf(ttt[i]);
m[3]=re[4];
String n=new String();
System.out.println ("采用文法:");
for(int i=0;i
System.out.println ("语法分析结果");
String str=new String();
str=sh+"#";
char r[]=str.toChar();
char ru[]=new char[r.length];
int l=r.length;
for(int i=0;i
char fu[]=new char[ru.length ];
fu[0]='#';
int coutru=ru.length-1;
int coutfu=0;
int coutbi=0;
char bi[]=new char[ru.length];
while(fu[1]!='H'){
//System.out.println(fu[coutfu]+" "+ru[coutru]);
int b=bijiao(fu[coutfu],ru[coutru]);
if (b==-1){System.out.println("wrong");System.out.println(coutfu+"wrong"+coutru);return ;}
if(b==0||b==1){
if(b==0)
{ coutfu++;
//System.out.println(coutfu);
fu[coutfu]=ru[coutru];
for(int i=0;i
System.out.print(" ");
for(int i=coutru;i>=0;i--){System.out.print(ru[i]);}
System.out.println();
System.out.println(ru[coutru]+" 移入");
bi[coutbi]='0';
coutbi++;
coutru--;}
if(b==1)
{coutfu++;
fu[coutfu]=ru[coutru];
for(int i=0;i
System.out.print(" ");
for(int i=coutru;i>=0;i--){System.out.print(ru[i]);}
System.out.println();
System.out.println(ru[coutru]+" 移入");
bi[coutbi]='1';
coutbi++;
coutru--;}}
if(b==2){
int m=0;
for (int i=coutbi-1;i>=0;i--)
{if(bi[i]=='1')break;else m++;}
for(int j=0;j<=coutfu;j++){System.out.print(fu[j]);}
System.out.print(" ");
for(int j=coutru;j>=0;j--){System.out.print(ru[j]);}
System.out.println();
coutbi=coutbi-m;String str2=new String();
String str3=new String();
for(int i=0;i<=m;i++)
{
str3=String.valueOf(fu[coutfu])+str3;
if(fu[coutfu]!=';'&&fu[coutfu]!='f'&&fu[coutfu]!='>'&&fu[coutfu]!='<'&&fu[coutfu]!='B'&&fu[coutfu]!='C'&&fu[coutfu]!='D'&&fu[coutfu]!='H'&&fu[coutfu]!='G'&&fu[coutfu]!='A'&&fu[coutfu]!='i'&&fu[coutfu]!='S'&&fu[coutfu]!='M'&&fu[coutfu]!='W'&&fu[coutfu]!='U'&&fu[coutfu]!='T'&&fu[coutfu]!='F'&&
fu[coutfu]!='='&&fu[coutfu]!='+'&&fu[coutfu]!='-'&&fu[coutfu]!='*'&&fu[coutfu]!='/'&&fu[coutfu]!='('&&fu[coutfu]!=')'&&fu[coutfu]!='E'&&fu[coutfu]!='#'&&fu[coutfu]!='j'&&fu[coutfu]!='#'&&fu[coutfu]!='j'&&fu[coutfu]!='a'&&fu[coutfu]!='d'&&fu[coutfu]!='{'&&fu[coutfu]!='}')
str2="i"+str2;
else
str2=String.valueOf(fu[coutfu])+str2;coutfu--;}
for(int i=0;i
{if(str2.equals(s[i]))
{fu[++coutfu]=ss[i];
System.out.println(ss[i]+"->"+s[i]+" 规约");
n=n+Sandizhima(s[i]);
}}
int t=bijiao(fu[coutfu-1],fu[coutfu]);
if(t==0)bi[coutbi-1]='0';
else if(t==1)bi[coutbi-1]='1';
else bi[coutbi-1]='2';
}}if(fu[1]=='H')System.out.println("成功!");
System.out.println("生成的三地址为:");
String m[]=n.split(",");
for(int k=0;k
System.out.println(m[k]);}
public static int bijiao(char f,char r){
int rr=0,ff=0;
char z[]={'H','G','A','B','S','C','D','M','E','W','U','T','F','f','(',';',')','{','}','i','=','<','d','>','a','j','+','-','*','/','#'};
int fc=0;int rc=0;
for(int i=0;i
if(f!=z[i])fc++;if(r!=z[i])rc++;}
if(fc==16)f='i';if(rc==16)r='i';
for (int i=0;i
if(r==z[i])rr=i;if(f==z[i])ff=i;}
int a[][]={{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 0, 0, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, 0, -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},
{-1, -1, 0, 0, -1, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 0, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, -1},
{-1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, -1, -1, -1, 0, -1, -1, -1, -1, -1, 2, 2, 2, 2, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1},
{1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
};
//-1表示没关系,0表示等于,2表示大于,1表示小于
return a[ff][rr];
}
public static String Sandizhima(String p){
char a;int j=0;
String s[]=new String[19];
s[0]="f(G;A;B){S;}";s[1]="f(G;C;D){S;}";
s[2]="i=i";s[3]="i;
s[4]="id";s[5]="i>i";
s[6]="ia";s[7]="j=M";
s[8]="E";s[9]="W";
s[10]="W+U";s[11]="W-U";
s[12]="U";s[13]="T";
s[14]="T*F";s[15]="T/F";
s[16]="F";s[17]="(E)";
s[18]="j";
for(int i=0;i<19;i++)if(p.equals(s[i]))j=i;
char ss[]=new char[19];
ss[0]='H';ss[1]='H';
ss[2]='G';ss[3]='A';
ss[4]='B';ss[5]='C';
ss[6]='D';ss[7]='S';
ss[8]='M';ss[9]='E';
ss[10]='W';ss[11]='W';
ss[12]='W';ss[13]='U';
ss[14]='T';ss[15]='T';
ss[16]='T';ss[17]='F';
ss[18]='F';
if(j==7){
String f=new String();
f=",<5> "+m[3]+",<6> goto<3>"+",<7> end";
return f;}
if(j==4){
String f=new String();
f=",<3> "+m[2]+",<4> if "+m[1]+" goto<5> else goto<7>";
return f;}
if(j==6){
String f=new String();
f=",<3> "+m[2]+",<4> if "+m[1]+" goto<5> else goto<7>";
return f;}
if(j==2){
String f=new String();
f="<1> "+m[0]+",<2> "+"goto <5>";
return f;
}return"";}
public static void sansidzhima(String m){
char b[]=m.toChar();
String a[]=new String[b.length];
for(int i=0;i
String f[]={"+","-","*","/","="};
int c2=1;int bc=0;int t=0;
for(int i=0;i
for(int j=0;j
System.out.print("("+String.valueOf(c2)+")"+"("+a[i]+",");a[i]=null;
for(int k=i-1;k>=0;k--){
if(a[k]!=null&&cc<2){if(cc==0)System.out.print(a[k]+",");if(cc==1)System.out.print(a[k]);cc++;a[k]=null;}
}System.out.print(")");System.out.println();
a[i]="("+String.valueOf(c2)+")";c2++;break;}}}}
public static int yunsuanfu(char a){
boolean b;
if(a=='i')return 0;
char p[]={'+','-','*','/',')','('};
for(int i=0;i
if(a==p[i])return 2;
}
return 0;
}
public static void cifafenxi()
{
System.out.println("关键字为:1;" );System.out.println ("标识符为:2;" );
System.out.println ("常数为:3;" );System.out.println ("运算符为:4;");
System.out.println ("界符为:5");System.out.println ("词法分析结果");
readFileByChars("c:/data.txt");char x[]=sh.toChar();
for(int i=13;i<sh.length();i++){
if(x[i]=='i')x[i]='j';}sh="";
for(int i=0;i
public static void readFileByChars(String fileName) {
Reader reader = null;
try {char[] tempchars = new char[3000];
int charread = 0;
String str1=new String();String str3=new String();
int c=0;reader = new InputStreamReader(new FileInputStream(fileName));
// 读入多个字符到字符数组中,charread为一次读取字符数
while ((charread = reader.read(tempchars)) != -1) {
// 屏蔽掉\r不显示
if ((charread == tempchars.length)
&& (tempchars[tempchars.length - 1] != '\r')) {
System.out.print(tempchars);} else {for (int i = 0; i < charread; i++) {
if (tempchars[i] == '\r'||tempchars[i] == '\n') {continue;}
else {boolean b1,b2,b3,b4;
String str = String.valueOf(tempchars[i]);
b1=Isjiefu(str);
b2=Isyunsuanfu(str);
if(!b1&&!b2&&c==0)
{str1=str1+str;}
else{
if((str.equals("|")||str.equals("&")||str.equals("=")||str.equals(">")||str.equals("<")||str.equals("-")||str.equals("!")||str.equals("+"))&&c<=1){
str3=str3+str;c++;if(c==1)continue;}
if(str3.equals(""))str3=str;
if(c==1)b2=true;b3=Isguanjianzi(str1);
if(b3==true){System.out.println("<"+str1+" 1"+">");
sh=sh+"f";sy[js]=str1;js++;}
else
{b4=Ischangshu(str1);
if(b4==true&&!str1.equals("")){
System.out.println("<"+str1+" 3"+">");
sh=sh+"i";sy[js]=str1;js++;}
else{if(!str1.equals(""))
{System.out.println("<"+str1+" 2"+">");
sh=sh+"i";sy[js]=str1;js++;}}}
shuchu(b1,b2,str3);
if(c==1)str1=str;
else str1="";str3="";c=0;b1=b2=true;}}}}}}
catch (Exception e1) {
e1.printStackTrace();
} finally {if (reader != null) {
try {reader.close();
} catch (IOException e1) {}}}}
public static boolean Isjiefu(String a){
String jiefu []=new String[]{";",",","'","\"","//","(",")"," ","{","}","[","]","#"};
boolean p=false;
for (int i=0;i<12;i++)
if (a.equals(jiefu[i]))p=true;
return p;}
public static boolean Isyunsuanfu(String a){
String yunsuanfu []=new String[]{"+","-","*","/","<",">","<=",">=","=","!=","%","++","--","==","&&","||"};
boolean p=false;
for (int i=0;i<14;i++)
if (a.equals(yunsuanfu[i]))p=true;return p;}
public static boolean Isguanjianzi(String a){
String guanjianzi []=new String[]{"include","iostream","using","namespace","std","void","main","return","int","bool","long","char","double","string","new","const","if","elseif","else","while","for"};
boolean p=false;for (int i=0;i
if (a.equals(guanjianzi[i]))p=true;return p;}
public static boolean Ischangshu(String a){
for (int i = a.length();--i>=0;){
if (!Character.isDigit(a.charAt(i))){
if(a.charAt(i)!='.')return false;}}return true;}
public static void shuchu(boolean a,boolean b,String st){
if(a==true&&!st.equals(" ")){
System.out.println("<"+st+" 5"+">");
sh=sh+st;sy[js]=st;js++;}
else if(st.equals(" "))System.out.print("");
else{ System.out.println("<"+st+" 4"+">");
if(st.equals("++"))sh=sh+"d";
else if(st.equals("--"))sh=sh+"a";
else sh=sh+st;sy[js]=st;js++;}} }
班级:计算机1201班 姓名:李潇颖 学号:0121210340527
注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名: