BackEnd.java 2.30 KiB
package backend;
import backend.builder.generator.NaiveGenerator;
import backend.builder.generator.SimpleGenerator;
import backend.builder.generator.TempFunction;
import backend.builder.globalvar.GlobalTable;
import backend.builder.register.SimpleLinearScanAllocator;
import backend.exception.BackendExceptions;
import backend.exception.CannotFindJumpTargetLabel;
import backend.flowgraph.FlowGraph;
import backend.optimizer.peephole.PeepholeExecutor;
import ir.BeginFunc;
import ir.EndFunc;
import ir.ILine;
import ir.Quadruple;
import java.util.ArrayList;
import java.util.List;
/**
 * @author lire
 * @title: BackEnd
 * @projectName CSC
 * @description: TODO
 * @date 2022/5/1712:54
public class BackEnd {
    public List<ILine> lines;
    public GlobalTable gTable = new GlobalTable();
//    public List<FlowGraph> functionLst = new ArrayList<>();
    public List<TempFunction> functionLst = new ArrayList<>();
    public BackEnd(List<ILine> lines) {
        this.lines = lines;
    public String generate() throws BackendExceptions {
        List<ILine> localLines = new ArrayList<>();
        boolean isGlobal = true;
        for (ILine line : lines) {
            System.out.println(line);
            if (line instanceof BeginFunc) {
                isGlobal = false;
            if (line instanceof EndFunc) {
                isGlobal = true;
                var peepholeOptimizer = new PeepholeExecutor.PeepholeExecutorBuilder(localLines).build();
                localLines = peepholeOptimizer.execute();
                functionLst.add(new TempFunction(((EndFunc) line).getFuncName(), localLines));
                localLines = new ArrayList<>();
            if (line instanceof Quadruple)
                gTable.GenerateItem((Quadruple) line, !isGlobal);
            if (!isGlobal) {
                localLines.add(line);
        StringBuilder builder = new StringBuilder();
        builder.append(".arch armv7ve\n");
        builder.append(".arm\n");
        gTable.createGlobalCode(builder);
        builder.append(".global main\n");
        builder.append(".section .text\n");
        for (var func : functionLst) {
            var generator = new NaiveGenerator(func, gTable, builder);
            generator.emit();
        return builder.toString();
7172
}