我正在尝试实现一个基本的词法分析器。我现在陷入了文件解析的困境。
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()
它就退出了。我缺少什么?
您误解了 APIScanner
。从文档中Scanner(String)构造函数:
构造一个新的 Scanner,它生成从指定字符串扫描的值。
参数:
source- 要扫描的字符串
它不是一个文件名——它只是一个字符串。
您应该使用Scanner(File)
相反,构造函数 - 或者更好的是,Scanner(File, String)
构造函数也指定编码。例如:
try (Scanner scanner = new Scanner(new File(this.fileName), "UTF_8")) {
...
}
(请注意使用 try-with-resources 语句,以便扫描仪自动关闭。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)