'{ structure := error = ->[self error: ['"structure syntax error near: " , [self contents]]] eol = '\r''\n'* | '\n''\r'* space = [ \t] comment = [-+] (!eol .)* eol ws = (space | comment | eol)* _ = space* letter = [a-zA-Z] digit = [0-9] identifier = id:$(letter (letter | digit)*) _ -> [id asSymbol] number = num:$digit+ _ -> [Integer fromString: num base: '10] columns = '|' -> (structure-begin self) ( _ num:number -> [bitmap at: column put: (set bitpos num)] (num:number)* '|' -> (let () (set bitpos num) (set column [[self readPosition] - anchor])) )+ eol ws -> [bitmap at: column put: (set width [bitpos + '1])] row = ( n:number -> (set row n) ) ? '|' -> (let () (set anchor [self readPosition]) (set column '0)) _ ( id:identifier '|' -> (structure-field self id) _ )+ eol ws -> (set row [row + width]) name = id:identifier (!eol .)* eol -> (structure-end id) diagram = ws columns row+ name | error }