示例#1
0
        private CTFFile Parse(TokParser tp)
        {
            for (;;)
            {
                switch (tp.Token.Id)
                {
                case Token.EnumId.CLOCK:
                    Clock = new CTFTClock(ParseAEList(tp));
                    break;

                case Token.EnumId.EVENT:
                    CTFTEvent ce = new CTFTEvent(scope, ParseAEList(tp));
                    Events.Add(ce.Id, ce);
                    break;

                case Token.EnumId.STREAM:
                    stream = new CTFTStream(scope, ParseAEList(tp));
                    break;

                case Token.EnumId.ENV:
                    env = new CTFTEnv(ParseAEList(tp));
                    break;

                case Token.EnumId.TRACE:
                    trace = new CTFTTrace(scope, ParseAEList(tp));
                    break;

                case Token.EnumId.TYPEALIAS:
                    tp.Next();
                    List <CTFTypeSpecifier> cds = CTFITypeSpecifier.ParseList(scope, tp);
                    if (cds == null)
                    {
                        throw new CTFException();
                    }

                    tp.MustBe(Token.EnumId.TYPE_ASSIGNMENT);
                    List <CTFTypeSpecifier> cds2 = CTFITypeSpecifier.ParseList(scope, tp);
                    CTFDeclarator           cd   = CTFDeclarator.Parse(tp);
                    CTFType.AddType(scope, cds, cds2, cd);
                    break;

                case Token.EnumId.STRUCT:
                    CTFITypeSpecifier.ParseTypeSpecifier(scope, tp);
                    break;

                case Token.EnumId.EOF:
                    return(this);

                case Token.EnumId.TERM:
                    tp.Next();     // Skip it
                    break;

                default:
                    throw new CTFException();
                }
            }
        }
示例#2
0
        public static CTFStructType GetStructType(CTFScope scope, List <CTFStructOrVariantDeclaration> list, int align)
        {
            if (list == null)
            {
                return(new CTFStructType());
            }

            int             count  = list.Count; // Is it OK ?
            List <CTFSElem> lelems = new List <CTFSElem>();
            Dictionary <string, CTFStructType> subtypes = new Dictionary <string, CTFStructType>();
            bool hasVariants = false;

            foreach (CTFStructOrVariantDeclaration csvd in list)
            {
                CTFType       ctfType = GetType(scope, csvd.List);
                CTFDeclarator cd      = csvd.Cd; // can be name or array, arry can have dynamic size
                if (cd.Cue != null)
                {
                    // It is array
                    if (cd.Cue.IsNumber())
                    {
                        lelems.Add(new CTFSSElem(cd.Name, ctfType, cd.Cue.Calculate()));
                    }
                    else // dynamic array with local variable size
                    {
                        int j;
                        if (!FindName(cd.Cue.GetName(), lelems, out j))
                        {
                            throw new CTFException();
                        }

                        lelems.Add(new CTFDSElem(cd.Name, ctfType, j));
                    }
                }
                else
                {
                    if (ctfType is CTFVariantType)
                    {
                        CTFVariantType variantType = (CTFVariantType)ctfType;
                        hasVariants = true;
                        variantType.Process(subtypes, lelems, align);
                    }
                    else
                    {
                        lelems.Add(new CTFSElem(cd.Name, ctfType));
                    }
                }
            }

            return(hasVariants ? new CTFVariantStructType(subtypes, lelems, align) : new CTFStructType(lelems, align));
        }
示例#3
0
        private static CTFStructOrVariantDeclaration Parse(CTFScope scope, TokParser tp)
        {
            List <CTFTypeSpecifier> list = new List <CTFTypeSpecifier>();

            for (;;)
            {
                CTFTypeSpecifier s = CTFITypeSpecifier.ParseTypeSpecifier(scope, tp);
                if (s == null)
                {
                    break;
                }

                list.Add(s);
            }

            if (list.Count == 0)
            {
                return(null);
            }

            CTFDeclarator cd = CTFDeclarator.Parse(tp);

            return(new CTFStructOrVariantDeclaration(list, cd));
        }
示例#4
0
 private CTFStructOrVariantDeclaration(List <CTFTypeSpecifier> list, CTFDeclarator cd)
 {
     this.List = list;
     this.Cd   = cd;
 }
示例#5
0
        internal static void AddType(CTFScope scope, List <CTFTypeSpecifier> cds, List <CTFTypeSpecifier> cds2, CTFDeclarator cd)
        {
            // used by typealias
            CTFType ct = GetType(scope, cds);

            if (cds2 != null)
            {
                // Special case (unsigned long and so on)
                string    name = FullName(cds2);
                CTFSymbol cs   = new CTFSymbol(name, ct);
                scope.AddType(cs);
            }

            if (cd != null)
            {
                CTFSymbol cs = new CTFSymbol(cd.Name, ct);
                scope.AddType(cs);
            }
        }