Skip to content

Commit

Permalink
- refactoring the transforming flow of IR nodes in Stream Pattern.
Browse files Browse the repository at this point in the history
- rename output name of cfg.
  • Loading branch information
whtoo committed Dec 7, 2023
1 parent 5a647ff commit 1ed4831
Show file tree
Hide file tree
Showing 8 changed files with 34 additions and 35 deletions.
33 changes: 18 additions & 15 deletions ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -44,28 +48,27 @@ 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();

astRoot.accept(irBuilder);

irBuilder.prog.optimizeBasicBlock();
var cfgOptimizer = new ControlFlowAnalysis<IRNode>();
var cnt = 0;
var codeBuffer = new LinkedList<IRNode>();

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);
Expand Down
13 changes: 1 addition & 12 deletions ep20/src/main/java/org/teachfx/antlr4/ep20/ast/CompileUnit.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -29,9 +28,7 @@ public CompileUnit(List<VarDeclNode> varDeclarations, List<FuncDeclNode> funcDec
this.ctx = ctx;
}

public CompileUnit(String srcName) {
this.srcName = srcName;
}
public CompileUnit() {}

public List<VarDeclNode> getVarDeclarations() {
return varDeclarations;
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,13 @@

public class CymbolASTBuilder extends CymbolBaseVisitor<ASTNode> implements CymbolVisitor<ASTNode> {

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) {
Expand Down
17 changes: 13 additions & 4 deletions ep20/src/main/java/org/teachfx/antlr4/ep20/utils/StreamUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,20 @@
import java.util.stream.Stream;

public class StreamUtils {
public static <T> int indexOf(Stream<T> stream, Predicate<T> predicate) {
public static <T> Stream<? super Pair<Integer, T>> mapWithIndex(Stream<T> stream,Function<? super Pair<Integer, T>,? super Pair<Integer, T>> mapper) {
AtomicInteger cnt = new AtomicInteger();
return stream.map(s -> Pair.of( cnt.getAndIncrement(),s)).map(mapper);
}

public static <T> Stream<Pair<Integer,T>> indexStream(Stream<T> 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 <T> int indexOf(Stream<T> stream, Predicate<T> predicate) {
return (int) StreamUtils.indexStream(stream).filter(tIntegerPair ->
predicate.test(tIntegerPair.getRight())
).findFirst().map(Pair::getLeft).orElse(-1);
}
// find matched object
public static <T> T find(Stream<T> stream, Predicate<T> predicate) {
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 comments on commit 1ed4831

Please sign in to comment.