扫描仪只读取文件名而不读取其他内容

时间:2013-11-07 21:02:26

标签: java parsing java.util.scanner

我正在尝试实施一个基本的词法分析器。我现在仍然坚持解析文件。

public ArrayList<Token> ParseFile () {

    int lineIndex = 0;
    Scanner scanner = new Scanner(this.fileName);

    while (scanner.hasNextLine()) {

        lineIndex++;
        String line = scanner.nextLine();

        if (line.equals(""))
        continue;

        String[] split = line.split("\\s"); 
        for (String s : split) {
        if (s.equals("") || s.equals("\\s*") || s.equals("\t"))
        continue;
        Token token = new Token(s, lineIndex);
        parsedFile.add(token);

        }
    }
    scanner.close();
    return this.parsedFile;
}

这是我的名为“p ++。ppp”

的文章
#include<iostream>

using namespace std ;

int a ;
int b ;

int main ( ) {

    cin >> a ;
    cin >> b ;

    while ( a != b ) {
        if ( a > b )
            a = a - b ;
        if ( b > a )
            b = b - a ;
    }

    cout << b ;

    return 0 ;
}

当我解析文件时,我得到:Error, token: p++.ppp on line: 1 is not valid但是p ++。ppp是文件名!

同样在我调试时,它会读取文件名,然后在scanner.hasNextLine()它就会退出。我错过了什么?

1 个答案:

答案 0 :(得分:6)

您误解了Scanner的API。来自Scanner(String) constructor的文档:

  

构造一个新的Scanner,它生成从指定字符串扫描的值。

     

参数:
  来源 - 要扫描的字符串

这不是文件名 - 它只是一个字符串。

您应该使用Scanner(File)构造函数 - 或者更好的是Scanner(File, String)构造函数来指定编码。例如:

try (Scanner scanner = new Scanner(new File(this.fileName), "UTF_8")) {
    ...
}

(请注意使用try-with-resources语句,以便扫描程序自动关闭。)