📄 byylscanner.java
字号:
*/
private int falseLine;
/**
*真出口地址数组中即将生成的下一个出口的序号
*/
private int trueLine;
/**
*用于判断简单的复赋值语句(变量:= 数值)是否修改符号表<br>
*嵌套在其它语句(如 if 语句)中的简单赋值语句不修改符号表,用isChange=0表示<br>
*不嵌套在其它语句的简单赋值语句需要修改符号表,用isChange=1表示
*/
private int isChange;
/**
*isFor=1表示是嵌套在for语句中的
*/
private int isFor;
/**
*用于记录(+,t1,1,t1)四元式的序号
*/
private int nextFor;
/**
*构造函数,生成窗体、菜单及为菜单添加监听事件
*/
public ByylScanner(){
//构造函数,即初始化
frame =new Frame("Simple 语言编译器");
frame.setSize(800,700);
frame.setBackground(Color.GRAY);
frame.setLocation(0,0);
menubar=new MenuBar();
menuFile=new Menu("文件");
menuFileOpen=new MenuItem("打开");
menuFileClose=new MenuItem("关闭");
menuFileExit= new MenuItem("退出");
//添加监听事件
menuFileOpen.addActionListener(new ActionListener() //点击menuFileOpen"打开"将要执行的代码
{
public void actionPerformed(ActionEvent e)
{
if(fileFlag==2)
try{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setFile(currentFile.toString());
fileSaver.setTitle("保存原文件为");
fileSaver.setVisible(true);
try{
currentFile=new File(fileSaver.getFile());
}catch(Exception oe) {return;};
fos=new FileOutputStream(currentFile);
saveText=new String(inputTextArea.getText());
fos.write(saveText.getBytes());
}catch(IOException Ioe) {};
if(fileFlag==1)//打开的文件,保存后退出
try{
fos=new FileOutputStream(currentFile);
saveText=new String(inputTextArea.getText());
fos.write(saveText.getBytes());
}catch(IOException Ioe) {};
fileFlag=0;
inputTextArea.setText("");
resultTextArea.setText("");
tokenTextArea.setText("");
symbolTableTextArea.setText("");
try{
fileChooser= new FileDialog(frame);
fileChooser.setMode(0);
fileChooser.setTitle("打开文件");
fileChooser.setVisible(true);
try{
currentFile=new File(fileChooser.getFile());
}catch(Exception oe) {return;};
fis=new FileInputStream(currentFile);
len=fis.available();
buffer=new byte[len];
fis.read(buffer);
inputTextArea.setText(new String(buffer));
}catch(IOException Ioe) {};
frame.setTitle("Simple 语言编译器"+currentFile.toString());
}
}
);
menuFileClose.addActionListener(new ActionListener() //点击menuFileClose"关闭"将要执行的代码
{
public void actionPerformed(ActionEvent e)
{
if(fileFlag==2) //新建的文件,还没有文件名
try{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setFile(currentFile.toString());
fileSaver.setTitle("保存原文件为");
fileSaver.setVisible(true);
try{
currentFile=new File(fileSaver.getFile());
}catch(Exception oe) {return;};
fos=new FileOutputStream(currentFile);
saveText=new String(inputTextArea.getText());
fos.write(saveText.getBytes());
}catch(IOException Ioe) {};
if(fileFlag==1)//打开的文件,保存后退出
try{
fos=new FileOutputStream(currentFile);
saveText=new String(inputTextArea.getText());
fos.write(saveText.getBytes());
}catch(IOException Ioe) {};
currentFile= new File("");
inputTextArea.setText("");
symbolTableTextArea.setText("");
resultTextArea.setText("");
tokenTextArea.setText("");
fileFlag=0;
frame.setTitle("Simple 语言编译器"+currentFile.toString());
for(int i=0;i<tokenCount;i++)
{
tokenList[i].address=0;
tokenList[i].code=0;
tokenList[i].label=0;
tokenList[i].name.delete(0,tokenList[i].name.length());
}
for(int i=0;i<varCount;i++)
{
symbolList[i].addr=0;
symbolList[i].kind.delete(0,symbolList[i].kind.length());
symbolList[i].name.length=0;
symbolList[i].name.start=0;
symbolList[i].sign.delete(0,symbolList[i].sign.length());
symbolList[i].type.delete(0,symbolList[i].type.length());
symbolList[i].val.delete(0,symbolList[i].val.length());
}
}
}
);
menuFileExit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(fileFlag==2)//新建的文件,还没有文件名
try{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setFile(currentFile.toString());
fileSaver.setTitle("保存原文件为");
fileSaver.setVisible(true);
try{
currentFile=new File(fileSaver.getFile());
}catch(Exception oe){return;};
fos=new FileOutputStream(currentFile);
saveText=new String(inputTextArea.getText());
fos.write(saveText.getBytes());
}catch(IOException Ioe) {};
if(fileFlag==1)//打开的文件,保存后退出
try{
fos=new FileOutputStream(currentFile);
saveText=new String(inputTextArea.getText());
fos.write(saveText.getBytes());
}catch(IOException Ioe) {};
fileFlag=0;
System.exit(0);
}
}
);
menuFile.add(menuFileOpen);
menuFile.add(menuFileClose);
menuFile.add(menuFileExit);
menuBuild=new Menu("编 译");
menuBuildMorphemeAnalysis=new MenuItem("词法分析");
menuBuildParsing=new MenuItem("语法/语义分析");
menuBuildMorphemeAnalysis.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
beginScanner(); //调用词法分析子程序
symbolTableTextArea.append("\n\n字符串为"+alphabet.toString());
}
}
);
menuBuildParsing.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
parser(); //调用语法/语义分析子程序
}
}
);
menuBuild.add(menuBuildMorphemeAnalysis);
menuBuild.add(menuBuildParsing);
menuSave=new Menu("保 存");
menuSaveSymbol=new MenuItem("保存符号表");
menuSaveSource=new MenuItem("保存原文件");
menuSaveToken=new MenuItem("保存Token");
menuSaveCode=new MenuItem("保存四元式");
menuSave.add(menuSaveSource);
menuSave.add(menuSaveSymbol);
menuSave.add(menuSaveToken);
menuSave.add(menuSaveCode);
menuSaveSource.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println(fileFlag);
if(fileFlag==2)
try{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setFile(currentFile.toString());
fileSaver.setTitle("保存原文件为");
fileSaver.setVisible(true);
try{
currentFile=new File(fileSaver.getFile());
}catch(Exception oe) {return;};
fos=new FileOutputStream(currentFile);
saveText=new String(inputTextArea.getText());
fos.write(saveText.getBytes());
}catch(IOException Ioe) {};
if(fileFlag==1)//打开的文件,保存
try{
fos=new FileOutputStream(currentFile);
saveText=new String(inputTextArea.getText());
fos.write(saveText.getBytes());
}catch(IOException Ioe) {};
fileFlag=0;
frame.setTitle("Simple 语言编译器"+currentFile.toString()+"-已保存");
}
}
);
menuSaveSymbol.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
try{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setTitle("保存符号表文件为");
fileSaver.setVisible(true);
try{currentFile=new File(fileSaver.getFile());}catch(Exception oe) {return;};
fos=new FileOutputStream(currentFile);
saveText=new String(symbolTableTextArea.getText());
for(int i=0;i<saveText.length();i++) //这样可以换行
{
if(saveText.charAt(i)=='\n')
{
fos.write(13);
fos.write(10);
}
else
fos.write(saveText.charAt(i));
}
}catch(IOException Ioe) {};
}
}
);
menuSaveToken.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
try{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setTitle("保存token文件为");
fileSaver.setVisible(true);
try{
currentFile=new File(fileSaver.getFile());
}catch(Exception oe) {return;};
fos=new FileOutputStream(currentFile);
saveText=new String(tokenTextArea.getText());
for(int i=0;i<saveText.length();i++)
{
if(saveText.charAt(i)=='\n')
{
fos.write(13);
fos.write(10);
}
else
fos.write(saveText.charAt(i));
}
}catch(IOException Ioe) {};
}
}
);
menuSaveCode.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
try{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setTitle("保存四元式文件为");
fileSaver.setVisible(true);
try{
currentFile=new File(fileSaver.getFile());
}catch(Exception oe) {return;};
fos=new FileOutputStream(currentFile);
saveText=new String(tokenTextArea.getText());
for(int i=0;i<saveText.length();i++)
{
if(saveText.charAt(i)=='\n')
{
fos.write(13);
fos.write(10);
}
else
fos.write(saveText.charAt(i));
}
}catch(IOException Ioe) {};
}
}
);
menubar.add(menuFile);
menubar.add(menuBuild);
menubar.add(menuSave);
frame.setMenuBar(menubar);
inputTextArea=new TextArea();
inputTextArea.addTextListener(new TextListener()
{
public void textValueChanged(TextEvent e)
{
if(currentFile.exists())
fileFlag=1;
if(!currentFile.exists())
{
if(inputTextArea.getText().equals(new String(""))) //关闭了上一个文件
fileFlag=0;
else //inputTextArea有内容,但还没有文件名
fileFlag=2;
frame.setTitle("Simple 语言编译器"+currentFile.toString());
return;
}
frame.setTitle("Simple 语言编译器"+currentFile.toString()+"-未保存");
}
}
);
symbolTableTextArea=new TextArea();
resultTextArea=new TextArea();
tokenTextArea=new TextArea();
frame.setLayout(new GridLayout(2,2));
frame.add(inputTextArea);
frame.add(symbolTableTextArea);
frame.add(resultTextArea);
frame.add(tokenTextArea);
frame.setVisible(true);
frame.addWindowListener( new WindowAdapter()
{
public void windowClosing(WindowEvent e )
{
System.exit(0);
}
}
);
}
/**
*初始化各个属性的值、生成StringBuffer对象及在数组keyWord[]加关键字
*/
public void scannerInit()
{
int i=0;
charId=-1;
varEnd=0;
varCount=0; //字符串个数统计
tokenCount=0; //token计数器
errorCount=0; //错误计数器
labelCount=1; // 序号
addrCount=0; //入口地址
rowCount=1; //行计数器
columnCount=1; //列计数器
beginCode=0; //用于程序是否正常结束
endCode=0;
currentSymbol=new Symbol();
currentToken=new Token();
alphabet=new StringBuffer();
symbolList=new Symbol[MAX]; //创建数组
tokenList=new Token[MAX];
keyWord=new StringBuffer[LENGTH+1];
for(i=0;i<MAX;i++)
symbolList[i]=new Symbol(); //创建对象
for(i=0;i<MAX;i++)
tokenList[i]=new Token(); //创建对象
for(i=0;i<LENGTH+1;i++)
keyWord[i]=new StringBuffer();//创建对象
keyWord[1].append("and");
keyWord[2].append("array");
keyWord[3].append("begin");
keyWord[4].append("bool");
keyWord[5].append("call");
keyWord[6].append("case");
keyWord[7].append("char");
keyWord[8].append("constant");
keyWord[9].append("do");
keyWord[10].append("else");
keyWord[11].append("end");
keyWord[12].append("false");
keyWord[13].append("for");
keyWord[14].append("if");
keyWord[15].append("input");
keyWord[16].append("integer");
keyWord[17].append("not");
keyWord[18].append("of");
keyWord[19].append("or");
keyWord[20].append("output");
keyWord[21].append("procedure");
keyWord[22].append("program");
keyWord[23].append("read");
keyWord[24].append("real");
keyWord[25].append("repeat");
keyWord[26].append("set");
keyWord[27].append("then");
keyWord[28].append("to");
keyWord[29].append("true");
keyWord[30].append("until");
keyWord[31].append("var");
keyWord[32].append("while");
keyWord[33].append("write");
resultTextArea.setText("词法分析的结果:\n\n");
symbolTableTextArea.setText("词法分析后的符号表:\n\n");
symbolTableTextArea.setText("序号"+" NAME "+" TYEP "+" KIND "+" VAL "+" ADDR "+" 符号\n");
tokenTextArea.setText("词法分析后的token串:\n\n");
}
/**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -