2012-01-07 46 views
0

當前任務需要我編寫一個程序來讀取帶有非常小的基本編程語言(行爲有點像FORTRAN)的指令的文件並執行這些指令。基本上它是我猜測的語言的簡單解釋器。它是完全線性的,所有的語句都是按順序定義的,它只有字符串和整數變量。有8個關鍵字和4個算術運算符,我需要找到並定義它們是否存在於源文件中,並且每行必須以其中一個保留字開始。 在這門語言的程序可能會是這個樣子:切換或if語句在java中編寫解釋程序

#COMMENTS 
LET.... (declares variables with values) 
INTEGER myINT 
STRING myString 
CALCULATE... 
PRINT 
PRINTLN 
END 

我可以使用一個開關塊,而不是如果,循環,以找到並執行了這一切?我擔心的是交換機不能在Java 6中使用Strings,這是我應該使用的,但是我看不到如何輕鬆分配各種int值,因此交換機可以工作。在此先感謝您的任何建議和建議!

+1

我想你已經回答了你自己的問題... – 2012-01-07 19:06:44

+0

請顯示一些源代碼...你有什麼試過? – Yahia 2012-01-07 19:06:46

+1

正常輸入將被標記化;令牌標識符或枚舉可以在switch語句中使用。也就是說,沒有必要 - 將令牌處理程序實現爲接口impl並將它們轉儲到令牌處理程序映射中。 – 2012-01-07 19:20:10

回答

1

如果你的語言是如此簡單,每個語句在其自己的行開始,以一個字只認,然後(如灰色的另一個評論指出),你可以拆分每行中的單詞,然後將第一個單詞與地圖進行比較。不過,我會建議,而不是映射的話整數,然後做一個大的交換機,將它們映射到對象,而不是像這樣(由戴維·牛頓建議):

interface Directive { 
    public void execute(String line); 
} 

class LetDirective implements Directive { 
    public void execute(String line) { ...handle LET directive here... } 
} 

...define other directives in the same way... 

然後定義地圖:

private Map<String, Directive> directives = new HashMap<String, Directive>(); 
directives.put("LET", new LetDirective()); 
... 

然後在您的分析方法:

int firstSpace = line.indexOf(' '); 
String command = line; 
if (firstSpace > 0) 
    command = line.substring(0, firstSpace); 
Directive directive = directives.get(command.toUpperCase()); 
if (directive != null) 
    directive.execute(line); 
else 
    ...show some error... 

每個指令必須分析自身行的休息和正確處理其execute()方法中。

這對交換機的好處是,你可以處理大量的命令而不會結束一個巨大的方法,而是每個命令使用一個較小的方法。

1

如果你正在談論將字符串轉換爲整數,那麼你可以用Java的枚舉類型做到這一點:

private enum ReservedWord { 
    LET, 
    ... 
} 

// skip blank lines and comments 
String[] tokens = codeLine.split(" "); 
ReservedWord keyword; 
try { 
    keyword = ReservedWord.valueOf(tokens[0]); 
} catch (IllegalArgumentException e) { 
    // spit out nice syntax error message 
} 

你也可以把該行的處理枚舉內,如果你的方法」喜歡。你也可以用Map做到這一點:

private final Map<String, Integer> reservedWords = new HashMap<String, Integer>(); 
private final int RESERVED_WORD_LET 1 
... 
{ 
    reservedWords.put("LET", RESERVED_WORD_LET); 
    ... 
} 

// skip blank lines and comments 
String[] tokens = codeLine.split(" "); 
Integer value = reservedWords.get(tokens[0]); 
if (value == null) // handle error... ; 
switch (value) { 
    case 1: 
     // LET 
     ... 
}