예제 #1
0
        //[ConfigConsoleAspect]
        private static void Main(string[] args)
        {
            try
            {
                const string grammarFile = "grammar(0).txt";
                const string inputFile   = "input(0).txt";

                var grammar = Read("Grammar", $"grammars/{grammarFile}");
                var input   = Read("Input", $"inputs/{inputFile}");

                var parser = new TopDownParser(grammar);
                parser.Parser(input);

                var codeGenerator = new TmCodeGenerator(parser, input);
                codeGenerator.Generator();
                codeGenerator.Export();
                codeGenerator.ExecuteVM();
            }
            catch (Exception e)
            {
                Logger.PrintLn(e);
            }

            Console.ReadLine();
        }
예제 #2
0
        public void Handler(TmCodeGenerator generator)
        {
            generator.RemoveParentheses <OpenParenthesesToken>();
            generator.Instructions.Add(InstructionFactory.Read(generator.InstructionLine, generator.VarDictionary[generator.Token]));
            generator.RemoveParentheses <CloseParenthesesToken>();

            generator.GeneratorState = TinyCodeGeneratorState.Initial;
        }
예제 #3
0
        public void Handler(TmCodeGenerator generator)
        {
            generator.Stack.Push(generator.Token);
            generator.MoveNextToken();
            generator.MoveNextToken();
            var reg  = generator.VarDictionary[generator.Token];
            var line = generator.InstructionLine;

            generator.RepeatBackpack.Push(new RepeatBackpack(line, reg));
            generator.GeneratorState = TinyCodeGeneratorState.Initial;
        }
        public void Handler(TmCodeGenerator generator)
        {
            switch (generator.Token)
            {
            case ReadToken token:
                generator.GeneratorState = TinyCodeGeneratorState.Read;
                break;

            case WriteToken token:
                generator.GeneratorState = TinyCodeGeneratorState.Write;
                break;

            case IfToken token:
                generator.GeneratorState = TinyCodeGeneratorState.If;
                //generator.TokenStack.Push(generator.Token);
                break;

            case WhileToken token:
                generator.GeneratorState = TinyCodeGeneratorState.While;
                //generator.TokenStack.Push(generator.Token);
                break;

            case AttributionToken token:
                generator.GeneratorState = TinyCodeGeneratorState.Attribution;
                break;

            case EndToken token:
                generator.GeneratorState = TinyCodeGeneratorState.End;
                break;

            case IdentifierToken token:
                generator.MoveNextToken();
                //if (generator.Token is AttributionToken)
                //{
                //    generator.AttributionTokenStack.Push(token);
                //    generator.GeneratorState = TinyCodeGeneratorState.Attribution;
                //}
                break;

            case RepeatToken token:
                generator.GeneratorState = TinyCodeGeneratorState.Repeat;
                break;

            case UntilToken token:
                generator.GeneratorState = TinyCodeGeneratorState.Until;
                break;

            default:
                generator.MoveNextToken();
                break;
            }
        }
예제 #5
0
        public void Handler(TmCodeGenerator generator)
        {
            generator.Stack.Push(generator.Token);

            generator.RemoveParentheses <OpenParenthesesToken>();
            var reg  = generator.VarDictionary[generator.Token];
            var line = generator.InstructionLine;

            generator.MoveNextToken();
            switch (generator.Token)
            {
            case GreatToken token:
                var item = InstructionFactory.JLT(line, reg);
                generator.Instructions.Add(item);
                generator.IfBackpack.Push(new IfBackpackItem(line, item));
                break;

            case GreatOrEqualToken token:
                break;

            case LessToken token:
                break;

            case LessOrEqualToken token:
                break;

            case EqualToken token:
                break;

            case NotEqualToken token:
                break;
            }



            generator.RemoveParentheses <CloseParenthesesToken>();

            generator.GeneratorState = TinyCodeGeneratorState.Initial;
        }
예제 #6
0
        public void Handler(TmCodeGenerator generator)
        {
            if (generator.Stack.Any())
            {
                var pop = generator.Stack.Pop();
                switch (pop)
                {
                case IfToken token:
                    var ins            = generator.Instructions.ToArray();
                    var ifBackpackItem = generator.IfBackpack.Pop();
                    ins[ifBackpackItem.Line] = ifBackpackItem.Command.Replace("lineJmp", generator.InstructionLine.ToString());
                    generator.Instructions   = ins.ToList();
                    break;
                    //case WhileToken token:
                    //    generator.AddCode(generator.StartWhileCodeReference.Pop());
                    //    generator.JFCodeReferenceStack.Pop().Reference.ValueDecimal = generator.CodesLengh;
                    //    break;
                }
            }

            generator.MoveNextToken();
            generator.GeneratorState = TinyCodeGeneratorState.Initial;
        }
예제 #7
0
        public void Handler(TmCodeGenerator generator)
        {
            generator.MoveNextToken();

            //throw new NotImplementedException();
        }