public static Int32 Parse(List<Token> src, Int32 begin, out FuncDef def)
    {
        // try to match declaration_specifiers, if not found, create an empty one.
        DeclnSpecs specs;
        Int32 current = _declaration_specifiers.Parse(src, begin, out specs);
        if (current == -1) {
            specs = new DeclnSpecs(new List<StorageClassSpec>(), new List<TypeSpec>(), new List<TypeQual>());
            current = begin;
        }

        // match declarator
        Declr decl;
        current = _declarator.Parse(src, current, out decl);
        if (current == -1) {
            def = null;
            return -1;
        }

        // match compound_statement
        CompoundStmt stmt;
        current = _compound_statement.Parse(src, current, out stmt);
        if (current == -1) {
            def = null;
            return -1;
        }

        def = new FuncDef(specs, decl, stmt);
        return current;
    }
Esempio n. 2
0
    public static Int32 Parse(List<Token> src, Int32 begin, out DeclnSpecs decl_specs)
    {
        List<TypeSpec> type_specifiers = new List<TypeSpec>();
        List<TypeQual> type_qualifiers = new List<TypeQual>();

        while (true) {
            Int32 saved = begin;

            // 1. match type_specifier
            begin = saved;
            TypeSpec type_specifier;
            if ((begin = _type_specifier.Parse(src, begin, out type_specifier)) != -1) {
                type_specifiers.Add(type_specifier);
                continue;
            }

            // 2. match type_qualifier
            begin = saved;
            TypeQual type_qualifier;
            if ((begin = _type_qualifier.Parse(src, begin, out type_qualifier)) != -1) {
                type_qualifiers.Add(type_qualifier);
                continue;
            }

            // 3. if all failed, break out of the loop
            begin = saved;
            break;

        }

        if (type_specifiers.Count == 0 && type_qualifiers.Count == 0) {
            decl_specs = null;
            return -1;
        }

        decl_specs = new DeclnSpecs(null, type_specifiers, type_qualifiers);
        return begin;
    }
Esempio n. 3
0
    public static Int32 Parse(List<Token> src, Int32 begin, out DeclnSpecs decl_specs)
    {
        List<StorageClassSpec> storage_class_specifiers = new List<StorageClassSpec>();
        List<TypeSpec> type_specifiers = new List<TypeSpec>();
        List<TypeQual> type_qualifiers = new List<TypeQual>();

        Int32 current = begin;
        while (true) {
            Int32 saved = current;

            // 1. match storage_class_specifier
            StorageClassSpec storage_class_specifier;
            if ((current = _storage_class_specifier.Parse(src, saved, out storage_class_specifier)) != -1) {
                storage_class_specifiers.Add(storage_class_specifier);
                continue;
            }

            // 2. if failed, match type_specifier
            TypeSpec type_specifier;
            if ((current = _type_specifier.Parse(src, saved, out type_specifier)) != -1) {
                type_specifiers.Add(type_specifier);
                continue;
            }

            // 3. if failed, match type_qualifier
            TypeQual type_qualifier;
            if ((current = _type_qualifier.Parse(src, saved, out type_qualifier)) != -1) {
                type_qualifiers.Add(type_qualifier);
                continue;
            }

            // 4. if all failed, break out of the loop
            current = saved;
            break;

        }

        if (storage_class_specifiers.Count == 0 && type_specifiers.Count == 0 && type_qualifiers.Count == 0) {
            decl_specs = null;
            return -1;
        }

        decl_specs = new DeclnSpecs(storage_class_specifiers, type_specifiers, type_qualifiers);
        return current;
    }
Esempio n. 4
0
 public TypeName(DeclnSpecs specs, Declr declr) {
     this.specs = specs;
     this.declr = declr;
 }
Esempio n. 5
0
 public ParamDecln(DeclnSpecs specs, Option<Declr> declr) {
     this.specs = specs;
     this.declr = declr;
 }
Esempio n. 6
0
 public StructDeclaration(DeclnSpecs _specs, List<Declr> _declrs) {
     specs = _specs;
     declrs = _declrs;
 }
Esempio n. 7
0
 public Decln(DeclnSpecs decln_specs, IEnumerable<InitDeclr> init_declrs) {
     this.decln_specs = decln_specs;
     this.init_declrs = init_declrs;
 }
 public FuncDef(DeclnSpecs specs, Declr declr, CompoundStmt stmt)
 {
     this.specs = specs;
     this.declr = declr;
     this.stmt = stmt;
 }