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(); } } }
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)); }