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(); }
public LDICode(CmsCode reference) : base(Instruction.LDI, 0X44, reference, "X2") { }
public ADICode(CmsCode reference) : base(Instruction.ADI, 0X14, reference, "X2") { }
public LODCode(CmsCode reference) : base(Instruction.LOD, 0X40, reference) { }
public JMPCode(CmsCode reference) : base(Instruction.JMP, 0X5A, reference) { }
public static CmsCode ADI(CmsCode reference) => new ADICode(reference);
public static CmsCode JMP(CmsCode reference) => new JMPCode(reference);
public static CmsCode LSP(CmsCode reference) => new LSPCode(reference);
public static CmsCode JF(CmsCode reference) => new JFCode(reference);
public static CmsCode STO(CmsCode reference) => new STOCode(reference);
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); } }
public STOCode(CmsCode reference) : base(Instruction.STO, 0X41, reference) { }
public LSPCode(CmsCode reference) : base(Instruction.LSP, 0X4F, reference, "X2", true) { }