예제 #1
0
        public override void process(ICode iCode, SymbolTableStack symbolTableStack)
        {
            long startTime = DateTime.Now.Ticks;
            float elapsedTime = (DateTime.Now.Ticks - startTime) / 1000f;
            int instructionCount = 0;

            sendMessage(new Message(MessageType.COMPILER_SUMMARY, new Object[] {instructionCount, elapsedTime}));
        }
        public override void process(ICode iCode, SymbolTableStack symbolTableStack)
        {
            long  startTime        = DateTime.Now.Ticks;
            float elapsedTime      = (DateTime.Now.Ticks - startTime) / 1000f;
            int   instructionCount = 0;

            sendMessage(new Message(MessageType.COMPILER_SUMMARY, new Object[] { instructionCount, elapsedTime }));
        }
예제 #3
0
        private static Option <ILiquidValue> FindParentLoop(SymbolTableStack stack)
        {
            var parentLoop = stack.Reference("forloop", skiplevels: 1);

            if (parentLoop.IsError || !parentLoop.SuccessResult.HasValue)
            {
                return(new None <ILiquidValue>());
            }
            return(parentLoop.SuccessValue <LiquidHash>());
        }
예제 #4
0
        public override void process(ICode iCode, SymbolTableStack symbolTableStack)
        {
            this.symbolTableStack = symbolTableStack;
            this.iCode = iCode;

            long startTime = DateTime.Now.Ticks;

            ICodeNode rootNode = iCode.GetRoot();
            StatementExecutor statementExecutor = new StatementExecutor(this);
            statementExecutor.Execute(rootNode);

            float elapsedTime = (DateTime.Now.Ticks - startTime) / 1000f;
            int runtimeErrors = RuntimeErrorHandler.errorCount;

            sendMessage(new Message(MessageType.INTERPRETER_SUMMARY, new Object[] { executionCount, runtimeErrors, elapsedTime }));
        }
        public override void process(ICode iCode, SymbolTableStack symbolTableStack)
        {
            this.symbolTableStack = symbolTableStack;
            this.iCode            = iCode;

            long startTime = DateTime.Now.Ticks;

            ICodeNode         rootNode          = iCode.GetRoot();
            StatementExecutor statementExecutor = new StatementExecutor(this);

            statementExecutor.Execute(rootNode);

            float elapsedTime   = (DateTime.Now.Ticks - startTime) / 1000f;
            int   runtimeErrors = RuntimeErrorHandler.errorCount;

            sendMessage(new Message(MessageType.INTERPRETER_SUMMARY, new Object[] { executionCount, runtimeErrors, elapsedTime }));
        }
예제 #6
0
        public Pascal(string operation, string filePath, string flags)
        {
            try
            {
                bool intermediate = flags.IndexOf('i') > -1;
                bool xref = flags.IndexOf('x') > -1;

                source = new Source(new StreamReader(filePath));
                source.addMessageListener(new SourceMessageListener());

                parser = FrontendFactory.createParser("Pascal", "top-down", source);
                parser.addMessageListener(new ParserMessageListener());

                backend = BackendFactory.createBackend(operation);
                backend.addMessageListener(new BackendMessageListener());

                parser.parse();
                source.close();

                iCode = parser.iCode;
                symbolTableStack = Parser.symbolTableStack;

                if (xref)
                {
                    CrossReferencer crossReferencer = new CrossReferencer();
                    crossReferencer.Print(symbolTableStack);
                }

                if (intermediate)
                {
                    ParseTreePrinter treePrinter =  new ParseTreePrinter(Console.Out);
                    treePrinter.Print(iCode);
                }
                backend.process(iCode, symbolTableStack);
            }

            catch (Exception e)
            {
                Console.WriteLine("***** Internal translator error. *****");
                Console.WriteLine(e.StackTrace);
            }
        }
