Artificial Intelligence Programming Lab(AIPLab) 討論區

Please login or register.

請輸入帳號, 密碼以及預計登入時間

新聞:

[慶賀]恭喜亞大獲《泰晤士報》亞洲最佳大學排名第83名,國內排名第十名-20170201

作者 主題: [公告] SIC 組譯器 PassOne JAVA版本  (閱讀 4903 次)

admin

  • 管理員
  • Hero Member
  • *****
  • 文章: 1798
    • 檢視個人資料
[公告] SIC 組譯器 PassOne JAVA版本
« 於: 五月 06, 2010, 10:12:08 am »
程式碼: [Select]
package PassOne;
import java.util.*;
import java.io.*;

public class Program
{

/**
* @param args
*/
    static String filename1, filename2;
    static int nlineNo;
    static String Label, Opcode, Oprand, Line;
    static boolean IsCommentLine;
    static BufferedReader sr;
    static PrintWriter sw;
    static int Location, LOCCTR;
    static HashMap<String, Integer> SYMTAB = new HashMap<String, Integer>();
    /*SIC Instruction:
     * ADD,AND,COMP,DIV,J,JEQ,JGT,JLT,JSUB,LDA,LDCH,LDL,LDX,MUL,OR,RD,RSUB,STA,STCH,STL,STX,SUB,TD,TIO,TIX,WD
    */
    static String[] OPTAB = new String[] { "ADD", "AND", "COMP", "DIV", "J", "JEQ", "JGT", "JLT", "JSUB", "LDA", "LDCH", "LDL", "LDX", "MUL", "OR", "RD", "RSUB", "STA", "STCH", "STL", "STX", "SUB", "TD", "TIO", "TIX", "WD" };
    public static void main(String[] args) {
// TODO Auto-generated method stub
    String ErrorMessage;
       
        filename1 = args[0];
        filename2 = args[1];
        nlineNo = 0;

        try
        {
        FileReader reader = new FileReader(filename1);
        FileWriter writer = new FileWriter(filename2);
        sr = new BufferedReader(reader);
        sw = new PrintWriter(writer);
        }
        catch (FileNotFoundException fe) {
        System.out.println(fe.getMessage());
        return;
        }
        catch (IOException ie) {
        System.out.println(ie.getMessage());
        return;
        }

       //read first input line
        ReadFirstLine();
        if (Opcode.equals("START"))//if OPCODE = 'START' then
        {
            LOCCTR = Integer.parseInt(Oprand, 16); Location = LOCCTR;//save #[OPERAND] as starting address
            WriteThisLine();
            ReadNextLine();
        }
        else
            LOCCTR = 0; Location = 0;

        while (Opcode.compareTo("END")!=0)
        {
            Location = LOCCTR;
            if (!IsCommentLine)
            {
                if (Label.length() > 0)
                {
                    if (SYMTAB.containsKey(Label))
                    {
                        ErrorMessage = "Duplicate symbol:" + Label;
                        break;
                    }
                    else
                    {
                        SYMTAB.put(Label, new Integer(LOCCTR));
                    }
                }
                if (SearchOPTAB(Opcode))
                    LOCCTR += 3;
                else if (Opcode.equals("WORD"))
                    LOCCTR += 3;
                else if (Opcode.equals("RESW"))
                    LOCCTR += 3 * Integer.parseInt(Oprand);
                else if (Opcode.equals("RESB"))
                    LOCCTR += Integer.parseInt(Oprand);
                else if (Opcode.equals("BYTE"))
                    LOCCTR += FindConstantLength(Oprand);
                else
                {
                    ErrorMessage = "Invalid operation code:" + Label;
                    break;
                }
            }
            WriteThisLine();
            ReadNextLine();
        }
        WriteLastLine();
        try
        {
        sr.close();
        sw.close();
        }
        catch (IOException e) {
        System.out.println(e.getMessage());
        }

}
static boolean ReadFirstLine()
    {
        return ReadNextLine();
    }
    static boolean ReadNextLine()
    {
    try
        {
    Line = sr.readLine();
        }
        catch (IOException ie) {
        System.out.println(ie.getMessage());
        }
        if (Line == null) return false;

        if (Line.charAt(0) == '.')
        {
            IsCommentLine = true;
        }
        else
        {
            IsCommentLine = false;
            Label = Line.substring(0, 7).trim();
            Opcode = Line.substring(9, 16).trim(); ;
            if (Line.length() >= 36)
                Oprand = Line.substring(17, 33).trim();
            else
                Oprand = Line.substring(17).trim();
        }
        nlineNo = nlineNo + 5;
        return true;
    }
    static boolean SearchOPTAB(String opcode)
    {
        for (int i = 0; i < OPTAB.length; i++)
        {
            if (opcode.equals(OPTAB[i]))
            {
                return true;
            }
        }
        return false;
    }
    static int FindConstantLength(String oprand)
    {
        if (oprand.length() <3)
            return 0;
        int Q1, Q2;
        int nLen = 0;
        switch (oprand.charAt(0))
        {
            case 'C':
                Q1 = oprand.indexOf('\'');
                if (Q1 >= 0)
                {
                    Q2 = oprand.indexOf('\'', Q1+1);
                    if (Q2 > Q1)
                        nLen = Q2 - Q1 - 1;
                }
                break;
            case 'X':
                Q1 = oprand.indexOf('\'');
                if (Q1 >= 0)
                {
                    Q2 = oprand.indexOf('\'', Q1 + 1);
                    if (Q2 > Q1)
                        nLen = (Q2 - Q1 - 1)/2;
                }
                break;

        }
        return nLen;
    }
    static void WriteThisLine()
    {
        if (IsCommentLine)
        {
            sw.printf("%3d %s%n", nlineNo, Line);
            System.out.printf("%3d %s%n", nlineNo, Line);

        }

        else
        {   
        String Space ="                   ";
        String FormatLabel = Label + (Label.length()< 8 ? Space.substring(0, 9-Label.length()-1): Label.length());
        String FormatOpcode = Opcode + (Opcode.length()< 8 ? Space.substring(0, 9-Opcode.length()-1): Opcode.length());
        String FormatOprand = Oprand + (Oprand.length()< 8 ? Space.substring(0, 9-Oprand.length()-1): Oprand.length());
            sw.printf("%3d %4X %s %s %s%n", nlineNo, Location, FormatLabel, FormatOpcode, FormatOprand);
            System.out.printf("%3d %4X %s %s %s%n", nlineNo, Location, FormatLabel, FormatOpcode, FormatOprand);
        }
    }
    static void WriteLastLine()
    {
    sw.printf("%3d           %s%n", nlineNo, Opcode);
        System.out.printf("%3d           %s%n", nlineNo, Opcode);
    }
}
已記錄
 

SimplePortal Classic 2.0.5