Пример #1
0
        public void PapyrusParser_GetOpCodeFromAlias()
        {
            var desc =
                PapyrusInstructionOpCodeDescription.FromAlias("CALLMETHOD");

            Assert.IsNotNull(desc);
            Assert.AreEqual(PapyrusOpCodes.Callmethod, desc.Key);
        }
        /// <summary>
        /// Parses the string represented instruction and returns a <see cref="PapyrusAsmInstruction"/>.
        /// </summary>
        /// <param name="instruction">The instruction.</param>
        /// <returns></returns>
        public PapyrusAsmInstruction ParseInstruction(string instruction)
        {
            if (string.IsNullOrEmpty(instruction))
            {
                return(null);
            }
            var data = GetAsmValues(instruction.Trim().Trim(' ', '\t'));
            var desc = PapyrusInstructionOpCodeDescription.FromAlias(data[0].Value);
            var ins  = new PapyrusAsmInstruction(desc.Key, desc.Value.ArgumentCount, desc.Value.HasOperandArguments, desc.Value.Aliases);

            for (var i = 0; i < ins.ArgumentCount; i++)
            {
                ins.SetArgument(i, data[i + 1]);
            }

            var opargs = data.Count - ins.ArgumentCount - 1;

            for (var i = 0; i < opargs; i++)
            {
                ins.SetOperandArgument(i, data[i + ins.ArgumentCount + 1]);
            }

            return(ins);
        }