📄 cifa.java
字号:
import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;public class Lexical extends JFrame{ private JTextField path; private JButton selectButton, displayButton; private JTextArea output; private OpenFile open = new OpenFile(this); private File file; private Container container = getContentPane(); private BufferRead reader; private char c; private String descrip; private boolean finish; private String table[] = { "", "ID", "NUM", "if", "then", "else", "program", "begin", "end", "+", "-", "*", "/", "(", ")", ">", ">=", "<", "<=", "<>", ":=", ";", ".", "," }; public Lexical(){ super("Lexical"); path = new JTextField(30); path.setEditable(false); selectButton = new JButton("Select File"); selectButton.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent event){ if((file = open.open()) != null){ displayButton.setEnabled(true); path.setText(file.toString()); } } } ); displayButton = new JButton("Display"); displayButton.setEnabled(false); displayButton.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent event){ reader = new BufferRead(file); output.setText(""); finish = false; analyze(); } } ); output = new JTextArea(33,50); container.setLayout(new FlowLayout()); container.add(path); container.add(selectButton); container.add(displayButton); container.add(new JScrollPane(output)); setSize(600, 650); setVisible(true); setResizable(false); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setLocation((int)(screenSize.getWidth()/5), (int)(screenSize.getHeight()/11)); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } String nexttoken(){ int state = 0; String token = new String(""); boolean point = false; while(true){ switch(state){ case 0: c = reader.getNextChar(); if(c == ' ' || c == '\t' || c == '\n') continue; token = token.concat((new Character(c)).toString()); if(c == '\0'){ descrip = new String("FINISH"); finish = true; return new String("NULL"); }else if(Character.isLetter(c)) state = 1; else if(Character.isDigit(c)) state = 2; else if(c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ';' || c == ',') state = 3; else if(c == ')') state = 4; else if(c == '.') state = 99; else if(c == '>' || c == '<') state = 5; else if(c == ':') state = 6; else state = 99; break; case 1: c = reader.getNextChar(); if(c == ' ' || c == '\t' || c == '\n' || c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == ';' || c == ',' || c == '>' || c == '<' || c == ':' || c == '\0'){ reader.unget(); descrip = new String("table"); return token; } else if(false == Character.isLetterOrDigit(c)) state = 99; token = token.concat((new Character(c)).toString()); break; case 2: c = reader.getNextChar(); if(c == ' ' || c == '\t' || c == '\n' || c == '+' || c == '-' || c == '*' || c == '/' || c == ')' || c == ';' || c == ',' || c == '>' || c == '<' || c == ':' || c == '\0'){ reader.unget(); descrip = new String("NUM"); return token; }else if(c == '.'){ if(point) state = 99; else{ point = true; } }else if(false == Character.isDigit(c)) state = 99; token = token.concat((new Character(c)).toString()); break; case 3: c = reader.getNextChar(); if(c == ' ' || c == '\t' || c == '\n') continue; else if(Character.isLetterOrDigit(c) || c == '('){ reader.unget(); descrip = new String("table"); return token; }else{ reader.unget(); state = 99; } break; case 4: c = reader.getNextChar(); if(c == ' ' || c == '\t' || c == '\n' || c == '+' || c == '-' || c == '*' || c == '/' || c == '>' || c == '<' || c == ';' || c == '\0'){ reader.unget(); descrip = new String("table"); return token; }else{ reader.unget(); state = 99; } break; case 5: c = reader.getNextChar(); if(c == '='){ token = token.concat((new Character(c)).toString()); state = 7; }else if(Character.isLetterOrDigit(c) || c == '('){ reader.unget(); descrip = new String("table"); return token; }else{ reader.unget(); state = 99; } break; case 6: c = reader.getNextChar(); if(c == '='){ token = token.concat((new Character(c)).toString()); state = 7; }else{ reader.unget(); state = 99; } break; case 7: c = reader.getNextChar(); if(c == ' ' || c == '\t' || c == '\n' || c == '\0' || Character.isLetterOrDigit(c) || c == '('){ reader.unget(); descrip = new String("table"); return token; }else{ reader.unget(); state = 99; } break; case 99: c = reader.getNextChar(); if(c == '\0'){ descrip = new String("ERROR"); return new String("error"); } if(!(c == ' ' || c == '\t' || c == '\n')) continue; else{ descrip = new String("ERROR"); return new String("error"); } } } } void analyze(){ do{ String token = nexttoken(); if(descrip.equals("FINISH")) break; else if(descrip.equals("NUM")) output.append("2" + " " + token + "\n"); else if(descrip.equals("ERROR")){ output.append("error\n"); } else{ int i; for(i = 3; i < table.length; i++){ if(table[i].equals(token)){ output.append((new Integer(i)).toString()); if(i < 10) output.append(" "); else output.append(" "); output.append(token + "\n"); break; } } if(i >= table.length) output.append("1" + " " + token + "\n"); } if(finish) break; }while(true); } public static void main(String args[]){ Lexical test = new Lexical(); }}class BufferRead{ final int MAX = 200, HALF = 99; private char buffer[]; private int forward, r; private BufferedReader input; private static boolean un = false; public BufferRead(File name){ buffer = new char[MAX]; forward = -1; try{ input = new BufferedReader(new FileReader(name)); buffer[HALF] = buffer[MAX - 1] = '\0'; input.read(buffer, 0, HALF); }catch(Exception e){} } public char getNextChar(){ if(un){ un = false; return buffer[forward]; } forward++; if('\0' == buffer[forward]){ if(forward == HALF){ try{ if((r = input.read(buffer, HALF + 1, HALF)) < HALF){ buffer[HALF + r] = '\0'; } }catch(Exception e){} forward++; }else if(forward == MAX - 1){ try{ if((r = input.read(buffer, 0, HALF)) < HALF){ buffer[r - 1] = '\0'; } }catch(Exception e){} forward = 0; }else return '\0'; } return buffer[forward]; } public void unget(){ un = true; }}class OpenFile{ private JFileChooser fileChooser = new JFileChooser(); Component component; public OpenFile(Component c){ component = c; fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); } public File open(){ int result = fileChooser.showOpenDialog(component); if(result == JFileChooser.CANCEL_OPTION) return null; File fileName = fileChooser.getSelectedFile(); if(fileName == null || fileName.getName().equals("")){ JOptionPane.showMessageDialog(component, "Invalid File Name", "Invalid File Name", JOptionPane.ERROR_MESSAGE); return null; }else{ return fileName; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -