2 词法分析

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();  
        }    }}
Built with MDFriday ❤️