如何使用BufferedReader将行放入ArrayList然后执行它们?

时间:2018-03-07 20:59:29

标签: java arraylist bufferedreader filereader tokenize

我试图编写一个程序来执行并从文件中生成简化编程语言语句的输出。文件中有几行会给出语句,如 variable = expression,PRINT变量,GOTO' x line',IF变量IS值THEN .... 等等。说 END 是最后一行,应该停止程序。

我使用空格作为分隔符,并且知道我需要使用BufferedReader然后使用tokenizer来分割这些行。我所挣扎的是如何将所有这些陈述/变量存储起来?并行ArrayLists是一个很好的方法吗?如何分别读取每个变量和表达式并进行评估?这就是我到目前为止所做的:

public void processProgram() {
    String fileName = getFileName();
    if(fileName != null)
        processProgram();
    String line = null;
    ArrayList<String> name = new ArrayList<String>();
    ArrayList<Integer> value = new ArrayList<Integer>();
    try (BufferedReader br = new BufferedReader(new FileReader(getFileName())))
    {

        while((line = br.readLine()) != null){
            name.add(line);
        }
    }  catch (IOException e) {
        e.printStackTrace();
    } 

    StringTokenizer tok = new StringTokenizer(line);
    while (tok.hasMoreTokens()) {
        String token = tok.nextToken(" ");

    }


}

我是一个初学者,所以任何方向都会很棒。

2 个答案:

答案 0 :(得分:0)

执行此操作的一种简单方法是进行如下设置:

List<String> lines; // from the file
int currentIndex;   // the "instruction pointer"

您可以使用Map<String, Double> vars;之类的内容来存储变量。(请参阅Map tutorial。)

然后有一个类似这样的方法:

// (returns the next line)
int executeCurrentLine() {
    String line = lines.get(currentIndex);

    if (line.startsWith("GOTO")) {
        return Integer.parseInt(line.substring(4).trim());
    } else if (line.startsWith("PRINT")) {
        String name = line.substring(5).trim();
        System.out.println(vars.get(name));
    } else {
        // and so on
    }
    return currentIndex + 1;
}

然后你做这样的事情:

while (currentIndex < lines.size()) {
    currentIndex = executeCurrentLine();
}

当然有很多方法可以让它变得更复杂但我希望能给你一些关于如何开始这样做的想法。

编辑:对上述简单方案的一个改进是创建一个抽象类:

abstract class Command {
    // where Context is some object that lets
    // the command e.g. access variables
    abstract void execute(Context context);
}

// and for example
class GoToCommand extends Command {
    final int lineNumber;
    GoToCommand(String line) {
        lineNumber = Integer.parseInt(line.substring("GOTO".length()).trim());
    }
    @Override
    void execute(Context context) {
        context.setCurrentLine(lineNumber);
    }
}

然后,您不必同时进行解析和评估,而是解析List<String>行并创建List<Command>。这样可以让你以有意义的方式拆分程序逻辑。

答案 1 :(得分:0)

用于解析指令的Java 8流

使用这样的代码:

Files.lines(Paths.get("Test.txt"))
                .map(p -> p.toUpperCase())
                .collect(Collectors.toList());

您可以获取文件中的所有行,对它们进行转换(在此示例中,我只是将字符串设置为大写,您可能希望将它们转换为可用的指令,但是将它们存储在内部),然后将结果项存储到准备好使用的清单。

处理列表中的项目

你需要一个指令指针,然后根据那时的指令你可以跟随下一条指令,跳转到另一个点,或者终止执行。