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; }
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; }
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; }
public TypeName(DeclnSpecs specs, Declr declr) { this.specs = specs; this.declr = declr; }
public ParamDecln(DeclnSpecs specs, Option<Declr> declr) { this.specs = specs; this.declr = declr; }
public StructDeclaration(DeclnSpecs _specs, List<Declr> _declrs) { specs = _specs; declrs = _declrs; }
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; }