コード例 #1
0
ファイル: AsmHelper.cs プロジェクト: taucode/copperlisp
        public static void CheckArgIsRegisterOrAtom(Token token)
        {
            if (token == null)
            {
                throw new ArgumentNullException("token");
            }

            bool ok = false;

            do
            {
                if (TokenIsRegister(token))
                {
                    ok = true;
                    break;
                }

                if (TokenIsAtom(token))
                {
                    ok = true;
                    break;
                }

                // got here => got problem (ok is false)

            } while (false);

            if (!ok)
            {
                throw new ApplicationException(); // todo2[ak]
            }
        }
コード例 #2
0
        public override Instruction Build(Token[] args)
        {
            AsmHelper.CheckArgsCount(args, 1);

            Instruction instr = (JmpInstructionBase)Activator.CreateInstance(this.JmpInstructionType);
            return instr;
        }
コード例 #3
0
ファイル: ret.cs プロジェクト: taucode/copperlisp
        public override Instruction Build(Token[] args)
        {
            // todo1[ak] check args
            AsmHelper.CheckArgsCount(args, 0);

            Instruction instr = new RetInstruction();
            return instr;
        }
コード例 #4
0
ファイル: AsmHelper.cs プロジェクト: taucode/copperlisp
        public static void CheckArgsCount(Token[] tokens, int expectedCount)
        {
            // todo1[ak] check args

            if (tokens.Length != expectedCount)
            {
                throw new ApplicationException(); // todo1[ak]
            }
        }
コード例 #5
0
ファイル: test.cs プロジェクト: taucode/copperlisp
        public override Instruction Build(Token[] args)
        {
            // todo1[ak] check args
            AsmHelper.CheckArgsCount(args, 1);

            RegisterName regName = AsmHelper.TokenToRegisterName(args[0]);
            TestInstruction instr = new TestInstruction(regName);

            return instr;
        }
コード例 #6
0
ファイル: AsmHelper.cs プロジェクト: taucode/copperlisp
        public static void CheckArgIsRegister(Token token)
        {
            // todo1[ak] check args

            bool isReg = _registersIds.ContainsKey(TokenToSymbolName(token));

            if (!isReg)
            {
                throw new ApplicationException(); // todo2[ak]
            }
        }
コード例 #7
0
ファイル: RoutineBuilder.cs プロジェクト: taucode/copperlisp
        public void AddInstruction(InstructionBuilder instructionBuilder, Token[] argTokens)
        {
            // todo1[ak] check args

            if (this.IsFinished)
            {
                throw new ApplicationException(); // todo2[ak]
            }

            InstructionData data = new InstructionData(instructionBuilder, argTokens);
            _instructionDatas.Add(data);
        }
コード例 #8
0
ファイル: nth.cs プロジェクト: taucode/copperlisp
        public override Instruction Build(Token[] args)
        {
            // todo1[ak] check args
            AsmHelper.CheckArgsCount(args, 2);

            int index = AsmHelper.TokenToInt(args[0]);
            RegisterName regName = AsmHelper.TokenToRegisterName(args[1]);

            NthInstruction instr = new NthInstruction(index, regName);

            return instr;
        }
コード例 #9
0
ファイル: pop.cs プロジェクト: taucode/copperlisp
        public override Instruction Build(Token[] args)
        {
            // todo1[ak] check args

            if (args.Length != 1)
            {
                throw new ApplicationException();
            }

            RegisterName regName = AsmHelper.TokenToRegisterName(args[0]);

            Instruction instr = new PopInstruction(regName);
            return instr;
        }
コード例 #10
0
ファイル: mov.cs プロジェクト: taucode/copperlisp
        public override Instruction Build(Token[] args)
        {
            // todo1[ak] check args

            AsmHelper.CheckArgsCount(args, 2);
            AsmHelper.CheckArgIsRegister(args[0]);
            AsmHelper.CheckArgIsRegisterOrAtom(args[1]);

            RegisterName to = AsmHelper.TokenToRegisterName(args[0]);
            object from = AsmHelper.TokenToRegisterNameOrAtom(args[1]);

            MovInstruction instr = new MovInstruction(to, from);
            return instr;
        }
コード例 #11
0
ファイル: car.cs プロジェクト: taucode/copperlisp
        public override Instruction Build(Token[] args)
        {
            // todo1[ak] check args

            if (args.Length != 1)
            {
                throw new ApplicationException();
            }

            Token tok = args[0];
            if (!(tok is SymbolToken))
            {
                throw new ApplicationException();
            }

            SymbolToken sym = (SymbolToken)tok;
            RegisterName registerName = AsmHelper.GetRegisterName(sym.Name);

            Instruction instr = new CarInstruction(registerName);
            return instr;
        }
コード例 #12
0
        public override Instruction Build(Token[] args)
        {
            // todo1[ak] check args
            AsmHelper.CheckArgsCount(args, 1, 2);

            int from = AsmHelper.TokenToInt(args[0]);
            int to;

            if (args.Length == 2)
            {
                to = AsmHelper.TokenToInt(args[1]);
            }
            else
            {
                to = from;
            }

            // todo1[ak] check from..to

            Instruction instr = new CheckArgsCountInstruction(from, to);
            return instr;
        }
コード例 #13
0
ファイル: Parser.cs プロジェクト: taucode/copperlisp
        private Atom TokenToSimpleAtom(Token token)
        {
            Atom atom;

            if (token is SymbolToken)
            {
                atom = new Symbol(((SymbolToken)token).Name);
            }
            else if (token is NumberToken)
            {
                atom = new Number(((NumberToken)token).Value);
            }
            else
            {
                throw new NotImplementedException();
            }

            return atom;
        }
コード例 #14
0
ファイル: Helper.cs プロジェクト: taucode/copperlisp
        public static LispObject TokenToAtom(Token tok)
        {
            // todo1[ak] check args

            LispObject el;

            if (tok is SymbolToken)
            {
                el = new Symbol(((SymbolToken)tok).Name);
            }
            else if (tok is NumberToken)
            {
                el = new Number(((NumberToken)tok).Value);
            }
            else
            {
                throw new NotImplementedException();
            }

            return el;
        }
コード例 #15
0
ファイル: AsmHelper.cs プロジェクト: taucode/copperlisp
        public static bool TokenIsAtom(Token token)
        {
            bool res =
                token is SymbolToken ||
                token is NumberToken;

            return res;
        }
コード例 #16
0
ファイル: AsmHelper.cs プロジェクト: taucode/copperlisp
        public static bool TokenIsRegister(Token token)
        {
            bool res =
                token is SymbolToken &&
                _registersIds.ContainsKey(TokenToSymbolName(token));

            return res;
        }
コード例 #17
0
ファイル: Helper.cs プロジェクト: taucode/copperlisp
        public static bool IsAtomToken(Token tok)
        {
            // todo1[ak] check args

            bool res;

            if (
                tok is SymbolToken ||
                tok is NumberToken)
            {
                res = true;
            }
            else
            {
                res = false;
            }

            return res;
        }
コード例 #18
0
 public abstract Instruction Build(Token[] args);
コード例 #19
0
ファイル: AsmHelper.cs プロジェクト: taucode/copperlisp
        public static int TokenToInt(Token token)
        {
            // todo1[ak]

            if (!(token is NumberToken))
            {
                throw new ApplicationException(); // todo2[ak]
            }

            NumberToken numTok = (NumberToken)token;

            int val = int.Parse(numTok.Value);
            return val;
        }
コード例 #20
0
ファイル: AsmHelper.cs プロジェクト: taucode/copperlisp
        public static RegisterName TokenToRegisterName(Token token)
        {
            // todo1[ak] check args

            RegisterName res = _registersIds[TokenToSymbolName(token)];
            return res;
        }
コード例 #21
0
ファイル: AsmHelper.cs プロジェクト: taucode/copperlisp
        public static object TokenToRegisterNameOrAtom(Token token)
        {
            // todo1[ak] check args

            object res;

            if (TokenIsRegister(token))
            {
                res = TokenToRegisterName(token);
            }
            else if (token is SymbolToken)
            {
                SymbolToken symTok = (SymbolToken)token;
                string name = symTok.Name;

                if (name == "NIL")
                {
                    res = Symbol.Nil;
                }
                else if (name == "T")
                {
                    res = Symbol.True;
                }
                else
                {
                    throw new ApplicationException(); // todo2[ak]
                }
            }
            else
            {
                throw new NotImplementedException();
            }

            return res;
        }
コード例 #22
0
ファイル: RoutineBuilder.cs プロジェクト: taucode/copperlisp
 internal InstructionData(InstructionBuilder builder, Token[] argTokens)
 {
     this.Builder = builder;
     this.ArgTokens = argTokens;
 }
コード例 #23
0
ファイル: AsmHelper.cs プロジェクト: taucode/copperlisp
        public static string TokenToSymbolName(Token token)
        {
            if (token == null)
            {
                throw new ArgumentNullException("token");
            }

            if (!(token is SymbolToken))
            {
                throw new ApplicationException(); // todo1[ak]
            }

            string name = ((SymbolToken)token).Name;
            return name;
        }
コード例 #24
0
ファイル: AsmHelper.cs プロジェクト: taucode/copperlisp
        public static void CheckArgsCount(Token[] tokens, int from, int to)
        {
            // todo1[ak] check args

            if (!tokens.Length.Between(from, to))
            {
                throw new ApplicationException(); // todo1[ak]
            }
        }