반응형

 2004년도 1학기 시스템 소프트웨어 과목의 Term 프로젝트로 제출했던 자료 입니다.

2007년 4월 27일 제가 운영하던 네이버 블로그에 공개 했던 소스 입니다.

자바로는 거의 제가 처음 제작 한 걸 껍니다. 아래 소스와 관련하여 예제 소스가 필요하신 분은

댓글이나 방명록에 이메일 주소를 남겨주시면 제가 보내드리겠습니다.

--------------------------------------------------------------------------
원문 :

오늘은 소스 코드 하나 올립니다.

학과 레포트로 제출한 프로그램 소스 코드 입니다.

어셈블리어 에서 사용하는 매크로 프로세서를

자바 언어로 한 겁니다.

어떤 매크로 들이 있는지 확인해 보고 매크로 확장 된 어셈블리 코드를 만들어 낼수도 있습니다.

아래 코드 참고 하시길..

예제를 위한 텍스트 파일과 소스 파일을 첨부합니다.

(첨부파일은 사용하실려면 파일명을 수정해 주세요)

 

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.StringTokenizer;

public class macroProcess extends JFrame implements ActionListener {
  JPanel jPanel1 = new JPanel();
  JPanel jPanel2 = new JPanel();
  JLabel jLabel1 = new JLabel();
  JLabel jLabel2 = new JLabel();
  JPanel jPanel3 = new JPanel();
  JPanel jPanel4 = new JPanel();
  JPanel jPanel5 = new JPanel();
  JPanel jPanel6 = new JPanel();
  JLabel jLabel3 = new JLabel();
  JLabel jLabel4 = new JLabel();
  JLabel jLabel5 = new JLabel();

  // 매크로 이름표를 위한 객체
  String list1[][] = new String[0][3];
  String cols1[] = {"색인(MNTC)","매크로이름","MDT색인(MDTC)"};
  DefaultTableModel mnt_model = new DefaultTableModel(list1,cols1){
      public boolean isCellEditable(int row, int col) { return false;}
  };
  // 형식인수표를 위한 객체
  String list2[][] = new String[0][2];
  String cols2[] = {"형식인수이름","색인번호"};
  DefaultTableModel hy_model = new DefaultTableModel(list2,cols2){
      public boolean isCellEditable(int row, int col) { return false;}
  };
  // 매크로 정의표를 위한 객체
  String list3[][] = new String[0][2];
  String cols3[] = {"색인(MDTC)","문장"};
  DefaultTableModel mdt_model = new DefaultTableModel(list3,cols3){
      public boolean isCellEditable(int row, int col) { return false;}
  };
  // 파일 오픈용
  JFileChooser jfc = new JFileChooser();
  // 파일 저장용
  FileDialog fd = new FileDialog(this,"확장된파일저장하기",FileDialog.SAVE);

  JScrollPane jScrollPane1 = new JScrollPane();
  JTable mnt_Table = new JTable(mnt_model);
  JScrollPane jScrollPane2 = new JScrollPane();
  JTable hy_Table = new JTable(hy_model);
  JScrollPane jScrollPane3 = new JScrollPane();
  JTable mdt_Table = new JTable(mdt_model);
  JTextField tf_file = new JTextField();
  JButton open_b = new JButton();
  JTextField tf_save = new JTextField();
  JButton save_b = new JButton();
  JButton exit_b = new JButton();
  JScrollPane jScrollPane4 = new JScrollPane();
  JTextArea sourArea = new JTextArea();
  JScrollPane jScrollPane5 = new JScrollPane();
  JTextArea destArea = new JTextArea();

