2011-08-17 42 views
1

Am Java編程的新手,想知道如何編寫解釋器程序來在java中添加兩個數字。解釋器程序在java中添加兩個數字

解釋器程序應該讀取源文件中的行並根據源文件中的行執行必要的操作。

示例:如果在源文件中的第一行被讀取然後解釋應該要求用於從用戶(鍵盤)輸入值將它存儲到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.can中的任何解釋器編碼,那麼你可以幫我解決問題。 – Jey

+0

這不是一個小問題。一般來說,您需要定義語言的語法和語法,然後編寫解析器和執行代碼。那裏最有可能的圖書館會爲你做繁重的工作。你可能想看看(JavaCC http://javacc.java.net/)。 – Carsten

回答

2

你要做的是做一個scripting language。我與你聯繫的維基百科文章應該讓你開始,進一步的谷歌搜索將爲您提供更多的細節。 (一個好的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的值,將它們相加,並將結果存儲在第三個int變量中。 PRINT命令應該簡單地執行每個變量的System.out.println:A,B和「result」 – Ramses

0

這裏是純Java 8實現:

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"))); 
    } 
} 

我們存儲在variables地圖變量(假定他們是整數)和命令在commands映射。該命令接受單個字符串參數,並且有適配器方法可以將兩個參數命令(如ADD)轉換爲單個參數。你可以在構造函數中添加更多的命令。

更新從外部文件,資源等讀取程序源代碼的主要方法。還要注意,此實現沒有錯誤處理:不正確的輸入將被忽略或導致程序崩潰。