[whitespace] 1. merge whitespaces 2. set ws to alias 3. apply whitespace to expressions - a a -> a ws* a - a | b -> a | b - a? -> a{0, 1} -> a{0, 1} - a+ -> a{1,} -> a (ws* a){,} - a* -> a{0,} -> (a (ws* a){,}){,} - root -> ws* root ws* error reporting - longest parse - count the lines - print the line - print the deepest non-alias node name - print the documentation of the node name read, with error reporting what was the bug with the large json from eskip? [next] optimization why normalization failed why normalization was slower? error reporting coverage custom tokens indentation streaming code generation go: - find things that depend on the syntax input - char matches can be generated into switches code generation js ws and nows flags [problems] can the root be an alias? check the commit mechanism