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(); } } }
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)); }
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)); }
private CTFStructOrVariantDeclaration(List <CTFTypeSpecifier> list, CTFDeclarator cd) { this.List = list; this.Cd = cd; }
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); } }