  public macroProcess() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  public static void main(String[] args) {
    macroProcess macroProcess = new macroProcess();
  }
  // Design 구현
  private void jbInit() throws Exception {

    mnt_Table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    mnt_Table.getColumnModel().getColumn(0).setMinWidth(70);
    mnt_Table.getColumnModel().getColumn(1).setMinWidth(129);
    mnt_Table.getColumnModel().getColumn(2).setMinWidth(94);
    mnt_Table.getColumnModel().getColumn(0).setMaxWidth(70);
    mnt_Table.getColumnModel().getColumn(1).setMaxWidth(129);
    mnt_Table.getColumnModel().getColumn(2).setMaxWidth(94);

    mdt_Table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    mdt_Table.getColumnModel().getColumn(0).setMinWidth(70);
    mdt_Table.getColumnModel().getColumn(1).setMinWidth(225);
    mdt_Table.getColumnModel().getColumn(0).setMaxWidth(70);
    mdt_Table.getColumnModel().getColumn(1).setMaxWidth(225);

    this.getContentPane().setBackground(Color.lightGray);
    this.setResizable(false);
    this.setTitle("Macro Processer(java version, 제작자 : 김현수)");
    this.getContentPane().setLayout(null);
    jPanel1.setBackground(new Color(217, 249, 255));
    jPanel1.setBounds(new Rectangle(332, 9, 320, 285));
    jPanel1.setLayout(null);
    jPanel2.setBounds(new Rectangle(6, 9, 320, 285));
    jPanel2.setLayout(null);
    jPanel2.setBackground(new Color(217, 249, 255));
    jLabel1.setBackground(new Color(212, 208, 249));
    jLabel1.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel1.setOpaque(true);
    jLabel1.setText("원본파일 :");
    jLabel1.setBounds(new Rectangle(6, 6, 65, 24));
    jLabel2.setBounds(new Rectangle(5, 6, 65, 24));
    jLabel2.setText("출력파일 :");
    jLabel2.setOpaque(true);
    jLabel2.setBackground(new Color(212, 208, 249));
    jLabel2.setFont(new java.awt.Font("SansSerif", 0, 12));
    jPanel3.setBackground(new Color(203, 217, 223));
    jPanel3.setBounds(new Rectangle(6, 297, 646, 268));
    jPanel3.setLayout(null);
    jPanel4.setBackground(new Color(212, 208, 238));
    jPanel4.setBounds(new Rectangle(327, 10, 312, 251));
    jPanel4.setLayout(null);
    jPanel5.setBackground(new Color(212, 208, 238));
    jPanel5.setBounds(new Rectangle(6, 8, 313, 127));
    jPanel5.setLayout(null);
    jPanel6.setBackground(new Color(212, 208, 238));
    jPanel6.setBounds(new Rectangle(6, 146, 313, 115));
    jPanel6.setLayout(null);
    jLabel3.setBackground(Color.lightGray);
    jLabel3.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel3.setDoubleBuffered(false);
    jLabel3.setOpaque(true);
    jLabel3.setText("MNT(매크로이름표)");
    jLabel3.setBounds(new Rectangle(0, 0, 118, 21));
    jLabel4.setBounds(new Rectangle(0, 0, 118, 21));
    jLabel4.setText("형식인수표");
    jLabel4.setOpaque(true);
    jLabel4.setDoubleBuffered(false);
    jLabel4.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel4.setBackground(Color.lightGray);
    jLabel5.setBounds(new Rectangle(0, 0, 118, 21));
    jLabel5.setText("MDT(매크로정의표)");
    jLabel5.setOpaque(true);
    jLabel5.setDoubleBuffered(false);
    jLabel5.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel5.setBackground(Color.lightGray);
    jScrollPane1.setBounds(new Rectangle(8, 26, 296, 94));
    jScrollPane2.setBounds(new Rectangle(9, 25, 295, 83));
    jScrollPane3.setBounds(new Rectangle(7, 25, 298, 218));
    tf_file.setEditable(false);
    tf_file.setText(" ");
    tf_file.setBounds(new Rectangle(113, 6, 131, 24));
    open_b.setBounds(new Rectangle(247, 6, 66, 24));
    open_b.setFont(new java.awt.Font("SansSerif", 0, 12));
    open_b.setText("Open");
    tf_save.setText("");
    tf_save.setBounds(new Rectangle(74, 6, 117, 24));
    save_b.setBounds(new Rectangle(195, 6, 57, 24));
    save_b.setFont(new java.awt.Font("SansSerif", 0, 12));
    save_b.setMargin(new Insets(0, 0, 0, 0));
    save_b.setText("Save");
    exit_b.setBounds(new Rectangle(253, 6, 60, 24));
    exit_b.setFont(new java.awt.Font("SansSerif", 0, 12));
    exit_b.setMargin(new Insets(0, 0, 0, 0));
    exit_b.setText("Exit");
    jScrollPane4.setBounds(new Rectangle(6, 34, 305, 240));
    sourArea.setText("");
    jScrollPane5.setBounds(new Rectangle(5, 34, 308, 241));
    destArea.setText("");
    this.getContentPane().add(jPanel2, null);
    jPanel2.add(jLabel1, null);
    this.getContentPane().add(jPanel1, null);
    jPanel1.add(jLabel2, null);
    this.getContentPane().add(jPanel3, null);
    jPanel3.add(jPanel4, null);
    jPanel4.add(jLabel5, null);
    jPanel3.add(jPanel5, null);
    jPanel5.add(jLabel3, null);
    jPanel3.add(jPanel6, null);
    jPanel6.add(jLabel4, null);
    jPanel5.add(jScrollPane1, null);
    jScrollPane1.getViewport().add(mnt_Table, null);
    jPanel6.add(jScrollPane2, null);
    jScrollPane2.getViewport().add(hy_Table, null);
    jPanel4.add(jScrollPane3, null);
    jScrollPane3.getViewport().add(mdt_Table, null);
    jPanel2.add(tf_file, null);
    jPanel2.add(open_b, null);
    jPanel2.add(jScrollPane4, null);
    jScrollPane4.getViewport().add(sourArea, null);
    jPanel1.add(tf_save, null);
    jPanel1.add(exit_b, null);
    jPanel1.add(save_b, null);
    jPanel1.add(jScrollPane5, null);
    jScrollPane5.getViewport().add(destArea, null);
    this.dispose();
    this.setSize(new Dimension(672, 600));
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    open_b.addActionListener(this);
    save_b.addActionListener(this);
    exit_b.addActionListener(this);
  }

