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);
}
}
}