1use crate::ast::{Expr, Program, Stmt, Type};
4use anyhow::Result;
5
6pub trait CodeGeneratorCapability {
8 fn generate(&mut self, program: &Program) -> Result<String>;
10
11 fn generate_statement(&mut self, stmt: &Stmt) -> Result<String>;
13
14 fn generate_expression(&mut self, expr: &Expr) -> Result<String>;
16}
17
18pub trait AssemblyOutput {
20 fn emit(&mut self, code: &str);
22
23 fn emit_label(&mut self, label: &str);
25
26 fn emit_comment(&mut self, comment: &str);
28
29 fn get_output(&self) -> &str;
31
32 fn clear(&mut self);
34
35 fn emit_line(&mut self, indent: u8, code: &str);
37}
38
39pub trait VariableManager {
41 fn allocate_variable(&mut self, name: &str, typ: &Type) -> Result<i32>;
43
44 fn get_variable_offset(&self, name: &str) -> Option<i32>;
46
47 fn enter_scope(&mut self, name: &str);
49
50 fn exit_scope(&mut self);
52
53 fn scope_depth(&self) -> usize;
55}
56
57pub trait RegisterAllocator {
59 fn allocate_register(&mut self, var_name: &str) -> Result<String>;
61
62 fn free_register(&mut self, register: &str);
64
65 fn get_available_registers(&self) -> Vec<String>;
67
68 fn spill_register(&mut self, register: &str) -> Result<String>;
70
71 fn save_register_state(&mut self);
73
74 fn restore_register_state(&mut self);
76}
77
78pub trait TargetArchitecture {
80 fn architecture_name(&self) -> &str;
82
83 fn register_size(&self) -> usize;
85
86 fn stack_alignment(&self) -> usize;
88
89 fn calling_convention(&self) -> &str;
91
92 fn caller_saved_registers(&self) -> Vec<String>;
94
95 fn callee_saved_registers(&self) -> Vec<String>;
97
98 fn parameter_registers(&self) -> Vec<String>;
100
101 fn return_register(&self) -> &str;
103}
104
105pub trait FunctionCalling {
107 fn generate_prologue(&mut self, name: &str, stack_size: i32) -> Result<()>;
109
110 fn generate_epilogue(&mut self) -> Result<()>;
112
113 fn generate_call(&mut self, name: &str, args: &[Expr]) -> Result<()>;
115
116 fn generate_return(&mut self, value: Option<&Expr>) -> Result<()>;
118}
119
120pub trait ControlFlowGenerator {
122 fn generate_if_then_else(
124 &mut self,
125 condition: &Expr,
126 then_block: &[Stmt],
127 else_block: Option<&[Stmt]>,
128 ) -> Result<()>;
129
130 fn generate_while_loop(&mut self, condition: &Expr, body: &[Stmt]) -> Result<()>;
132
133 fn generate_for_loop(
135 &mut self,
136 variable: &str,
137 start: &Expr,
138 end: &Expr,
139 step: Option<&Expr>,
140 body: &[Stmt],
141 direction: crate::ast::ForDirection,
142 ) -> Result<()>;
143
144 fn generate_repeat_loop(&mut self, body: &[Stmt], condition: &Expr) -> Result<()>;
146}
147
148pub trait DebugInfo {
150 fn generate_debug_info(&mut self, program: &Program) -> Result<String>;
152
153 fn add_debug_symbol(&mut self, name: &str, address: usize);
155
156 fn generate_line_mapping(&mut self, source: &str) -> Result<String>;
158
159 fn emit_debug_location(&mut self, line: usize, column: usize);
161}