예제 #7
0
        private Backend backend;  // backend

        public Pascal(string operation, string filePath, string flags)
        {
            try
            {
                bool intermediate = flags.IndexOf('i') > -1;
                bool xref         = flags.IndexOf('x') > -1;

                source = new Source(new StreamReader(filePath));
                source.addMessageListener(new SourceMessageListener());

                parser = FrontendFactory.createParser("Pascal", "top-down", source);
                parser.addMessageListener(new ParserMessageListener());

                backend = BackendFactory.createBackend(operation);
                backend.addMessageListener(new BackendMessageListener());

                parser.parse();
                source.close();

                iCode            = parser.iCode;
                symbolTableStack = Parser.symbolTableStack;

                if (xref)
                {
                    CrossReferencer crossReferencer = new CrossReferencer();
                    crossReferencer.Print(symbolTableStack);
                }

                if (intermediate)
                {
                    ParseTreePrinter treePrinter = new ParseTreePrinter(Console.Out);
                    treePrinter.Print(iCode);
                }
                backend.process(iCode, symbolTableStack);
            }

            catch (Exception e)
            {
                Console.WriteLine("***** Internal translator error. *****");
                Console.WriteLine(e.StackTrace);
            }
        }
예제 #8
0
 public static LiquidHash CreateForLoopDescriptor(String name, int iter, int length, int col, int maxcol, int row, SymbolTableStack stack)
 {
     return(new LiquidHash
     {
         { "first", new LiquidBoolean(iter == 0) },
         { "index", LiquidNumeric.Create(iter + 1) },
         { "col", LiquidNumeric.Create(col + 1) },
         { "row", LiquidNumeric.Create(row + 1) },
         { "row0", LiquidNumeric.Create(row) },
         { "col0", LiquidNumeric.Create(col) },
         { "col_first", new LiquidBoolean(col == 0) },
         { "col_last", new LiquidBoolean(col == maxcol) },
         { "index0", LiquidNumeric.Create(iter) },
         { "rindex", LiquidNumeric.Create(length - iter) },
         { "rindex0", LiquidNumeric.Create(length - iter - 1) },
         { "last", new LiquidBoolean(length - iter - 1 == 0) },
         { "length", LiquidNumeric.Create(length) },
         { "name", LiquidString.Create(name) }
     });
 }
예제 #9
0
 // Print the cross reference table
 public void Print(SymbolTableStack symbolTableStack)
 {
     Console.WriteLine("\n===== CROSS-REFERENCE TABLE =====");
     PrintColumnHeadings();
     PrintSymbolTable(symbolTableStack.GetLocalSymbolTable());
 }
예제 #10
0
        // Process the intermediate code and the symbol table generated by the
        // parser.  To be implemented by a compiler or an interpreter subclass.
        public abstract void process(ICode iCode, SymbolTableStack symTab);
예제 #11
0
 // Print the cross reference table
 public void Print(SymbolTableStack symbolTableStack)
 {
     Console.WriteLine("\n===== CROSS-REFERENCE TABLE =====");
     PrintColumnHeadings();
     PrintSymbolTable(symbolTableStack.GetLocalSymbolTable());
 }
예제 #12
0
 // Process the intermediate code and the symbol table generated by the
        // parser.  To be implemented by a compiler or an interpreter subclass.
 public abstract void process(ICode iCode, SymbolTableStack symTab);
예제 #13
0
 public static LiquidHash CreateForLoopDescriptor(String name, int iter, int length, SymbolTableStack stack)
 {
     return(new LiquidHash
     {
         { "parentloop", FindParentLoop(stack) }, // see: https://github.com/Shopify/liquid/pull/520
         { "first", new LiquidBoolean(iter == 0) },
         { "index", LiquidNumeric.Create(iter + 1) },
         { "index0", LiquidNumeric.Create(iter) },
         { "rindex", LiquidNumeric.Create(length - iter) },
         { "rindex0", LiquidNumeric.Create(length - iter - 1) },
         { "last", new LiquidBoolean(length - iter - 1 == 0) },
         { "length", LiquidNumeric.Create(length) },
         { "name", LiquidString.Create(name) }
     });
 }