?? byylscanner.java
字號(hào):
/**
*This program is for compiled language!
* yanxiangtong 2006.10.29
*本程序最終解釋權(quán)屬于040410206 閆相通。
**/
//package byylscanner;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
//保留字類
class KeyWord
{
public StringBuffer word;
public KeyWord()
{
word=new StringBuffer();
}
}
//符號(hào)表中的NAME類
class WordName
{
public int start;
public int length;
}
//符號(hào)表類
class Symbol
{
public WordName name;
public StringBuffer type;
public StringBuffer kind;
public StringBuffer val;
public int addressOfMemory;
public int addr;
public Symbol()
{ name=new WordName();
type=new StringBuffer();
kind=new StringBuffer();
val=new StringBuffer();
}
}
public class ByylScanner implements ActionListener{
private Frame frame;
private MenuBar menubar;
private Menu menuFile;
private Menu menuBuild;
private Menu menuSave;
private MenuItem menuFileOpen;
private MenuItem menuFileClose;
private MenuItem menuFileExit;
private MenuItem menuBuildMorphemeAnalysis;
private MenuItem menuBuildParsing;
private MenuItem menuSaveSource;
private MenuItem menuSaveSymbol;
private MenuItem menuSaveToken;
private TextArea inputTextArea;
private TextArea symbolTableTextArea;
private TextArea resultTextArea;
private TextArea tokenTextArea;
private File beforeFile=new File("yanxiangtongprince.java");
private File currentFile=new File("yanxiangtongprince.java");
private FileDialog fileChooser ;
private FileDialog fileSaver ;
private FileInputStream fis; //輸入流
private FileOutputStream fos; //輸出流
private Token currentToken; //當(dāng)前token串
private Symbol currentSymbol; //當(dāng)前符號(hào)表
private String saveText; //存放當(dāng)前分析的程序的所有字符
private StringBuffer alphabet; //字母表
private int len; //讀入文件的長(zhǎng)度
private byte []buffer; //讀入的文件內(nèi)容存在byte串中
private Symbol []symbolList; //符號(hào)表的每一行存放在數(shù)組里面
private int charId=-1;
private char ch; //讀入的字符
private int varCount=0;//字符串個(gè)數(shù)統(tǒng)計(jì)
private int errorCount=0; //錯(cuò)誤計(jì)數(shù)器
private int labelCount=1; // 序號(hào)
private int addrCount=1; //入口地址
private int rowCount=1; //行計(jì)數(shù)器
private int columnCount=1; //列計(jì)數(shù)器
private int beginCode=0; //用于程序是否正常結(jié)束
private int endCode=0;
private static final int MAX=500; //設(shè)定符號(hào)表的最大長(zhǎng)度
private int currentId=0;
private static final int LENGTH=33; //保留字的個(gè)數(shù)
private KeyWord []keyWord;
public ByylScanner(){
frame =new Frame("simple語(yǔ)言編譯器");
frame.setSize(800,700);
frame.setBackground(Color.GRAY);
frame.setLocation(0,0);
menubar=new MenuBar();
menuFile=new Menu("文件");
menuFileOpen=new MenuItem("打開");
menuFileClose=new MenuItem("關(guān)閉");
menuFileExit= new MenuItem("退出");
//添加監(jiān)聽(tīng)事件
menuFileOpen.addActionListener(this);
menuFileClose.addActionListener(this);
menuFileExit.addActionListener(this);
menuFile.add(menuFileOpen);
menuFile.add(menuFileClose);
menuFile.add(menuFileExit);
menuBuild=new Menu("編譯");
menuBuildMorphemeAnalysis=new MenuItem("此法分析");
menuBuildParsing=new MenuItem("語(yǔ)法分析");
menuBuildMorphemeAnalysis.addActionListener(this);
menuBuildParsing.addActionListener(this);
menuBuild.add(menuBuildMorphemeAnalysis);
menuBuild.add(menuBuildParsing);
menuSave=new Menu("保存");
menuSaveSymbol=new MenuItem("保存符號(hào)表");
menuSaveSource=new MenuItem("保存源文件");
menuSaveToken=new MenuItem("保存Token");
menuSave.add(menuSaveSource);
menuSave.add(menuSaveSymbol);
menuSave.add(menuSaveToken);
menuSaveSource.addActionListener(this);
menuSaveSymbol.addActionListener(this);
menuSaveToken.addActionListener(this);
menubar.add(menuFile);
menubar.add(menuBuild);
menubar.add(menuSave);
frame.setMenuBar(menubar);
inputTextArea=new TextArea();
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);
}
}
);
}
public void actionPerformed(ActionEvent e )
{
if(e.getSource()==menuFileOpen)
{ //menuFileOpen begin
try{
fileChooser= new FileDialog(frame);
fileChooser.setMode(0);
fileChooser.setVisible(true);
currentFile=new File(fileChooser.getFile());
System.out.println(currentFile.toString());
fis=new FileInputStream(currentFile);
len=fis.available();
buffer=new byte[len];
fis.read(buffer);
inputTextArea.setText(new String(buffer));
}catch(IOException Ioe) {};
}//menuFileOpen end
else if(e.getSource()==menuSaveSource)
{
try{
if(currentFile.equals(beforeFile))
{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setVisible(true);
currentFile=new File(fileSaver.getFile());
}
//輸出文件名
System.out.println(currentFile.toString());
fos=new FileOutputStream(currentFile);
saveText=new String(inputTextArea.getText());
fos.write(saveText.getBytes());
}catch(IOException Ioe) {};
}
else if(e.getSource()==menuSaveSymbol)
{
try{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setVisible(true);
currentFile=new File(fileSaver.getFile());
System.out.println(currentFile.toString());
fos=new FileOutputStream(currentFile);
saveText=new String(symbolTableTextArea.getText());
fos.write(saveText.getBytes());
}catch(IOException Ioe) {};
}
else if(e.getSource()==menuSaveToken)
{
try{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setVisible(true);
currentFile=new File(fileSaver.getFile());
System.out.println(currentFile.toString());
fos=new FileOutputStream(currentFile);
saveText=new String(tokenTextArea.getText());
fos.write(saveText.getBytes());
}catch(IOException Ioe) {};
}
else if(e.getSource()==menuFileClose)
{
try{
if(!currentFile.exists())
{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setVisible(true);
currentFile=new File(fileSaver.getFile());
}
if(currentFile.exists())
{
System.out.println(currentFile.toString());
fos=new FileOutputStream(currentFile);
saveText=new String(inputTextArea.getText());
fos.write(saveText.getBytes());
}
currentFile=beforeFile;
inputTextArea.setText("");
symbolTableTextArea.setText("");
resultTextArea.setText("");
tokenTextArea.setText("");
} catch(IOException oe) {};
}
else if(e.getSource()==menuFileExit)
{
System.exit(0);
}
else if(e.getSource()==menuBuildMorphemeAnalysis)
{
beginScanner();
}
else if(e.getSource()==menuBuildParsing)
{
inputTextArea.setText("我是王子語(yǔ)法分析");
}
}
public void scannerInit()
{
int i=0;
try{
currentSymbol=new Symbol();
currentToken =new Token();
alphabet=new StringBuffer();
symbolList=new Symbol[MAX]; //創(chuàng)建數(shù)組
for(i=0;i<MAX;i++)
symbolList[i]=new Symbol(); //創(chuàng)建對(duì)象
keyWord=new KeyWord[LENGTH+1]; //創(chuàng)建數(shù)組
for(i=0;i<LENGTH;i++)
keyWord[i]=new KeyWord();//創(chuàng)建對(duì)象
keyWord[1].word.append("and");
keyWord[2].word.append("array");
keyWord[3].word.append("begin");
keyWord[4].word.append("bool");
keyWord[5].word.append("call");
keyWord[6].word.append("case");
keyWord[7].word.append("char");
keyWord[8].word.append("constant");
keyWord[9].word.append("do");
keyWord[10].word.append("else");
keyWord[11].word.append("end");
keyWord[12].word.append("flase");
keyWord[13].word.append("for");
keyWord[14].word.append("if");
keyWord[15].word.append("input");
keyWord[16].word.append("integer");
keyWord[17].word.append("not");
keyWord[18].word.append("of");
keyWord[19].word.append("or");
keyWord[20].word.append("output");
keyWord[21].word.append("procedure");
keyWord[22].word.append("program");
keyWord[23].word.append("read");
keyWord[24].word.append("real");
keyWord[25].word.append("repeat");
keyWord[26].word.append("set");
keyWord[27].word.append("then");
keyWord[28].word.append("to");
keyWord[29].word.append("true");
keyWord[30].word.append("until");
keyWord[31].word.append("var");
keyWord[32].word.append("while");
keyWord[33].word.append("write");
}catch(Exception oe){}
}
public void beginScanner()
{
scannerInit(); //初始化
//文件操作
try{
if(!currentFile.exists())
{
fileSaver= new FileDialog(frame);
fileSaver.setMode(1);
fileSaver.setVisible(true);
currentFile=new File(fileSaver.getFile());
}
System.out.println(currentFile.toString()); //打印文件名字
fos=new FileOutputStream(currentFile);
saveText=new String(inputTextArea.getText());
buffer=saveText.getBytes();
fos.write(buffer);
}catch(IOException Ioe) {};
//開始掃描
ch=getNextChar();
while(ch!=1000)
{
if((ch>47)&&(ch<58)) //是數(shù)字
isNumber();
else //是保留字或標(biāo)志符
{if(((ch>64)&&(ch<90))||((ch>96)&&(ch<123))||ch=='_')
isAlpha();
else
{if(ch=='/') isAnotation();//是否為注釋
else
if(ch=='\'') isChar(); //字符常數(shù)
else isOther(); //其他情況
}
}
}
// if(!(saveText.endsWith(firstEndWith)||saveText.endsWith(secondEndWith)))
// error(4);
if(!(beginCode==endCode)) //檢驗(yàn)程序是否正常結(jié)束
error(4);
}
/**
*獲得下一個(gè)字符
**/
public char getNextChar()
{ try{
charId++;
columnCount++;
if(saveText.charAt(charId)==13)
{rowCount++; //行計(jì)數(shù)器加一并把列計(jì)數(shù)器置零
columnCount=0;
}
if(charId<saveText.length())
return saveText.charAt(charId);
}catch(Exception oo){}
return 1000; //1000為程序結(jié)束標(biāo)志
}
/**
*處理保留字和字符串
**/
public void isAlpha()
{ int keyFlag=0,i,alpaFlag;
while(((ch>64)&&(ch<90))||((ch>96)&&(ch<123))||ch=='_')
{
currentToken.name.append(ch);
ch=getNextChar();
} //讀完所有的字母并讀入下一個(gè)非字母的、字符
for(i=0;i<LENGTH;i++) //檢測(cè)是否為保留字
{
if(keyWord[i].word.toString().equals(currentToken.name.toString()))
{keyFlag=1;break;}
}
if(keyFlag==1) //是保留字
{currentToken.code=i;
currentToken.address=-1;
}
else //是標(biāo)志符
{ currentToken.code=34;
alpaFlag=wordExist(); //確定入口地址需要檢測(cè)是否在販
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -