示例#1
0
        public ASMultiname(ABCFile abc, FlashReader reader)
            : this(abc)
        {
            var multinameType = (ConstantType)reader.ReadByte();
            switch (multinameType)
            {
            case ConstantType.QName:
            case ConstantType.QNameA:
            {
                var qName = new QName(abc, reader, multinameType);
                ObjNameIndex = qName.ObjNameIndex;
                Data         = qName;
                break;
            }

            case ConstantType.RTQName:
            case ConstantType.RTQNameA:
            {
                var rtqName = new RTQName(abc, reader, multinameType);
                ObjNameIndex = rtqName.ObjNameIndex;
                Data         = rtqName;
                break;
            }

            case ConstantType.RTQNameL:
            case ConstantType.RTQNameLA:
                Data = new RTQNameL(abc, multinameType);
                break;

            case ConstantType.Multiname:
            case ConstantType.MultinameA:
            {
                var multiname = new Multiname(abc, reader, multinameType);
                ObjNameIndex = multiname.ObjNameIndex;
                Data         = multiname;
                break;
            }

            case ConstantType.MultinameL:
            case ConstantType.MultinameLA:
                Data = new MultinameL(abc, reader, multinameType);
                break;

            case ConstantType.Typename:
                Data = new Typename(abc, reader);
                break;

            default:
                throw new Exception("Invalid multiname: " + multinameType);
            }
        }
示例#2
0
        private LinkedList <Token> GenerateTokens()
        {
            string[]      lines = sourceString.SplitAndKeep(new[] { '\r', '\n' }).ToArray();
            string[]      temp;
            List <string> list = new List <string>();

            foreach (string line in lines)
            {
                list.AddRange(line.Split('\t', ' '));
            }
            temp                = list.ToArray();
            temp                = temp.Where(x => !String.IsNullOrEmpty(x)).ToArray();
            tokenStrings        = new LinkedList <string>(temp);
            currentTokenString  = tokenStrings.First;
            nextTokenString     = currentTokenString.Next;
            previousTokenString = currentTokenString.Previous;
            while (currentTokenString != null)
            {
                Token token = new GenericToken(currentTokenString.Value);
                if (token.isOperator())
                {
                    Operator op = new Operator(currentTokenString.Value);
                    op.Type = op.DetectType();
                    tokens.AddLast(new LinkedListNode <Token>(op));
                }
                else if (token.isKeyword())
                {
                    Keyword keyword = new Keyword(currentTokenString.Value);
                    keyword.Type = keyword.DetectType();
                    tokens.AddLast(new LinkedListNode <Token>(keyword));
                }
                else if (token.isType())
                {
                    Typename typename = new Typename(currentTokenString.Value);
                    typename.Type = typename.DetectType();
                    tokens.AddLast(new LinkedListNode <Token>(typename));
                }
                else
                {
                    token.Type = token.DetectType();
                    if ((EnumTokenType)token.Type == EnumTokenType.STRING)
                    {
                        StringLiteral literal = new StringLiteral(currentTokenString.Value);
                        literal.Type = EnumTokenType.STRING_LITERAL;
                        while (!literal.Value.EndsWith("\""))
                        {
                            currentTokenString = nextTokenString;
                            nextTokenString    = currentTokenString.Next;
                            if (currentTokenString.Value == null)
                            {
                                ThrowError(EnumErrorCodes.STRING_NOT_TETMINATED, "\"");
                                return(null);
                            }
                            literal.Value += " " + currentTokenString.Value;
                        }
                        tokens.AddLast(new LinkedListNode <Token>(literal));
                    }
                    else if ((EnumTokenType)token.Type == EnumTokenType.NUMBER)
                    {
                        NumericLiteral literal = new NumericLiteral(currentTokenString.Value);
                        literal.Type = EnumTokenType.NUMERIC_LITERAL;
                        tokens.AddLast(new LinkedListNode <Token>(literal));
                    }
                    else
                    {
                        tokens.AddLast(new LinkedListNode <Token>(token));
                    }
                }
                currentTokenString = nextTokenString;
                if (nextTokenString != null)
                {
                    nextTokenString = currentTokenString.Next;
                }
                if (previousTokenString != null)
                {
                    previousTokenString = currentTokenString.Previous;
                }
            }
            return(tokens);
        }