package frontend;
import error.Error;
import frontend.lexer.Lexer;
import frontend.lexer.Token;
import java.io.*;
import java.util.List;
// FrontEnd 类负责协调词法分析过程,处理文件输入输出
public class FrontEnd {
/**
* 运行词法分析主流程
* @param inputFile 输入的源程序文件路径(如 testfile.txt)
* @param lexerOutput 词法分析输出文件路径(如 lexer.txt)
* @param errorOutput 错误输出文件路径(如 error.txt)
*/
public static void run(String inputFile, String lexerOutput, String errorOutput) {
try {
// 读取输入文件内容到字符串
BufferedReader reader = new BufferedReader(new FileReader(inputFile));
StringBuilder source = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
source.append(line).append('\n'); // 保留换行符,便于行号统计
}
reader.close();
// 创建词法分析器并进行词法分析
Lexer lexer = new Lexer(source.toString());
List<Token> tokens = lexer.tokenize(); // 获取所有单词Token
List<Error> errors = lexer.getErrors(); // 获取所有错误信息
if (errors.isEmpty()) {
// 没有错误,输出词法分析结果到 lexer.txt
BufferedWriter lexerWriter = new BufferedWriter(new FileWriter(lexerOutput));
for (Token token : tokens) {
// 输出格式:类别码+空格+单词字符串
lexerWriter.write(token.GetTokenType() + " " + token.GetStringValue());
lexerWriter.newLine();
} lexerWriter.close();
// error.txt 为空
// BufferedWriter errorWriter = new BufferedWriter(new FileWriter(errorOutput));
// errorWriter.close();
} else {
// 有错误,lexer.txt 不输出内容,仅输出 error.txt
BufferedWriter errorWriter = new BufferedWriter(new FileWriter(errorOutput));
errors.sort((e1, e2) -> Integer.compare(e1.line, e2.line)); // 按行号升序排序
for (Error error : errors) {
// 输出格式:行号+空格+错误类别码
errorWriter.write(error.line + " " + error.type);
errorWriter.newLine();
} errorWriter.close();
// lexer.txt 为空
// BufferedWriter lexerWriter = new BufferedWriter(new FileWriter(lexerOutput));
// lexerWriter.close();
}
} catch (IOException e) {
// 文件读写异常处理
e.printStackTrace();
} }}