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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
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));
        }
 private CTFAssignmentExpression(CTFUnaryExpression cue, CTFTypeSpecifier cts)
 {
     Dst      = cue;
     this.Cts = cts;
 }