user: What would the C source look like for the assembly code provided here?

```asm
<gen_parser>:
  endbr64
  push   %r15
  mov    %r8,%r15
  push   %r14
  mov    %rdx,%r14
  push   %r13
  mov    %rcx,%r13
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  mov    %rsi,%rbp
  call   <gen_known@plt>
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <gen_non_term@plt>
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <gen_goto@plt>
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <gen_states@plt>
  mov    %r15,%rcx
  mov    %r14,%rdx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <gen_reduce@plt>
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <gen_free@plt>
  mov    %r12,%rcx
  mov    $0x15,%edx
  mov    $0x1,%esi
  lea    D49(%rip),%rdi
  call   <fwrite@plt>
  mov    %r13,%rdx
  mov    %r12,%rdi
  xor    %eax,%eax
  lea    D83(%rip),%rsi
  call   <fprintf@plt>
  mov    %r12,%rcx
  mov    $0x2,%edx
  mov    $0x1,%esi
  lea    D74(%rip),%rdi
  call   <fwrite@plt>
  mov    %r12,%rcx
  mov    $0x1d,%edx
  mov    $0x1,%esi
  lea    D43(%rip),%rdi
  call   <fwrite@plt>
  mov    %r12,%rcx
  mov    $0x1e,%edx
  mov    $0x1,%esi
  lea    D46(%rip),%rdi
  call   <fwrite@plt>
  mov    %r12,%rcx
  mov    $0x37,%edx
  mov    $0x1,%esi
  lea    D88(%rip),%rdi
  call   <fwrite@plt>
  mov    %r12,%rcx
  mov    $0x46,%edx
  mov    $0x1,%esi
  lea    D65(%rip),%rdi
  call   <fwrite@plt>
  mov    %r12,%rcx
  mov    $0x24,%edx
  mov    $0x1,%esi
  lea    D15(%rip),%rdi
  call   <fwrite@plt>
  mov    %r12,%rcx
  mov    $0x55,%edx
  mov    $0x1,%esi
  lea    D107(%rip),%rdi
  call   <fwrite@plt>
  mov    %r12,%rcx
  mov    $0x16,%edx
  mov    $0x1,%esi
  lea    D10(%rip),%rdi
  call   <fwrite@plt>
  mov    %r12,%rcx
  mov    $0xc,%edx
  mov    $0x1,%esi
  lea    D103(%rip),%rdi
  call   <fwrite@plt>
  pop    %rbp
  mov    %r12,%rcx
  mov    $0x3,%edx
  pop    %r12
  mov    $0x1,%esi
  lea    D89(%rip),%rdi
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1120 <fwrite@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D49
datatype: string
name: extract_symbolic_data
arguments: data_label: D83
datatype: string
name: extract_symbolic_data
arguments: data_label: D74
datatype: string
name: extract_symbolic_data
arguments: data_label: D43
datatype: string
name: extract_symbolic_data
arguments: data_label: D46
datatype: string
name: extract_symbolic_data
arguments: data_label: D88
datatype: string
name: extract_symbolic_data
arguments: data_label: D65
datatype: string
name: extract_symbolic_data
arguments: data_label: D15
datatype: string
name: extract_symbolic_data
arguments: data_label: D107
datatype: string
name: extract_symbolic_data
arguments: data_label: D10
datatype: string
name: extract_symbolic_data
arguments: data_label: D103
datatype: string
name: extract_symbolic_data
arguments: data_label: D89
datatype: string

tool: D49: #line 0 "gen_parser"


tool: D83: void *parse_%s(struct code_node *code, struct token_config *config, FILE *trace)


tool: D74: {


tool: D43: 	struct token_state *tokens;


tool: D46: 	config->words_marks = known;


tool: D88: 	config->known_count = sizeof(known)/sizeof(known[0]);


tool: D65: 	config->ignored |= (1 << TK_line_comment) | (1 << TK_block_comment);


tool: D15: 	tokens = token_open(code, config);


tool: D107: 	void *rv = parser_run(tokens, states, do_reduce, do_free, trace, non_term, config);


tool: D10: 	token_close(tokens);


tool: D103: 	return rv;


tool: D89: }



assistant: ```c
void gen_parser(FILE *f, struct grammar *g, char *file, char *name, struct code_node *pre_reduce) {
  gen_known(f, g);
  gen_non_term(f, g);
  gen_goto(f, g);
  gen_states(f, g);
  gen_reduce(f, g, file, pre_reduce);
  gen_free(f, g);
  fprintf(f, "#line 0 \"gen_parser\"\n");
  fprintf(f, "void *parse_%s(struct code_node *code, struct token_config *config, FILE *trace)\n", name);
  fprintf(f, "{\n");
  fprintf(f, "\tstruct token_state *tokens;\n");
  fprintf(f, "\tconfig->words_marks = known;\n");
  fprintf(f, "\tconfig->known_count = sizeof(known)/sizeof(known[0]);\n");
  fprintf(f, "\tconfig->ignored |= (1 << TK_line_comment) | (1 << TK_block_comment);\n");
  fprintf(f, "\ttokens = token_open(code, config);\n");
  fprintf(f, "\tvoid *rv = parser_run(tokens, states, do_reduce, do_free, trace, non_term, config);\n");
  fprintf(f, "\ttoken_close(tokens);\n");
  fprintf(f, "\treturn rv;\n");
  fprintf(f, "}\n\n");
}
```