|
| 1 | +package com.compilerprogramming.ezlang.compiler; |
| 2 | + |
| 3 | +import com.compilerprogramming.ezlang.lexer.Lexer; |
| 4 | +import com.compilerprogramming.ezlang.parser.Parser; |
| 5 | +import com.compilerprogramming.ezlang.semantic.SemaAssignTypes; |
| 6 | +import com.compilerprogramming.ezlang.semantic.SemaDefineTypes; |
| 7 | +import com.compilerprogramming.ezlang.types.Symbol; |
| 8 | +import com.compilerprogramming.ezlang.types.Type; |
| 9 | +import com.compilerprogramming.ezlang.types.TypeDictionary; |
| 10 | + |
| 11 | +import java.util.BitSet; |
| 12 | + |
| 13 | +public class Compiler { |
| 14 | + |
| 15 | + private void compile(TypeDictionary typeDictionary) { |
| 16 | + for (Symbol symbol: typeDictionary.getLocalSymbols()) { |
| 17 | + if (symbol instanceof Symbol.FunctionTypeSymbol functionSymbol) { |
| 18 | + Type.TypeFunction functionType = (Type.TypeFunction) functionSymbol.type; |
| 19 | + functionType.code = new CompiledFunction(functionSymbol); |
| 20 | + } |
| 21 | + } |
| 22 | + } |
| 23 | + public TypeDictionary compileSrc(String src) { |
| 24 | + Parser parser = new Parser(); |
| 25 | + var program = parser.parse(new Lexer(src)); |
| 26 | + var typeDict = new TypeDictionary(); |
| 27 | + var sema = new SemaDefineTypes(typeDict); |
| 28 | + sema.analyze(program); |
| 29 | + var sema2 = new SemaAssignTypes(typeDict); |
| 30 | + sema2.analyze(program); |
| 31 | + compile(typeDict); |
| 32 | + return typeDict; |
| 33 | + } |
| 34 | + public String dumpIR(TypeDictionary typeDictionary) { |
| 35 | + StringBuilder sb = new StringBuilder(); |
| 36 | + for (Symbol s: typeDictionary.bindings.values()) { |
| 37 | + if (s instanceof Symbol.FunctionTypeSymbol f) { |
| 38 | + var functionBuilder = (CompiledFunction) f.code(); |
| 39 | + BasicBlock.toStr(sb, functionBuilder.entry, new BitSet()); |
| 40 | + } |
| 41 | + } |
| 42 | + return sb.toString(); |
| 43 | + } |
| 44 | + |
| 45 | +} |
0 commit comments