context heredoc rl ident_char /[a-zA-Z_]/ lex # Tokens token other /(^(ident_char|0|'\n'))+/ token here_close // token id /ident_char+/ { if HereId && HereId == match_text { input->push( make_token( typeid, input->pull(match_length - 1) ) ) } else { input->push( make_token( typeid, input->pull(match_length) ) ) } } token nl /'\n'/ end def here_name [id] { HereId = $r1 } HereId: str def here_data [here_data_item*] def here_data_item [id] | [other] | [nl] def start [here_name here_data here_close id nl] end # heredoc HereDoc: heredoc = new heredoc() parse S: heredoc::start(HereDoc)[stdin] print_xml(S) print( '\n' ) ##### IN ##### hello random 9392af j9 stuff hello ##### EXP ##### hello random 9392af j9 stuff hello