private Compiler(String source) { this.Source = source; // Lexical analysis Scanner scanner = new Scanner(source); this.Tokens = scanner.Tokens.ToImmutableList(); // Parse var parserResult = CParsers.Parse(this.Tokens); if (parserResult.Source.Count() != 1) { throw new InvalidOperationException("Error: not finished parsing"); } this.SyntaxTree = parserResult.Result; // Semantic analysis var semantReturn = this.SyntaxTree.GetTranslnUnit(); this.AbstractSyntaxTree = semantReturn.Value; this.Environment = semantReturn.Env; // Code generation var state = new CGenState(); this.AbstractSyntaxTree.CodeGenerate(state); this.Assembly = state.ToString(); }