public override Program Visit(Program program) { // Find constants which are repeated at least once var finder = new FirstPass(); finder.Visit(program); // Extract constats which are worth hoisting foreach (var(val, count) in finder.Constants) { if (count <= 1) { continue; } var constLength = val.ToString().Length; if (count * constLength <= (3 + constLength + count)) { continue; } _replacements.Add(val, $"_{Guid.NewGuid().ToString().Replace("-", "_")}"); } // Early exit if there are no replacements to do if (_replacements.Count == 0) { return(program); } // Build set of assignments to insert _constantInitializers = _replacements.Select(a => new Assignment(new VariableName(a.Value), a.Key.Type == Execution.Type.Number ? (BaseExpression) new ConstantNumber(a.Key.Number) : new ConstantString(a.Key.String))).ToArray <BaseStatement>(); return(base.Visit(program)); }
private static void CompileAndBuildExecutable() { var scan = new Scanner(); scan.SetSource(File.ReadAllText(FILE_LOCATION), 0); var parser = new Parser(scan); parser.Parse(); var root = parser.SyntaxTreeRoot; var mgr = new ScopeManager(); var first = new FirstPass(root, mgr); var second = new SecondPass(root, mgr); first.Run(); second.Run(); const string asmName = "sample1-test"; var cg = new CodeGenerator(asmName); cg.Generate(root); cg.WriteAssembly(); }
public override Program Visit(Program program) { // Find all variables with a count of how frequent they are var p = new FirstPass(); p.Visit(program); // Generate some unique names, order by size var names = Enumerable.Range(0, p.Names.Count()).Select(a => _names.Name()).OrderBy(a => a.Length).ToArray(); var vars = p.Names.OrderByDescending(a => a.Value).ThenBy(a => a.Key.Name).Select(a => a.Key).ToArray(); // Assign most common variables to shortest names foreach (var(n1, n2) in vars.Zip(names, (a, b) => (a, b))) { _remap.Add(n1.Name, n2); } return(base.Visit(program)); }
public static void Main(string[] argv) { LabelDict labels; if (argv.Length != 2) { Console.WriteLine("Usage: Assembler.exe assembly_file output_file"); } //Make a first pass with given file var fp = new FirstPass(argv[0]); //clean the input on the forst pass and get labels var commands = fp.GetCleanInput(out labels); //parse all instructions var pi = new ParseInstruction(commands, labels); //open file and write output using (var br = new BinaryWriter(File.Open(argv[1], FileMode.Create))) { var feedbeef = new byte[] { 0xfe, 0xed, 0xbe, 0xef }; //print magic header br.Write(feedbeef); //print the bytecode foreach (BitArray b in pi.InstrList) { byte[] temp = new byte[4]; b.CopyTo(temp, 0); br.Write(temp); } } }
public void RegexCall() { _ = FirstPass.IsMatch(QueryText) && !SecondPass.IsMatch(QueryText); }