/// <summary> /// Creates a new Event Assembler code language /// </summary> /// <param name="name">Name of the language</param> /// <param name="pointerMaker">Pointer maker for this language</param> /// <param name="pointerList">Pointer list of this langauge, String is the name of the /// label to point to, List are the priorities that are pointed to.</param> /// <param name="pointerListParameters">Array of amount of pointers per POIN code for pointer list.</param> public EACodeLanguage(string name, IPointerMaker pointerMaker, Tuple<string, List<Priority>>[][] pointerList, ICodeTemplateStorer codeStorer, StringComparer stringComparer) { this.name = name; this.codeStorage = codeStorer; //codeStorage.AddCode(new RawCodeTemplate(stringComparer), Priority.low); //codeStorage.AddCode(new CodeFillerTemplate(stringComparer), Priority.low); foreach (ICodeTemplate template in codeStorer) { CodeTemplate template2 = template as CodeTemplate; if (template2 != null) { template2.PointerMaker = pointerMaker; } } reservedWords = new List<string> { offsetChanger, //Offset changing code alignOffset, //Offset aligning code currentOffset, //Referances current offset messagePrinter, //Print message to message box/something errorPrinter, //Print message to message box/something warningPrinter //Print message to message box/something }; this.assembler = new EAExpressionAssembler(codeStorage, null); this.disassembler = new EACodeLanguageDisassembler( codeStorage, pointerMaker, pointerList); }
/// <summary> /// Creates a new Event Assembler code language /// </summary> /// <param name="name">Name of the language</param> /// <param name="pointerMaker">Pointer maker for this language</param> /// <param name="pointerList">Pointer list of this langauge, String is the name of the /// label to point to, List are the priorities that are pointed to.</param> /// <param name="pointerListParameters">Array of amount of pointers per POIN code for pointer list.</param> public EACodeLanguage(string name, IPointerMaker <int> pointerMaker, Tuple <string, List <Priority> >[][] pointerList, ICodeTemplateStorer codeStorer, StringComparer stringComparer) { this.name = name; this.codeStorage = codeStorer; //codeStorage.AddCode(new RawCodeTemplate(stringComparer), Priority.low); //codeStorage.AddCode(new CodeFillerTemplate(stringComparer), Priority.low); //foreach (ICodeTemplate template in codeStorer) //{ // CodeTemplate template2 = template as CodeTemplate; // if (template2 != null) // { // template2.PointerMaker = pointerMaker; // } //} reservedWords = new List <string> { offsetChanger, //Offset changing code alignOffset, //Offset aligning code currentOffset, //Referances current offset messagePrinter, //Print message to message box/something errorPrinter, //Print message to message box/something warningPrinter //Print message to message box/something }; var pres = new IntRepresentation(); this.assembler = new EAExpressionAssembler <int>( codeStorage, new TokenParser <int>(StringExtensions.GetValue), new IntRepresentation(), pointerMaker); this.disassembler = new EACodeLanguageDisassembler <int>( codeStorage, pointerMaker, pointerList, pres); }
/// <summary> /// Creates a new Event Assembler code language /// </summary> /// <param name="name">Name of the language</param> /// <param name="pointerMaker">Pointer maker for this language</param> /// <param name="pointerList">Pointer list of this langauge, String is the name of the /// label to point to, List are the priorities that are pointed to.</param> /// <param name="pointerListParameters">Array of amount of pointers per POIN code for pointer list.</param> public EACodeLanguage(string name, IPointerMaker<int> pointerMaker, Tuple<string, List<Priority>>[][] pointerList, ICodeTemplateStorer codeStorer, StringComparer stringComparer) { this.name = name; this.codeStorage = codeStorer; //codeStorage.AddCode(new RawCodeTemplate(stringComparer), Priority.low); //codeStorage.AddCode(new CodeFillerTemplate(stringComparer), Priority.low); //foreach (ICodeTemplate template in codeStorer) //{ // CodeTemplate template2 = template as CodeTemplate; // if (template2 != null) // { // template2.PointerMaker = pointerMaker; // } //} reservedWords = new List<string> { offsetChanger, //Offset changing code alignOffset, //Offset aligning code currentOffset, //Referances current offset messagePrinter, //Print message to message box/something errorPrinter, //Print message to message box/something warningPrinter //Print message to message box/something }; var pres = new IntRepresentation(); this.assembler = new EAExpressionAssembler<int>( codeStorage, new TokenParser<int>(StringExtensions.GetValue), new IntRepresentation(), pointerMaker); this.disassembler = new EACodeLanguageDisassembler<int>( codeStorage, pointerMaker, pointerList, pres); }
private static void Assemble(ILog log) { TextReader input; bool inputIsFile; if (Program.RunConfig.inputFile != null) { input = File.OpenText(Program.RunConfig.inputFile); inputIsFile = false; } else { input = Console.In; inputIsFile = true; } using (IDirectivePreprocessor preprocessor = new Preprocessor(log)) { // preprocessor.AddReserved (eaCodeLanguage.GetCodeNames ()); preprocessor.AddDefined(new string[] { "_" + Program.RunConfig.language + "_", "_EA_" }); DependencyMakingIncludeListener depMaker = null; if (Program.RunConfig.ppDepEnable) { depMaker = new DependencyMakingIncludeListener(); preprocessor.IncludeListener = depMaker; } using (IInputStream inputStream = new PreprocessingInputStream(input, preprocessor)) { if (Program.RunConfig.ppSimulation) { // preprocess to null output while (inputStream.ReadLine() != null) { ; } } else { if (Program.RunConfig.outputFile == null) { log.AddError("No output file specified for assembly."); return; } string outFile = Program.RunConfig.outputFile; if (File.Exists(outFile) && File.GetAttributes(outFile).HasFlag((Enum)FileAttributes.ReadOnly)) { log.AddError("File `{0}` exists and cannot be written to.", outFile); return; } ChangeStream changeStream = new ChangeStream(); using (BinaryWriter output = new BinaryWriter((Stream)changeStream)) { if (!Program.CodesLoaded) { LoadCodes(false); } EACodeLanguage language = Program.Languages [Program.RunConfig.language]; EAExpressionAssembler assembler = new EAExpressionAssembler(language.CodeStorage, new TokenParser <int> (new Func <string, int> (StringExtensions.GetValue))); assembler.Assemble(inputStream, output, log); if (Program.RunConfig.symbolOutputFile != null) { // Outputting global symbols to another file try { if (File.Exists(Program.RunConfig.symbolOutputFile)) { File.Delete(Program.RunConfig.symbolOutputFile); } using (FileStream fileStream = File.OpenWrite(Program.RunConfig.symbolOutputFile)) using (StreamWriter symOut = new StreamWriter(fileStream)) foreach (KeyValuePair <string, int> symbol in assembler.GetGlobalSymbols()) { symOut.WriteLine("{0}={1}", symbol.Key, symbol.Value.ToHexString("$")); } } catch (Exception e) { log.AddError(e.ToString()); } } } if (log.ErrorCount == 0) { using (Stream stream = (Stream)File.OpenWrite(outFile)) changeStream.WriteToFile(stream); } } } if (depMaker != null) { try { depMaker.GenerateMakeDependencies(log); } catch (Exception e) { log.AddError(e.ToString()); } } } if (inputIsFile) { input.Close(); } }
private static void Compile(ILog log) { TextReader input; bool inputIsFile; if (Program.RunConfig.inputFile != null) { input = File.OpenText(Program.RunConfig.inputFile); inputIsFile = false; } else { input = Console.In; inputIsFile = true; } using (IDirectivePreprocessor preprocessor = new Preprocessor(log)) { // preprocessor.AddReserved (eaCodeLanguage.GetCodeNames ()); preprocessor.AddDefined(new string[] { "_" + Program.RunConfig.language + "_", "_EA_" }); DependencyMakingIncludeListener depMaker = null; if (Program.RunConfig.ppDepEnable) { depMaker = new DependencyMakingIncludeListener(); preprocessor.IncludeListener = depMaker; } using (IInputStream inputStream = new PreprocessingInputStream(input, preprocessor)) { if (Program.RunConfig.ppSimulation) { // preprocess to null output while (inputStream.ReadLine() != null) { ; } } else { if (Program.RunConfig.outputFile == null) { log.AddError("No output file specified for assembly."); return; } string outFile = Program.RunConfig.outputFile; if (File.Exists(outFile) && File.GetAttributes(outFile).HasFlag((Enum)FileAttributes.ReadOnly)) { log.AddError("File `{0}` exists and cannot be written to.", outFile); return; } using (StreamWriter output = new StreamWriter(outFile, false, Encoding.Default)) { // Make entry point label global to call in C source file //TODO support ARM? output.WriteLine("\t.thumb"); output.WriteLine("\t.global " + Path.GetFileNameWithoutExtension(outFile).Replace(".", "_")); output.WriteLine("\t.include \"event_func_Thumb.inc\""); output.WriteLine("\t.include \"event_func_C.inc\""); output.WriteLine(Path.GetFileNameWithoutExtension(outFile).Replace(".", "_") + ":"); if (!Program.CodesLoaded) { LoadCodes(false); } // Console.WriteLine("language: {0}", Program.RunConfig.language); EACodeLanguage language = Program.languages [Program.RunConfig.language]; EAExpressionAssembler assembler = new EAExpressionAssembler(language.CodeStorage, new TokenParser <int> (new Func <string, int> (StringExtensions.GetValue))); assembler.Compile(inputStream, output, log); if (Program.RunConfig.symbolOutputFile != null) { // Outputting global symbols to another file try { if (File.Exists(Program.RunConfig.symbolOutputFile)) { File.Delete(Program.RunConfig.symbolOutputFile); } using (FileStream fileStream = File.OpenWrite(Program.RunConfig.symbolOutputFile)) using (StreamWriter symOut = new StreamWriter(fileStream)) foreach (KeyValuePair <string, int> symbol in assembler.GetGlobalSymbols()) { symOut.WriteLine("{0}={1}", symbol.Key, symbol.Value.ToHexString("$")); } } catch (Exception e) { log.AddError(e.ToString()); } } output.Close(); } } } if (depMaker != null) { try { depMaker.GenerateMakeDependencies(log); } catch (Exception e) { log.AddError(e.ToString()); } } } if (inputIsFile) { input.Close(); } }