2012-01-07 7 views
0

現在の割り当てでは、非常に小さく基本的なプログラミング言語(FORTRANのように少し動作する)で命令を含むファイルを読み込み、それらの命令を実行するプログラムが必要です。基本的には、私が推測する言語のための簡単な通訳です。これは完全に線形で、ステートメントはすべて順番に定義されており、文字列と整数の変数しかありません。ソースファイル内に8つのキーワードと4つの算術演算子があり、それらを見つけて定義する必要があり、各行は予約語の1つで始まる必要があります。Javaのインタプリタを書いてスイッチやif文を書く

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

は、私が代わりに検索し、これらすべてを実行するために、ループ場合のスイッチブロックを使用することができます。この言語で プログラムは次のようになりますか?私の関心事は、スイッチはJava 6のStringsで動作しないということです。これは、使用するはずのものですが、スイッチブロックが機能するようにさまざまなint値を簡単に割り当てる方法はわかりません。どのような提案や助言もありがとうございます!

+1

私はあなた自身の質問に答えてくれたと思います... –

+0

いくつかのソースコードを表示してください...何を試してみましたか? – Yahia

+1

通常、入力はトークン化されます。トークン識別子または列挙型をswitch文で使用できます。つまり、必要はありません。トークンハンドラをインタフェースimplとして実装し、それらをトークンハンドラマップにダンプします。 –

答えて

1

あなたの言語は、すべての文が独自の行で始まるようにシンプルで、1つのワードのみで識別された場合、(灰色が別のコメントで指摘したように)することができます各行の単語を分割し、最初の単語とマップを比較します。しかし、私の代わりにint型に単語をマッピングして、一つの大きなスイッチを行うのではなく、オブジェクトにそれらをマッピングするために、このように(デイブ・ニュートンによって提案された)、お勧めします:

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つの巨大な方法で終わることなく、より多くのコマンドを扱うことができ、コマンドごとに1つの小さなメソッドを使用できることです。

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 
} 

dが好きです。あなたは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 
     ... 
} 
関連する問題