public static DWARFAbbreviation read(BinaryReader reader, DWARFProgram prog,
			TaskMonitor monitor) throws IOException, CancelledException {

		int ac = reader.readNextUnsignedVarIntExact(LEB128::unsigned);
		if (ac == EOL) {
			return null;
		}
		int tag = reader.readNextUnsignedVarIntExact(LEB128::unsigned);
		int hasChildren = reader.readNextByte();

		// Read each attribute specification until EOL marker value
		List<AttrDef> tmpAttrSpecs = new ArrayList<>();
		AttrDef attrSpec;
		while ((attrSpec = AttrDef.read(reader)) != null) {
			monitor.checkCancelled();
			attrSpec = prog.internAttributeSpec(attrSpec);
			tmpAttrSpecs.add(attrSpec);
			warnIfMismatchedForms(attrSpec);
		}
		AttrDef[] attrSpecArray = tmpAttrSpecs.toArray(new AttrDef[tmpAttrSpecs.size()]);

		DWARFAbbreviation result = new DWARFAbbreviation(ac, tag,
			hasChildren == DWARFChildren.DW_CHILDREN_yes, attrSpecArray);

		return result;
	}
Reads a {@link DWARFAbbreviation} from the stream.

@param reader {@link BinaryReader} stream
@param prog {@link DWARFProgram}
@param monitor {@link TaskMonitor}
@return {@link DWARFAbbreviation}, or null if the stream was at a end-of-list marker
@throws IOException if error reading
@throws CancelledException if canceled
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DWARFAbbreviation.java