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 9b389ae..af25b4e 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java @@ -12,14 +12,18 @@ import org.teachfx.antlr4.ep20.parser.CymbolLexer; import org.teachfx.antlr4.ep20.parser.CymbolParser; import org.teachfx.antlr4.ep20.pass.ast.CymbolASTBuilder; +import org.teachfx.antlr4.ep20.pass.cfg.CFG; import org.teachfx.antlr4.ep20.pass.cfg.ControlFlowAnalysis; import org.teachfx.antlr4.ep20.pass.codegen.CymbolAssembler; import org.teachfx.antlr4.ep20.pass.ir.CymbolIRBuilder; import org.teachfx.antlr4.ep20.pass.symtab.LocalDefine; +import org.teachfx.antlr4.ep20.utils.StreamUtils; import java.io.*; import java.util.LinkedList; import java.util.List; +import java.util.stream.IntStream; +import java.util.stream.Stream; public class Compiler { @@ -44,7 +48,8 @@ public static void main(String[] args) throws IOException { CommonTokenStream tokenStream = new CommonTokenStream(lexer); CymbolParser parser = new CymbolParser(tokenStream); ParseTree parseTree = parser.file(); - CymbolASTBuilder astBuilder = new CymbolASTBuilder("t.cymbol"); + + CymbolASTBuilder astBuilder = new CymbolASTBuilder(); ASTNode astRoot = parseTree.accept(astBuilder); astRoot.accept(new LocalDefine()); var irBuilder = new CymbolIRBuilder(); @@ -52,20 +57,18 @@ public static void main(String[] args) throws IOException { astRoot.accept(irBuilder); irBuilder.prog.optimizeBasicBlock(); - var cfgOptimizer = new ControlFlowAnalysis(); - var cnt = 0; - var codeBuffer = new LinkedList(); - - for(var funBlock : irBuilder.prog.blockList) { - var cfg = irBuilder.getCFG(funBlock); - saveToEp20Res(cfg.toString(),"origin"+cnt); - cfg.addOptimizer(cfgOptimizer); - cfg.applyOptimizers(); - saveToEp20Res(cfg.toString(),"optimized"+cnt); - cnt++; - logger.info("CFG:\n" + cfg.toString()); - codeBuffer.addAll(cfg.getIRNodes()); - } + + 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)); + }) + .flatMap(s -> s.getRight().getIRNodes().stream()).toList(); var assembler = new CymbolAssembler(); assembler.visit(codeBuffer); diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/ast/CompileUnit.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/ast/CompileUnit.java index 91e8036..ff57e71 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/ast/CompileUnit.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/ast/CompileUnit.java @@ -9,7 +9,6 @@ import java.util.List; public class CompileUnit extends ASTNode { - private String srcName; public void addFuncDecl(FuncDeclNode funcDecl) { this.funcDeclarations.add(funcDecl); @@ -29,9 +28,7 @@ public CompileUnit(List varDeclarations, List funcDec this.ctx = ctx; } - public CompileUnit(String srcName) { - this.srcName = srcName; - } + public CompileUnit() {} public List getVarDeclarations() { return varDeclarations; @@ -56,14 +53,6 @@ protected void _dump(Dumper d) { d.printNodeList("funcDecl",funcDeclarations); } - public String getSrcName() { - return srcName; - } - - public void setSrcName(String srcName) { - this.srcName = srcName; - } - @Override public void accept(ASTVisitor visitor) { visitor.visit(this); 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 d3b4044..4106e42 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 @@ -21,15 +21,13 @@ public class CymbolASTBuilder extends CymbolBaseVisitor implements CymbolVisitor { - protected String srcName; - public CymbolASTBuilder(String srcName) { + public CymbolASTBuilder() { super(); - this.srcName = srcName; } @Override public ASTNode visitCompilationUnit(CymbolParser.CompilationUnitContext ctx) { - var compilationUnit = new CompileUnit(srcName); + var compilationUnit = new CompileUnit(); for(var childNode : ctx.children) { var node = visit(childNode); if(node instanceof VarDeclNode varDeclNode) { diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/utils/StreamUtils.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/utils/StreamUtils.java index d72c429..c7b8137 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/utils/StreamUtils.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/utils/StreamUtils.java @@ -8,11 +8,20 @@ import java.util.stream.Stream; public class StreamUtils { - public static int indexOf(Stream stream, Predicate predicate) { + public static Stream> mapWithIndex(Stream stream,Function,? super Pair> mapper) { + AtomicInteger cnt = new AtomicInteger(); + return stream.map(s -> Pair.of( cnt.getAndIncrement(),s)).map(mapper); + } + + public static Stream> indexStream(Stream stream) { AtomicInteger cnt = new AtomicInteger(); - return stream.map(s -> Pair.of(s, cnt.getAndIncrement())).filter(tIntegerPair -> - predicate.test(tIntegerPair.getLeft()) - ).findFirst().map(Pair::getRight).orElse(-1); + return stream.map(s -> Pair.of(cnt.getAndIncrement(),s)); + } + + public static int indexOf(Stream stream, Predicate predicate) { + return (int) StreamUtils.indexStream(stream).filter(tIntegerPair -> + predicate.test(tIntegerPair.getRight()) + ).findFirst().map(Pair::getLeft).orElse(-1); } // find matched object public static T find(Stream stream, Predicate predicate) { diff --git a/ep20/src/main/resources/graph_optimized0.md b/ep20/src/main/resources/graph_0_optimized.md similarity index 100% rename from ep20/src/main/resources/graph_optimized0.md rename to ep20/src/main/resources/graph_0_optimized.md diff --git a/ep20/src/main/resources/graph_origin0.md b/ep20/src/main/resources/graph_0_origin.md similarity index 100% rename from ep20/src/main/resources/graph_origin0.md rename to ep20/src/main/resources/graph_0_origin.md diff --git a/ep20/src/main/resources/graph_optimized1.md b/ep20/src/main/resources/graph_1_optimized.md similarity index 100% rename from ep20/src/main/resources/graph_optimized1.md rename to ep20/src/main/resources/graph_1_optimized.md diff --git a/ep20/src/main/resources/graph_origin1.md b/ep20/src/main/resources/graph_1_origin.md similarity index 100% rename from ep20/src/main/resources/graph_origin1.md rename to ep20/src/main/resources/graph_1_origin.md