  // Source 파일 열어 오기
  // 열어 오면 pass1 ~ pass2까지 진행된다
  private void open_File() {
    sourArea.setText("");
    mnt_model.setRowCount(0);
    hy_model.setRowCount(0);
    mdt_model.setRowCount(0);
    //jfc.setCurrentDirectory(".");
    // 파일을 불러 오는 구간
    if(jfc.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) return;
    File file = jfc.getSelectedFile();
    tf_file.setText(file.getName());
    try {
      FileInputStream fis = new FileInputStream(file);
      int n;
      while((n = fis.available()) > 0) {
        byte[] b = new byte[n];
        int result = fis.read(b);
        if(result == -1) break;
        String s = new String(b);
        if(s.compareTo("MACRO") == 1) {
          String temp[] = {String.valueOf(mdt_model.getRowCount()+1),s};
          mdt_model.addRow(temp);
        }
        sourArea.append(s + "\n");
      }

    } catch(IOException ex) {}
 // pass1 부분...
    StringTokenizer st = new StringTokenizer(sourArea.getText(),"\n");
    boolean tf = false;
    boolean tf2 = false;

    while(st.hasMoreTokens()) {
      String tems = st.nextToken();
      if(tf == false) {
        for(int i = 0; i < tems.length() - 5; i++) {
          if(tems.substring(i, i + 5).equals("MACRO")) {
            set_hy(tems.substring(i+6)); //형식인수 저장
            set_name(tems.substring(0,i));// 매크로 이름 저장
            tf = true;
            tf2 = true;
            break;
          }
        }
      } else {
        String tem2 = tems;
        for(int i = 0; i < tems.length() - 4; i++) {
          if(tems.substring(i, i + 4).equals("ENDM")) { // end macro라면...
            String temp[] = {
                String.valueOf(mdt_model.getRowCount() + 1), tems};
            mdt_model.addRow(temp);
            tf = false;
            tf2 = false;
            break;
          }
        }
        if(tf2) { // end macro가 아니라면...
          set_define(tems);
        }
      }
    }
    pass2();
  }

