Пример #1
0
 public Set(AsmRegisters reg, uint value)
 {
     this.reg   = reg;
     this.value = value;
 }
Пример #2
0
 public DecReg(AsmRegisters reg)
 {
     this.reg = reg;
 }
Пример #3
0
 public CmpRI(AsmRegisters reg, byte value)
 {
     this.reg   = reg;
     this.value = value;
 }
Пример #4
0
 public WriteVB(AsmRegisters reg, byte value)
 {
     this.reg   = reg;
     this.value = value;
 }
Пример #5
0
 public WriteR(AsmRegisters reg1, AsmRegisters reg)
 {
     this.reg1 = reg1;
     this.reg  = reg;
 }
Пример #6
0
 public WriteReg(uint address, AsmRegisters reg)
 {
     this.address = address;
     this.reg     = reg;
 }
Пример #7
0
        public Block parseBlock()
        {
            List <Node> nodes = new List <Node>();

            while (Peek().Type != TokenType.ClosedCurly)
            {
                if (Peek().Type == TokenType.NOP)
                {
                    Read();
                    nodes.Add(new Nop());
                }
                else if (Peek().Type == TokenType.WRITE && Peek(1).Type == TokenType.IntLiteral && canBeNumber(Peek(3).Type))
                {
                    Read();
                    uint address = getValue(Read());
                    Read();
                    byte value = (byte)getValue(Read());
                    nodes.Add(new WriteB(address, value));
                }
                else if (Peek().Type == TokenType.SET && Peek(1).Type == TokenType.Register && canBeNumber(Peek(3).Type))
                {
                    Read();
                    AsmRegisters reg = (AsmRegisters)Enum.Parse(typeof(AsmRegisters), Read().Value);
                    Read();
                    uint value = getValue(Read());
                    nodes.Add(new Set(reg, value));
                }
                else if (Peek().Type == TokenType.WRITE && isRef(Peek(1)) && isRef(Peek(4)))
                {
                    Read();
                    Read();
                    AsmRegisters reg = (AsmRegisters)Enum.Parse(typeof(AsmRegisters), Read().Value);
                    Read();
                    Read();
                    AsmRegisters reg1 = (AsmRegisters)Enum.Parse(typeof(AsmRegisters), Read().Value);
                    nodes.Add(new WriteR(reg, reg1));
                }
                else if (Peek().Type == TokenType.WRITE && isRef(Peek(1)) && canBeNumber(Peek(4).Type))
                {
                    Read();
                    Read();
                    AsmRegisters reg = (AsmRegisters)Enum.Parse(typeof(AsmRegisters), Read().Value);
                    Read();
                    byte value = (byte)getValue(Read());
                    nodes.Add(new WriteVB(reg, value));
                }
                else if (Peek().Type == TokenType.WRITE && Peek(1).Type == TokenType.IntLiteral && isRef(Peek(3)))
                {
                    Read();
                    uint address = getValue(Read());
                    Read();
                    Read();
                    AsmRegisters reg = (AsmRegisters)Enum.Parse(typeof(AsmRegisters), Read().Value);
                    nodes.Add(new WriteReg(address, reg));
                }
                else if (Peek().Type == TokenType.INC && Peek(1).Type == TokenType.Register)
                {
                    Read();
                    AsmRegisters reg = (AsmRegisters)Enum.Parse(typeof(AsmRegisters), Read().Value);
                    nodes.Add(new IncReg(reg));
                }
                else if (Peek().Type == TokenType.DEC && Peek(1).Type == TokenType.Register)
                {
                    Read();
                    AsmRegisters reg = (AsmRegisters)Enum.Parse(typeof(AsmRegisters), Read().Value);
                    nodes.Add(new DecReg(reg));
                }
                else if (Peek().Type == TokenType.JMP && Peek(1).Type == TokenType.Label)
                {
                    Read();
                    string label = Read().Value;
                    nodes.Add(new Jmp(label));
                }
                else if (Peek().Type == TokenType.CMP && isRef(Peek(1)) && canBeNumber(Peek(4).Type))
                {
                    Read();
                    Read();
                    AsmRegisters reg = (AsmRegisters)Enum.Parse(typeof(AsmRegisters), Read().Value);
                    Read();
                    byte value = (byte)getValue(Read());
                    nodes.Add(new CmpRI(reg, value));
                }
                else if (Peek().Type == TokenType.JE && Peek(1).Type == TokenType.Label)
                {
                    Read();
                    string label = Read().Value;
                    nodes.Add(new JE(label));
                }
                else if (Peek().Type == TokenType.JG && Peek(1).Type == TokenType.Label)
                {
                    Read();
                    string label = Read().Value;
                    nodes.Add(new JG(label));
                }
                else if (Peek().Type == TokenType.HLT)
                {
                    Read();
                    nodes.Add(new Hlt());
                }
            }

            return(new Block(nodes));
        }