parseBitFieldDefs static method
Parse multi-line field definitions into BitFieldDef objects.
Accepted formats per line:
name high:low(e.g.exponent 31:21)name high(single bit, e.g.sign 31)high:low(unnamed, displayed as[high:low])bit(unnamed single bit, displayed as[bit])
Implementation
static List<BitFieldDef> parseBitFieldDefs(String input, int maxBit) {
final lines = input.split('\n');
final fields = <BitFieldDef>[];
for (final rawLine in lines) {
final line = rawLine.trim();
if (line.isEmpty) {
continue;
}
final tokens = _splitAsciiWhitespace(line);
// Try: name high:low
final namedRange = tokens.length == 2 && _isWord(tokens[0])
? _parseRangeToken(tokens[1])
: null;
if (namedRange != null) {
final name = tokens[0];
final a = namedRange.$1.clamp(0, maxBit);
final b = namedRange.$2.clamp(0, maxBit);
final high = a >= b ? a : b;
final low = a >= b ? b : a;
fields.add(BitFieldDef(name: name, high: high, low: low));
continue;
}
// Try: name bit (single bit)
final namedSingle = tokens.length == 2 &&
_isWord(tokens[0]) &&
_isUnsignedDecimal(tokens[1]);
if (namedSingle) {
final name = tokens[0];
final bit = int.parse(tokens[1]).clamp(0, maxBit);
fields.add(BitFieldDef(name: name, high: bit, low: bit));
continue;
}
// Try: high:low (unnamed)
final anonRange = tokens.length == 1 ? _parseRangeToken(tokens[0]) : null;
if (anonRange != null) {
final a = anonRange.$1.clamp(0, maxBit);
final b = anonRange.$2.clamp(0, maxBit);
final high = a >= b ? a : b;
final low = a >= b ? b : a;
fields.add(BitFieldDef(name: '[$high:$low]', high: high, low: low));
continue;
}
// Try: single number (unnamed single bit)
if (tokens.length == 1 && _isUnsignedDecimal(tokens[0])) {
final bit = int.parse(tokens[0]).clamp(0, maxBit);
fields.add(BitFieldDef(name: '[$bit]', high: bit, low: bit));
continue;
}
}
return fields;
}