2011-08-17 8 views
1

新しいJavaコーディングで、Javaで2つの数字を追加するインタプリタプログラムを作成する方法を知りたい。Javaで2つの数字を追加するインタープリタープログラム

インタープリタプログラムはソースファイルから行を読み込み、ソースファイルの行に基づいて必要な操作を行う必要があります。

例:ソースファイルの最初の行は、次に、インタプリタがユーザ(キーボード)からの入力値を求めるべきである読まれる場合A.にそれを格納

同じREAD Bおよびのために行われるべきである ADD A、B、PRINT A操作。

以下は、要件のソースファイルの例です。

READ A 
READ B 

ADD A, B 

PRINT A 

RESULT: 
10 
20 
30 
+3

まだコードを書いていませんか?もしそうなら、具体的な問題点を示して説明してください。 – Jeremy

+0

私はコアJavaの基礎といくつかの概念を事前にJavaで知っていますが、これはインタプリタのコーディングを試みるのは初めてです。私はコードを理解しようと多くの努力をしましたが、answer.doを見つけることができませんでした。 – Jey

+0

これは小さな問題ではありません。一般的には、使用する言語の構文と文法を定義し、パーサーと実行コードを記述する必要があります。あなたのために重労働を行う可能性が最も高いライブラリがあります。 (JavaCC http://javacc.java.net/)を見てみたいかもしれません。 – Carsten

答えて

2

あなたがしようとしているのは、scripting languageです。ウィキペディアの記事私はあなたにリンクして、あなたを始めようとしました、それ以上のgoogleの検索はあなたに詳細を提供します。 (スクリプト言語のための良いJavaWorld記事。)あなたがしなければならない

1

最初のものは、いくつかの部分で問題を打破され、これは私がこれ(あなたはすでにJavaの知識を持っていると仮定して)アプローチする方法を次のとおりです。

  • テキストファイルから行を読み取ってコンソールに出力する単純なプログラムを実行します。
  • これは難しい部分です。それが終わったら、すべての行について、予約されたキーワード、つまりREAD、PRINT、ADDのテキストファイルから取得した各行をチェックする必要があります。
  • すべてのキーワードは異なる動作をしなければならず、異なる数のパラメータが必要です。つまり、ADDキーワードを見つけた場所では、数字、カンマ、別の数字が必要です。その後、そのキーワードに対して適切なアクションを実行できます。

あなたが始めることができると思いますが、ここで私はあなたにshort example on how to read text files

+0

+1ハードな問題を小さなチャンクに分割します。それが私のやり方です。:) – fgysin

+0

貴重な解決に感謝します。 ADD READとPRINTの構文をガイドすることができます。 – Jey

+0

もちろん、あなたのコードでは、すべてのREADコマンドに対して、以前に宣言されたint変数にその値を渡す必要があります(私はあなたのインタプリタのための実際のテキストファイルは文字ではなく数字を持つべきだと仮定しています)。 ADDコマンドの場合は、AとBの値を読み込みます。この値はすでに持っているものを追加し、その結果を3番目のint変数に格納します。 PRINTコマンドは、単にすべての変数のSystem.out.printlnを実行する必要があります.A、B、および "result" – Ramses

0

を残すここでピュアJava 8の実装です:私たちはvariablesマップ(彼らは整数であると仮定)で変数を格納

import java.io.*; 
import java.util.*; 
import java.util.function.*; 

public class Calculator { 
    Map<String, Integer> variables = new HashMap<>(); 
    Map<String, Consumer<String>> commands = new HashMap<>(); 

    Scanner scanner = new Scanner(System.in); 
    PrintStream out = System.out; 

    private Consumer<String> twoArgs(BiConsumer<String, String> bc) { 
     return args -> { 
      String[] fields = args.split(",\\s*", 2); 
      bc.accept(fields[0], fields[1]); 
     }; 
    } 

    public Calculator() { 
     commands.put("READ", name -> variables.put(name, scanner.nextInt())); 
     commands.put("PRINT", name -> out.println(variables.get(name))); 
     commands.put("ADD", twoArgs((var1, var2) -> 
      variables.merge(var1, variables.getOrDefault(var2, 0), Integer::sum))); 
    } 

    public void process(BufferedReader input) { 
     input.lines() 
      .map(line -> line.split("\\s+", 2)) 
      .filter(fields -> fields.length == 2) 
      .forEach(fields -> 
       commands.getOrDefault(fields[0].toUpperCase(), s -> {}) 
         .accept(fields[1])); 
    } 

    public static void main(String[] args) { 
     new Calculator().process(new BufferedReader(new StringReader(
      "READ A\nREAD B\n\n\nADD A, B\n\nPRINT A"))); 
    } 
} 

commands地図のコマンド。コマンドは単一文字列パラメータを受け入れ、2つのパラメータコマンド(ADDなど)を単一のパラメータに変換するアダプタメソッドがあります。コンストラクタでさらにコマンドを追加することができます。

外部ソースファイル、リソースなどからプログラムのソースコードを読み込むメインメソッドを更新します。この実装にはエラー処理がありません。誤った入力は無視されるか、プログラムがクラッシュする可能性があります。

関連する問題