public CmsCodeGenerator(TopDownParser parser, string input)
 {
     _parser                 = parser;
     _input                  = input;
     Codes                   = new List <CmsCode>();
     Tokenization            = new TopDownTokenization(_parser.NonTerminals, input);
     VariableArea            = new Dictionary <string, CmsCode>();
     StopReference           = new CmsCode(0X0000);
     TokenStack              = new Stack <Token>();
     AttributionTokenStack   = new Stack <Token>();
     JFCodeReferenceStack    = new Stack <CmsCodeReference>();
     StartWhileCodeReference = new Stack <CmsCodeReference>();
     RepeatReferenceStack    = new Stack <CmsCode>();
 }
        public void Handler(CmsCodeGenerator generator)
        {
            var startWhileReference = new CmsCode(generator.CodesLengh);

            var expressionStatmentHandler = new ExpressionStatmentHandler();

            expressionStatmentHandler.Handler(generator);

            var cmsCodeReference = (CmsCodeReference)CmsCodeFactory.JF(new CmsCode(0X00));

            generator.JFCodeReferenceStack.Push(cmsCodeReference);
            generator.AddCode(cmsCodeReference);

            var commeBackWhile = (CmsCodeReference)CmsCodeFactory.JMP(startWhileReference);

            generator.StartWhileCodeReference.Push(commeBackWhile);

            generator.GeneratorState = TinyCodeGeneratorState.Initial;
        }
        private void GenerateVariableArea()
        {
            Token = Tokenization.GetTokenIgnoreSpace();
            var jmpReference = new CmsCode(0X00);
            var jmp          = CmsCodeFactory.JMP(jmpReference);

            AddCode(jmp);

            while (Token != null && !Token.IsBegin())
            {
                if (Token.IsVar())
                {
                    Token = Tokenization.GetTokenIgnoreSpace();
                    VariableArea.Add(Token.Value, new CmsCode(CodesLengh));
                    Malock();
                }

                Token = Tokenization.GetTokenIgnoreSpace();
            }

            jmpReference.ValueDecimal = CodesLengh;
        }
 public void AddCode(CmsCode code)
 {
     Codes.Add(code);
     IncrementStopReference();
 }
Exemple #5
0
 public LDICode(CmsCode reference) : base(Instruction.LDI, 0X44, reference, "X2")
 {
 }
Exemple #6
0
 public ADICode(CmsCode reference) : base(Instruction.ADI, 0X14, reference, "X2")
 {
 }
Exemple #7
0
 public LODCode(CmsCode reference) : base(Instruction.LOD, 0X40, reference)
 {
 }
Exemple #8
0
 public JMPCode(CmsCode reference) : base(Instruction.JMP, 0X5A, reference)
 {
 }
Exemple #9
0
 public static CmsCode ADI(CmsCode reference) => new ADICode(reference);
Exemple #10
0
 public static CmsCode JMP(CmsCode reference) => new JMPCode(reference);
Exemple #11
0
 public static CmsCode LSP(CmsCode reference) => new LSPCode(reference);
Exemple #12
0
 public static CmsCode JF(CmsCode reference) => new JFCode(reference);
Exemple #13
0
 public static CmsCode STO(CmsCode reference) => new STOCode(reference);
Exemple #14
0
 public static CmsCode LOD(CmsCode reference) => new LODCode(reference);
        public void Handler(CmsCodeGenerator generator)
        {
            try
            {
                CmsCode compReference = null;
                ExpressionStatmentState = CmsCodeExpressionStatmentState.Initial;
                generator.MoveNextToken();

                while (!(generator.Token is ThenToken || generator.Token is DoToken || generator.Token is SemiColonToken || generator.Token is EndToken))
                {
                    switch (ExpressionStatmentState)
                    {
                    case CmsCodeExpressionStatmentState.Initial:
                        HandleInitial(generator);
                        break;

                    case CmsCodeExpressionStatmentState.Adress:
                        generator.AddCode(CmsCodeFactory.LOD(generator.VariableArea[generator.Token.Value]));
                        if (compReference != null)
                        {
                            generator.AddCode(compReference);
                        }
                        GoToInitialIfState(generator);
                        break;

                    case CmsCodeExpressionStatmentState.Number:
                        generator.AddCode(CmsCodeFactory.LDI(new CmsCode(int.Parse(generator.Token.Value))));
                        if (compReference != null)
                        {
                            generator.AddCode(compReference);
                        }
                        GoToInitialIfState(generator);
                        break;

                    case CmsCodeExpressionStatmentState.GreatThen:
                        compReference = CmsCodeFactory.GT;
                        GoToInitialIfState(generator);
                        break;

                    case CmsCodeExpressionStatmentState.LessThen:
                        compReference = CmsCodeFactory.LT;
                        GoToInitialIfState(generator);
                        break;

                    case CmsCodeExpressionStatmentState.EqualsThen:
                        compReference = CmsCodeFactory.EQ;
                        GoToInitialIfState(generator);
                        break;

                    case CmsCodeExpressionStatmentState.GreatEqualThen:
                        compReference = CmsCodeFactory.GE;
                        GoToInitialIfState(generator);
                        break;

                    case CmsCodeExpressionStatmentState.LessEqualThen:
                        compReference = CmsCodeFactory.LE;
                        GoToInitialIfState(generator);
                        break;

                    case CmsCodeExpressionStatmentState.NotEqualsThen:
                        compReference = CmsCodeFactory.NE;
                        GoToInitialIfState(generator);
                        break;

                    case CmsCodeExpressionStatmentState.Plus:
                        generator.MoveNextToken();
                        generator.AddCode(CmsCodeFactory.ADI(new CmsCode(int.Parse(generator.Token.Value))));
                        GoToInitialIfState(generator);
                        break;

                    case CmsCodeExpressionStatmentState.Sub:
                        compReference = CmsCodeFactory.SUI;
                        GoToInitialIfState(generator);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
            }
            catch (Exception e)
            {
                throw new Exception($"Token: {generator.Token}\nTokenStack: {generator.Stack}\nError: {e.Message}", e);
            }
        }
Exemple #16
0
 public STOCode(CmsCode reference) : base(Instruction.STO, 0X41, reference)
 {
 }
Exemple #17
0
 public LSPCode(CmsCode reference) : base(Instruction.LSP, 0X4F, reference, "X2", true)
 {
 }