2014-01-19 62 views
0

我想爲IBM360彙編語言設計一個簡單的彙編程序。因此,我首先實現了符號表。我將我的符號/標籤存儲在一個單獨的文件中,以便在生成符號表時進行比較。我面臨的問題是,由於不必要的比較導致錯誤的位置計數器(LC)值。我能夠檢測符號但是LC值錯誤。任何人都可以指導我修改我的代碼?pass1彙編程序的符號表

這裏是我的程序:

import java.io.*; 
import java.lang.*; 

class SymbolTable 
{ 
    public static void main(String args[]) throws Exception 
    { 
    FileReader fr = new FileReader("program.asm"); 
    BufferedReader br = new BufferedReader(fr); 
    String s,l; 
    String code[]=new String[100]; 
    String label[]=new String[100]; 

    int N=0,i,LOC=0,n=0,j; 
    System.out.println("Assembly lang program :\n--------------------------"); 
    while((s = br.readLine()) != null) 
    { 
     code[N++]=s; 
     System.out.println(s); 
    } 
    fr.close(); 
    FileReader labels = new FileReader("label.txt"); 
    BufferedReader buff = new BufferedReader(labels); 
    while((s = buff.readLine()) != null) 
    { 
     label[n++]=s; 
    } 
    labels.close(); 
    System.out.println("\n\n SYMBOL TABLE :\n-------------------------------------------\nLABEL\tLC\tLENGTH\tRELATIVE/ABSOLUTE\n-------------------------------------------"); 
    for(i=0;i<N;i++) 
    { 
     for(j=0;j<n;j++) 
     {   
       char codearr[]=new char[15]; 
       codearr=code[i].toCharArray(); 
       if(code[i].startsWith("USING")) 
       { 
       break; 
       } 
       else if(code[i].startsWith(label[j])) 
       { 
        System.out.println(label[j]+"\t"+LOC+"\t4\tR"); 
        if(i==0) 
        {} 
        else 
        LOC=LOC+4; 
        break;     
       } 
       else if(codearr[1]=='R') // for register addressing mode 
        LOC=LOC+2; 
       else 
        LOC=LOC+4; 
     } 
    } 
    } 
} 

program.asm:

JOHN START 
USING *,15 
L 1,FIVE 
A 1,FOUR 
ST 1,TEMP 
FOUR DC F '4' 
FIVE DC F '5' 
TEMP DS 1F 
END 

label.txt

JOHN 
FOUR 
FIVE 
TEMP 

輸出:

G:\programs>javac SymbolTable.java 
G:\programs>java SymbolTable 
Assembly lang program : 
-------------------------- 
JOHN START 
USING *,15 
LR 1,FIVE 
A 1,FOUR 
ST 1,TEMP 
FOUR DC F '4' 
FIVE DC F '5' 
TEMP DS 1F 
END 

SYMBOL TABLE : 
------------------------------------------- 
LABEL LC  LENGTH RELATIVE/ABSOLUTE 
------------------------------------------- 
JOHN 0  4  R 
FOUR 44  4  R 
FIVE 56  4  R 
TEMP 72  4  R 
+0

我建議你搬出內部循環的一切,是不依賴於'j'的。 –

+0

@ PM77-1如果我將移出內部循環,那我怎麼能做剩下的比較? – chinu

+0

如果我理解正確,只有一個條件需要使用內部循環。所以把循環放在那個'else if'裏面。它有意義還是我在這裏錯過了什麼? –

回答

0

下面是一個示例,幫助您瞭解自己的方式。我不知道語言輸入和輸出,但根據您提供的輸入,這個例子應該有所幫助。它根據操作碼開始處匹配的標籤構建符號表,我認爲這是用於標定與標籤關聯的代碼段的正確語法。代碼做出了假設,並沒有檢查可能發生的衝突,但是你可以弄清楚所有這些。隨意構建它。

輸入

你提供確切的輸入。

輸出

JOHN 0 true 
FOUR 50 true 
TEMP 78 true 
FIVE 64 true 

代碼

import java.io.File; 
import java.io.IOException; 

import java.util.Arrays; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.Objects; 

class SymbolTableBuilder 
{ 
    public static SymbolTable build(String asm, String lbls) 
    { 
     return build(asm.split("\n"), lbls.split("\n")); 
    } 

    public static SymbolTable build(String[] asm, String[] lbls) 
    { 
     return build(Arrays.asList(asm), Arrays.asList(lbls)); 
    } 

    public static SymbolTable build(File asm, File lbls) 
    { 
     //TODO 
     return null; 
    } 

    public static SymbolTable build(List<String> asm, List<String> lbls) 
    { 
     SymbolTable tbl = new SymbolTable(); 
     int pos = 0; 
     for (String opCode : asm) { 
      String tok = opCode.split("\\s+")[0]; 
      if (lbls.contains(tok)) 
       tbl.addSymbol(tok, new Symbol(tok, pos, true)); 
      pos += opCode.length() + 1; //account for newline 
     } 
     return tbl; 
    } 

    public static void main(String[] args) throws IOException 
    { 
     final String asm 
      = "JOHN START\nUSING *,15\nL 1,FIVE\nA 1,FOUR\n" 
      + "ST 1,TEMP\nFOUR DC F '4'\nFIVE DC F '5'\nTEMP DS 1F\nEND"; 

     final String lbls = "JOHN\nFOUR\nFIVE\nTEMP"; 

     for (Entry<String, Symbol> e : SymbolTableBuilder.build(asm, lbls)) 
      System.out.println(e.getValue()); 
    } 

} 

class SymbolTable implements Iterable<Entry<String, Symbol>> 
{ 
    private Map<String, Symbol> syms; 

    public SymbolTable() 
    { 
     syms = new HashMap<>(); 
    } 

    public void addSymbol(String key, Symbol sym) 
    { 
     syms.put(key, sym); 
    } 

    public Symbol getSymbol(String key) 
    { 
     return syms.get(key); 
    } 

    @Override 
    public Iterator<Entry<String, Symbol>> iterator() 
    { 
     return syms.entrySet().iterator(); 
    } 
} 

class Symbol 
{ 
    String label; 
    int loc; 
    boolean relative; 

    public Symbol(String label, int loc, boolean relative) 
    { 
     this.label = label; 
     this.loc = loc; 
     this.relative = relative; 
    } 

    @Override 
    public int hashCode() 
    { 
     int hash = 3; 
     hash = 29 * hash + Objects.hashCode(this.label); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object obj) 
    { 
     if (obj == null) return false; 
     if (getClass() != obj.getClass()) return false; 
     final Symbol other = (Symbol) obj; 
     if (!Objects.equals(this.label, other.label)) return false; 
     return true; 
    } 

    @Override 
    public String toString() 
    { 
     return label + "\t" + loc + "\t" + relative; 
    } 
}