  private void pass2() { // 패스2
    StringTokenizer st = new StringTokenizer(sourArea.getText(),"\n");
    String mymem = null;
    boolean tf = false;
    while(st.hasMoreTokens()) {
      mymem = st.nextToken();
      String tem3 = mymem.trim();

      if (tf == false) {
        if (tem3.length() > 5) {
          if (tem3.substring(0, 4).equals("MAIN")) {
            String tem4 = tem3.substring(5).trim();
            if (tem4.length() > 5) {
              if (tem4.substring(0, 7).equals("SEGMENT")) {
                destArea.append(mymem + "\n");
                tf = true;
                continue;
              }
            }
          }
        }
      } else {
        for(int i=0;i<mnt_model.getRowCount();i++) {
          if(tem3.length() >= mnt_model.getValueAt(i,1).toString().length()) {
            String tem5 = mnt_model.getValueAt(i,1).toString().trim();
            if(tem5.equals(tem3.substring(0,tem5.length()))) {
              go_macro(tem5,tem3);
              mymem = st.nextToken();
            }
          }
        }

        if(tem3.length() > 4) {
          if(!tem3.substring(0, 4).equals("MAIN")) {
            String tem6 = tem3.trim();
            if(tem6.equals("ENDM")) {
              mymem = st.nextToken();
            }
            destArea.append(mymem + "\n");
          } else {
            destArea.append(mymem + "\n");
          }
        }
        if(tem3.equals("END")) {
          destArea.append(mymem + "\n");
        }
      }

    } // end of while
  } // end of method

  private void go_macro(String name, String temp) { // 명령어가 매크로라면...
    String tem1 = temp.substring(name.length()).trim();
    StringTokenizer st = new StringTokenizer(tem1,",");
    int num = 1;
    for(int i=0;i<mnt_model.getRowCount();i++) {
      if(name.equals(mnt_model.getValueAt(i,1).toString())) {
        num = Integer.parseInt(mnt_model.getValueAt(i,2).toString());
        break;
      }
    }
    String tem3 = null;
    for(int j=num-1;j<mdt_model.getRowCount();j++) {
      tem3 = mdt_model.getValueAt(j,1).toString().trim();
      if(!tem3.equals("ENDM")) {
        String msg = tem3.substring(0,tem3.indexOf(","));
        msg += ", " + st.nextToken();
        destArea.append(msg + "\n");
      } else {

        break;
      }
    }
  }

  private void set_name(String temp) { // 매크로 이름표 제작
    for(int i=0;i<temp.length();i++) {
      if(temp.charAt(i) == ' ') {
        String cou = String.valueOf(mnt_model.getRowCount() + 1);
        String tem[] = {cou,temp.substring(0,i).trim(),
            String.valueOf(mdt_model.getRowCount() + 1)};
        mnt_model.addRow(tem);
        break;
      }
    }
  }

  private void set_hy(String temp) { //형식 인수표 제작
    StringTokenizer st = new StringTokenizer(temp,",");
    while(st.hasMoreTokens()) {
      String cou = "#" + String.valueOf(hy_model.getRowCount() + 1);
      String tem[] = {st.nextToken().trim(),cou};
      hy_model.addRow(tem);
    }
  }

  private void set_define(String temp) { //매크로 정의표 만들기...
    StringTokenizer st = new StringTokenizer(temp,",");
    String tem1 = st.nextToken();
    String tem2 = st.nextToken();
    for(int i=0;i<hy_model.getRowCount();i++) {
      String tem3 = tem2.trim();
      String out = hy_model.getValueAt(i,0).toString();
      if(out.equals(tem3)) {
          tem2 = hy_model.getValueAt(i,1).toString();
          String tem[] = {String.valueOf(mdt_model.getRowCount() + 1), tem1+", "+tem2};
          mdt_model.addRow(tem);
      }
    }
  }

  public void save_File() { // 확장된 소스코드 저장하기.
    //if(jfc.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return;
    if(tf_save.getText() == null) {
      tf_save.setText("result.asm");
    }
    fd.setFile(tf_save.getText());
            fd.show();
            String str = fd.getDirectory() + fd.getFile();
            File file = new File(str);
            try {
                FileWriter fw  = new FileWriter(file);
                BufferedWriter bw = new BufferedWriter(fw);
                StringTokenizer st2 = new StringTokenizer(destArea.getText()+"\nend","\n");
                while(true) {
                    str = st2.nextToken();
                    if(str.equals("end"))
                        break;
                    bw.write(str);
                    bw.newLine();
                }
                bw.close();
              }catch(Exception e){}


  }

  public void actionPerformed(ActionEvent ev) { // 이벤트 명령 처리
    Object ob = ev.getSource();
    if(ob == open_b) {
      open_File();
    }
    if(ob == save_b) {
      save_File();
    }
    if(ob == exit_b) {
      System.exit(0);
    }

  }
}

반응형
Posted by onlyTheOne
,