📄 accidence2.java
字号:
import java.io.*;
/*
*本程序是一个词法分析程序,但是这个程序还有一些缺陷,那也就是每个关键盘字、数字、界符、变量之间必须有一个或多个空格符
*还有就是没有检错功能,查错功能。
*本程序先空格符分界再按回车换行分界再对整个字符串进行分离,
*按空格符进行分界是指把所扫描一次的源文件的所有符号串按照空格符的个数分成几组,
*即:
1空格,回车,空格(可能会有多个回车)
2空格,回车,字符,空格(字符中可能包含多个回车)
3空格,回车,字符,回车,空格(字符中可能包含多个回车)
4空格,字符,回车,空格(字符中可能包含多个回车)
5空格,字符,空格(字符中可能包含多个回车)
*然后再按回车换行进行分界,按回车换行分界与按照空格符分界的意义一致,只是标准不一样而已,
*即:
1字符串有回车的情况,没有考滤最后一个回车与最后一个空格的情况
2字符串中回车到最后一个空格的情况(空格,回车,字符,回车,字符,空格--第二回车与空格的情况)
3字符中没有回车的情况
*分离是如 a123=10;对进条语句进行分离成a123,=,10,;四个符串符并存入chararcter数组中,
*已经对程序进行了修正,每个关键盘字、数字、界符、变量之间必须有一个或多个空格符缺陷修复只是一个检错功能还没有完成
*而且代码优化也没有做,代码逻辑也不好
*至此2006年10月1日下午17:13完成
*/
//词法分析
public class Accidence2{
public static void main(String[] args){
String[] kword={"begin","call","end","for","if","else","const","program","write","read","then","var","while","integer"}; //存放关键字
String[] ktype={"b","c","e","f","i","g","o","p","q","r","t","v","w","m"}; //关键字对应的值
String[] character = new String[1024];
int[] space = new int[512];
byte[] buf = new byte[1024]; //用来存放文件所有字节,不行超过1024个字符
int len = 0;
String str = null;
// int lineNumber = 0; //用来计算行号
try{
//首先读入程序文件
FileInputStream fis = new FileInputStream("test.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
//byte[] buf = new byte[1024];
len = dis.read(buf);
str = new String(buf,0,len);
System.out.println(str);
System.out.println(len);
//读取writeBytes()和writeChars()写入的数据,一般是比较困难的,所以比较少用
dis.close();
int bankcount = 0; //记录最后一个空格符位置
byte by = ' ';
//以下是把文件空格位置存入一个串数组中
System.out.println("空格符的位置:");
for(int j=0,i=0;i<len;i++){
if(buf[i]==by){
space[j++]=i;
bankcount=i;
System.out.println(space[j-1]);
}
}
System.out.println("放进character数组里面的符号(串)是:");
//以下程序段是把所有的非空格,非回车,非换行放在娄组character中
int j=0;
String word = null;
if(space[0]!=0){
word = new String(buf,0,space[0]);
character[j++]=word;
System.out.println(character[j-1]);
}
for(int i=1;i<space.length;i++){
if((space[i]-space[i-1])>1) {
if(buf[space[i-1]+1]=='\r'&&buf[space[i-1]+2]=='\n'&&(space[i]-space[i-1])==3){ //空格回车空格__包含空格字符空格 1
continue;
}else if(buf[space[i-1]+1]=='\r'&&buf[space[i-1]+2]=='\n'&&buf[space[i]-1]!='\n'&&buf[space[i]-2]!='\r'){ //空格回车字符空格__包含空格字符空格 2
for(int startword =space[i-1]+3,endword=0,k=space[i-1]+3;k<=space[i];k++){
if(buf[k]=='\r'&&buf[k+1]=='\n'){ // 2.1 字符串有回车的情况,没有考滤最后一个回车与最后一个空格的情况
endword = k;
//以下一个for是一个对字符串进行分解代码
for(int fianlLetter=0, countletter=startword;countletter<endword;countletter++){
if(buf[countletter]=='+'||buf[countletter]=='-'||buf[countletter]=='*'||buf[countletter]=='/'||(buf[countletter]=='='&&buf[countletter-1]!=':')){
if(fianlLetter!=0){
word = new String(buf,startword,fianlLetter);
character[j++]=word;
System.out.println(character[j-1]);
//startword = startword+1;
}
startword=countletter;
word = new String(buf,startword,1);
character[j++]=word;
System.out.println(character[j-1]);
startword = startword+1;
fianlLetter=0;
}else if((buf[countletter]==':'&&buf[countletter+1]=='=')||(buf[countletter]=='>'&&buf[countletter+1]=='=')||(buf[countletter]=='<'&&buf[countletter+1]=='=')){
if(fianlLetter!=0){
word = new String(buf,startword,fianlLetter);
character[j++]=word;
System.out.println(character[j-1]);
//startword = startword+1;
}
startword=countletter;
word = new String(buf,startword,2);
character[j++]=word;
System.out.println(character[j-1]);
startword = startword+2;
fianlLetter=0;
}else if(buf[countletter]=='('||buf[countletter]==')'||buf[countletter]==','||buf[countletter]==':'||buf[countletter]==';'||(buf[countletter]=='>'&&buf[countletter+1]!='=')||(buf[countletter]=='<'&&buf[countletter+1]!='=')){
if(fianlLetter!=0){
word = new String(buf,startword,fianlLetter);
character[j++]=word;
System.out.println(character[j-1]);
//startword = startword+1;
}
startword=countletter;
word = new String(buf,startword,1);
character[j++]=word;
System.out.println(character[j-1]);
startword = startword+1;
fianlLetter=0;
}else if((buf[countletter]>='a'&&buf[countletter]<='z')||buf[countletter]>='0'&&buf[countletter]<='9'){
fianlLetter++;
}
}
if(startword ==(space[i-1]+3)){
word = new String(buf,startword,endword-startword);
character[j++]=word;
System.out.println(character[j-1]);
startword = k+2;
}else{
startword+=2;
}
}else if(k==space[i]&&startword>(space[i-1]+3)){ //2.2 字符串中回车到最后一个空格的情况(空格,回车,字符,回车,字符,空格--第二回车与空格的情况)
int orignal=startword;
endword = k;
//以下一个for是一个对字符串进行分解代码
for(int fianlLetter=0, countletter=startword;countletter<endword;countletter++){
if(buf[countletter]=='+'||buf[countletter]=='-'||buf[countletter]=='*'||buf[countletter]=='/'||(buf[countletter]=='='&&buf[countletter-1]!=':')){
if(fianlLetter!=0){
word = new String(buf,startword,fianlLetter);
character[j++]=word;
System.out.println(character[j-1]);
//startword = startword+1;
}
startword=countletter;
word = new String(buf,startword,1);
character[j++]=word;
System.out.println(character[j-1]);
startword = startword+1;
fianlLetter=0;
}else if((buf[countletter]==':'&&buf[countletter+1]=='=')||(buf[countletter]=='>'&&buf[countletter+1]=='=')||(buf[countletter]=='<'&&buf[countletter+1]=='=')){
if(fianlLetter!=0){
word = new String(buf,startword,fianlLetter);
character[j++]=word;
System.out.println(character[j-1]);
//startword = startword+1;
}
startword=countletter;
word = new String(buf,startword,2);
character[j++]=word;
System.out.println(character[j-1]);
startword = startword+2;
fianlLetter=0;
}else if(buf[countletter]=='('||buf[countletter]==')'||buf[countletter]==','||buf[countletter]==';'||buf[countletter]==':'||(buf[countletter]=='>'&&buf[countletter+1]!='=')||(buf[countletter]=='<'&&buf[countletter+1]!='=')){
if(fianlLetter!=0){
word = new String(buf,startword,fianlLetter);
character[j++]=word;
System.out.println(character[j-1]);
//startword = startword+1;
}
startword=countletter;
word = new String(buf,startword,1);
character[j++]=word;
System.out.println(character[j-1]);
startword = startword+1;
fianlLetter=0;
}else if((buf[countletter]>='a'&&buf[countletter]<='z')||buf[countletter]>='0'&&buf[countletter]<='9'){
fianlLetter++;
}
}
if(startword==orignal){
word = new String(buf,startword,endword-startword);
character[j++]=word;
System.out.println(character[j-1]);
}
// startword = k+2;
}else if(k==space[i]&&startword==(space[i-1]+3)){ //2.3 字符中没有回车的情况
endword = k;
//以下一个for是一个对字符串进行分解代码
for(int fianlLetter=0, countletter=startword;countletter<endword;countletter++){
if(buf[countletter]=='+'||buf[countletter]=='-'||buf[countletter]=='*'||buf[countletter]=='/'||(buf[countletter]=='='&&buf[countletter-1]!=':')){
if(fianlLetter!=0){
word = new String(buf,startword,fianlLetter);
character[j++]=word;
System.out.println(character[j-1]);
//startword = startword+1;
}
startword=countletter;
word = new String(buf,startword,1);
character[j++]=word;
System.out.println(character[j-1]);
startword = startword+1;
fianlLetter=0;
}else if((buf[countletter]==':'&&buf[countletter+1]=='=')||(buf[countletter]=='>'&&buf[countletter+1]=='=')||(buf[countletter]=='<'&&buf[countletter+1]=='=')){
if(fianlLetter!=0){
word = new String(buf,startword,fianlLetter);
character[j++]=word;
System.out.println(character[j-1]);
//startword = startword+1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -