file = _{ SOI ~ section* ~ EOI}
section = { code | generated }
generated = { begin_marker_line ~ newline ~ optional_code ~ end_marker_line ~ newline? }
optional_code = { code? }
code = @{ (!marker_line ~ any_char* ~ newline)+ ~ (!marker_line ~ any_char+)? | !marker_line ~ any_char+ }
marker_line = { begin_marker_line | end_marker_line }
begin_marker_line = { indentation ~ before_marker ~ "<<" ~ s* ~ "codegen" ~ s+ ~ identifier ~ s* ~ ">>" ~ after_marker }
end_marker_line = { indentation ~ before_marker ~ "<<" ~ s* ~ "/codegen" ~ (s+ ~ checksum)? ~ s* ~ ">>" ~ after_marker }
before_marker = { (!"<<" ~ any_char)* }
after_marker = { any_char* }
indentation = @{ s* }
identifier = @{ ("_" | ASCII_ALPHANUMERIC)+ }
checksum = @{ (ASCII_HEX_DIGIT{2}){1,32} }
s = _{ " " }
any_char = _{ !newline ~ ANY }
newline = _{ "\n" }
// test only
line = { code_line | begin_marker_line | end_marker_line }
code_line = { !marker_line ~ any_char* }