Skip to main content

pascal/traits/
codegen.rs

1//! Code generation trait definitions
2
3use crate::ast::{Expr, Program, Stmt, Type};
4use anyhow::Result;
5
6/// Core code generation capability
7pub trait CodeGeneratorCapability {
8    /// Generate code for a complete program
9    fn generate(&mut self, program: &Program) -> Result<String>;
10
11    /// Generate code for a statement
12    fn generate_statement(&mut self, stmt: &Stmt) -> Result<String>;
13
14    /// Generate code for an expression
15    fn generate_expression(&mut self, expr: &Expr) -> Result<String>;
16}
17
18/// Assembly output generation trait
19pub trait AssemblyOutput {
20    /// Emit assembly code
21    fn emit(&mut self, code: &str);
22
23    /// Emit a label
24    fn emit_label(&mut self, label: &str);
25
26    /// Emit a comment
27    fn emit_comment(&mut self, comment: &str);
28
29    /// Get the generated output
30    fn get_output(&self) -> &str;
31
32    /// Clear the output buffer
33    fn clear(&mut self);
34
35    /// Emit formatted line
36    fn emit_line(&mut self, indent: u8, code: &str);
37}
38
39/// Variable and scope management trait
40pub trait VariableManager {
41    /// Allocate a variable on the stack
42    fn allocate_variable(&mut self, name: &str, typ: &Type) -> Result<i32>;
43
44    /// Get stack offset for a variable
45    fn get_variable_offset(&self, name: &str) -> Option<i32>;
46
47    /// Enter a new scope
48    fn enter_scope(&mut self, name: &str);
49
50    /// Exit the current scope
51    fn exit_scope(&mut self);
52
53    /// Get current scope depth
54    fn scope_depth(&self) -> usize;
55}
56
57/// Register allocation trait
58pub trait RegisterAllocator {
59    /// Allocate a register for a variable
60    fn allocate_register(&mut self, var_name: &str) -> Result<String>;
61
62    /// Free a register
63    fn free_register(&mut self, register: &str);
64
65    /// Get available registers
66    fn get_available_registers(&self) -> Vec<String>;
67
68    /// Spill a register to memory
69    fn spill_register(&mut self, register: &str) -> Result<String>;
70
71    /// Save register state
72    fn save_register_state(&mut self);
73
74    /// Restore register state
75    fn restore_register_state(&mut self);
76}
77
78/// Target architecture trait
79pub trait TargetArchitecture {
80    /// Architecture name (e.g., "x86_64")
81    fn architecture_name(&self) -> &str;
82
83    /// Register size in bytes
84    fn register_size(&self) -> usize;
85
86    /// Stack alignment requirement
87    fn stack_alignment(&self) -> usize;
88
89    /// Calling convention (e.g., "System V AMD64 ABI")
90    fn calling_convention(&self) -> &str;
91
92    /// Get caller-saved registers
93    fn caller_saved_registers(&self) -> Vec<String>;
94
95    /// Get callee-saved registers
96    fn callee_saved_registers(&self) -> Vec<String>;
97
98    /// Get parameter registers
99    fn parameter_registers(&self) -> Vec<String>;
100
101    /// Get return register
102    fn return_register(&self) -> &str;
103}
104
105/// Function calling trait
106pub trait FunctionCalling {
107    /// Generate function prologue
108    fn generate_prologue(&mut self, name: &str, stack_size: i32) -> Result<()>;
109
110    /// Generate function epilogue
111    fn generate_epilogue(&mut self) -> Result<()>;
112
113    /// Generate function call
114    fn generate_call(&mut self, name: &str, args: &[Expr]) -> Result<()>;
115
116    /// Generate return instruction
117    fn generate_return(&mut self, value: Option<&Expr>) -> Result<()>;
118}
119
120/// Control flow generation trait
121pub trait ControlFlowGenerator {
122    /// Generate if-then-else structure
123    fn generate_if_then_else(
124        &mut self,
125        condition: &Expr,
126        then_block: &[Stmt],
127        else_block: Option<&[Stmt]>,
128    ) -> Result<()>;
129
130    /// Generate while loop
131    fn generate_while_loop(&mut self, condition: &Expr, body: &[Stmt]) -> Result<()>;
132
133    /// Generate for loop
134    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    /// Generate repeat-until loop
145    fn generate_repeat_loop(&mut self, body: &[Stmt], condition: &Expr) -> Result<()>;
146}
147
148/// Debug information generation trait
149pub trait DebugInfo {
150    /// Generate debug information for program
151    fn generate_debug_info(&mut self, program: &Program) -> Result<String>;
152
153    /// Add debug symbol
154    fn add_debug_symbol(&mut self, name: &str, address: usize);
155
156    /// Generate source line mapping
157    fn generate_line_mapping(&mut self, source: &str) -> Result<String>;
158
159    /// Emit debug location directive
160    fn emit_debug_location(&mut self, line: usize, column: usize);
161}