internal static List <Instruction> GetRawBytecode(List <SourceFile> sources) { // Tokenize files. var tokenizedFiles = new List <List <Token> >(); foreach (var sourceFile in sources) { var tokenizer = new Shovel.Compiler.Tokenizer(sourceFile); tokenizedFiles.Add(tokenizer.Tokens); } // Parse files. var parseForests = new List <List <ParseTree> >(); foreach (var tokenizedFile in tokenizedFiles) { var parser = new Shovel.Compiler.Parser(tokenizedFile, sources); parseForests.Add(parser.ParseTrees); } // Flatten the forests of parse trees into one for code generation. var bigParseForest = new List <ParseTree>(); foreach (var parseTrees in parseForests) { bigParseForest.AddRange(parseTrees); } // Generate the code. var codeGenerator = new Shovel.Compiler.CodeGenerator(bigParseForest, sources); return(codeGenerator.Bytecode); }
internal static List<Instruction> GetRawBytecode(List<SourceFile> sources) { // Tokenize files. var tokenizedFiles = new List<List<Token>>(); foreach (var sourceFile in sources) { var tokenizer = new Shovel.Compiler.Tokenizer(sourceFile); tokenizedFiles.Add(tokenizer.Tokens); } // Parse files. var parseForests = new List<List<ParseTree>>(); foreach (var tokenizedFile in tokenizedFiles) { var parser = new Shovel.Compiler.Parser(tokenizedFile, sources); parseForests.Add(parser.ParseTrees); } // Flatten the forests of parse trees into one for code generation. var bigParseForest = new List<ParseTree>(); foreach (var parseTrees in parseForests) { bigParseForest.AddRange(parseTrees); } // Generate the code. var codeGenerator = new Shovel.Compiler.CodeGenerator(bigParseForest, sources); return codeGenerator.Bytecode; }