From e5c47d9201bd47527c965365fdf84ebf6c9f33d2 Mon Sep 17 00:00:00 2001 From: willson walter Date: Thu, 7 Dec 2023 12:01:06 +0800 Subject: [PATCH] - refactoring the transforming flow of IR nodes in Stream Pattern. - rename output name of cfg. --- .../org/teachfx/antlr4/ep20/Compiler.java | 47 +++++++++++++------ .../ep20/pass/ast/CymbolASTBuilder.java | 9 ++++ 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java index af25b4e..b1c7277 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java @@ -4,6 +4,7 @@ import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; +import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.teachfx.antlr4.ep20.ast.ASTNode; @@ -20,8 +21,10 @@ import org.teachfx.antlr4.ep20.utils.StreamUtils; import java.io.*; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -50,30 +53,44 @@ public static void main(String[] args) throws IOException { ParseTree parseTree = parser.file(); CymbolASTBuilder astBuilder = new CymbolASTBuilder(); + ASTNode astRoot = parseTree.accept(astBuilder); + astRoot.accept(new LocalDefine()); + var irBuilder = new CymbolIRBuilder(); astRoot.accept(irBuilder); irBuilder.prog.optimizeBasicBlock(); - var codeBuffer = StreamUtils.indexStream(irBuilder.prog.blockList.stream() - .map(irBuilder::getCFG)) - .peek(cfgPair -> { - var cfg = cfgPair.getRight(); - var idx = cfgPair.getLeft(); - saveToEp20Res(cfg.toString(), "%d_origin".formatted(idx)); - cfg.addOptimizer(new ControlFlowAnalysis<>()); - cfg.applyOptimizers(); - saveToEp20Res(cfg.toString(), "%d_optimized".formatted(idx)); + Stream.of( + StreamUtils.indexStream(irBuilder.prog.blockList.stream() + .map(irBuilder::getCFG)) + .peek(cfgPair -> { + var cfg = cfgPair.getRight(); + var idx = cfgPair.getLeft(); + saveToEp20Res(cfg.toString(), "%d_origin".formatted(idx)); + cfg.addOptimizer(new ControlFlowAnalysis<>()); + cfg.applyOptimizers(); + saveToEp20Res(cfg.toString(), "%d_optimized".formatted(idx)); + }) + .map(Pair::getRight) + .map(CFG::getIRNodes) + .reduce(new ArrayList(), (a, b) -> { + a.addAll(b); + return a; + }) + ) + .map(irNodeList -> { + var assembler = new CymbolAssembler(); + assembler.visit(irNodeList); + return assembler; }) - .flatMap(s -> s.getRight().getIRNodes().stream()).toList(); - - var assembler = new CymbolAssembler(); - assembler.visit(codeBuffer); - saveToEp18Res(assembler.getAsmInfo()); - logger.debug("\n%s".formatted(assembler.getAsmInfo())); + .forEach(assembler -> { + saveToEp18Res(assembler.getAsmInfo()); + logger.debug("\n%s".formatted(assembler.getAsmInfo())); + }); } protected static void saveToEp18Res(String buffer) { diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/ast/CymbolASTBuilder.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/ast/CymbolASTBuilder.java index 4106e42..eb08003 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/ast/CymbolASTBuilder.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/ast/CymbolASTBuilder.java @@ -23,8 +23,17 @@ public class CymbolASTBuilder extends CymbolBaseVisitor implements Cymb public CymbolASTBuilder() { super(); + } + public static CymbolASTBuilder build(CymbolParser.CompilationUnitContext ctx) { + var astBuilder = new CymbolASTBuilder(); + + astBuilder.visit(ctx); + return astBuilder; + } + + @Override public ASTNode visitCompilationUnit(CymbolParser.CompilationUnitContext ctx) { var compilationUnit = new CompileUnit();