private static CTFAssignmentExpression Parse(CTFScope scope, TokParser tp) { CTFUnaryExpression cue = CTFUnaryExpression.Parse(tp); if (cue != null) { if (tp.Match(Token.EnumId.ASSIGNMENT)) { CTFUnaryExpression cue2 = CTFUnaryExpression.Parse(tp); if (cue2 == null) { throw new CTFException(); } return(new CTFAssignmentExpression(cue, cue2)); } if (tp.Match(Token.EnumId.TYPE_ASSIGNMENT)) { CTFTypeSpecifier cs = CTFITypeSpecifier.ParseTypeSpecifier(scope, tp); if (cs == null) { throw new CTFException(); } return(new CTFAssignmentExpression(cue, cs)); } } return(null); }
internal static CTFTypeSpecifier ParseTypeSpecifier(CTFScope scope, TokParser tp) { Token.EnumId id = tp.Token.Id; switch (id) { case Token.EnumId.VOID: case Token.EnumId.CHAR: case Token.EnumId.SHORT: case Token.EnumId.INT: case Token.EnumId.FLOAT: case Token.EnumId.DOUBLE: case Token.EnumId.SIGNED: case Token.EnumId.BOOL: case Token.EnumId.COMPLEX: case Token.EnumId.IMAGINARY: throw new CTFException(); // unsupported case Token.EnumId.LONG: case Token.EnumId.UNSIGNED: tp.Next(); return(Get(id)); case Token.EnumId.STRUCT: return(CTFStructSpecifier.Parse(scope, tp)); case Token.EnumId.VARIANT: return(CTFVaraintSpecifier.Parse(scope, tp)); case Token.EnumId.ENUM: return(CTFEnumSpecifier.Parse(scope, tp)); // ctf-type-specifier case Token.EnumId.FLOATING_POINT: case Token.EnumId.INTEGER: tp.Next(); tp.MustBe(Token.EnumId.LCURL); List <CTFAssignmentExpression> cael = CTFAssignmentExpression.ParseList(scope, tp); tp.MustBe(Token.EnumId.RCURL); return(new CTFATypeSpecifier(id, cael)); case Token.EnumId.STRING: tp.Next(); return(Get(Token.EnumId.STRING)); case Token.EnumId.IDEN: // must be a type in a scope CTFTypeSpecifier ct = CTFNTypeSpecifier.Get(scope, tp.Token.Buffer); if (ct == null) { return(null); } tp.Next(); return(ct); } return(null); }
internal static List <CTFTypeSpecifier> ParseList(CTFScope scope, TokParser tp) { List <CTFTypeSpecifier> specifiers = new List <CTFTypeSpecifier>(); for (;;) { CTFTypeSpecifier cts = ParseTypeSpecifier(scope, tp); if (cts == null) { break; } specifiers.Add(cts); } if (specifiers.Count == 0) { return(null); } return(specifiers); }
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 CTFAssignmentExpression(CTFUnaryExpression cue, CTFTypeSpecifier cts) { Dst = cue; this.Cts = cts; }