Пример #1
0
        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));
        }
Пример #2
0
        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();
        }
Пример #3
0
        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));
        }
Пример #4
0
    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);
            }
        }
    }
Пример #5
0
 public void RegexCall()
 {
     _ = FirstPass.IsMatch(QueryText) && !SecondPass.IsMatch(QueryText);
 }