Fix some warnings, make commands nicer
This commit is contained in:
parent
b0a4f9dc7e
commit
267d3aabf0
@ -1 +1,2 @@
|
||||
let otus = "gotus";
|
||||
let dotus = otus;
|
@ -3,19 +3,20 @@ use std::collections::HashMap;
|
||||
use super::errors::CompilerError;
|
||||
use super::parser::{Expression, LiteralPattern, ParsedReid, Pattern, Position, Statement};
|
||||
|
||||
type Variable = (VariableID, VariableType);
|
||||
type VariableID = u32;
|
||||
type Variable = (HeapID, VariableType);
|
||||
type HeapID = u32;
|
||||
type RegID = u32;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum Command {
|
||||
InitializeVariable(VariableID, VariableType),
|
||||
BeginScope,
|
||||
EndScope,
|
||||
Pop(u32), // Pop into registery u32
|
||||
Push(u32), // Push out of registery 32
|
||||
AssignVariable(VariableID, u32), // Assign variable from registery u32
|
||||
VarToReg(VariableID, u32), // Bring Variable to registery u32
|
||||
StringLit(String), // Bring String Literal to Heap
|
||||
InitializeVariable(HeapID, VariableType), // Initializes new variable to HeapID at VariableType
|
||||
BeginScope, // Begins new Scope
|
||||
EndScope, // Ends Scope
|
||||
Pop(RegID), // Pop into registery at RegID
|
||||
Push(RegID), // Push out of registery at RegID
|
||||
AssignVariable(HeapID, RegID), // Assign variable from registery at RegID
|
||||
VarToReg(HeapID, RegID), // Bring Variable to registery at RegID
|
||||
StringLit(String), // Bring String Literal to Stack
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
@ -109,7 +110,7 @@ impl Compiler {
|
||||
Err(err) => Err(CompilerError::LetFailed(pos, Box::new(err))),
|
||||
}
|
||||
}
|
||||
Statement::ExprStatement(pos, expr) => self.handle_expression(expr),
|
||||
Statement::ExprStatement(_, expr) => self.handle_expression(expr),
|
||||
}
|
||||
}
|
||||
|
||||
@ -123,16 +124,16 @@ impl Compiler {
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct Scope {
|
||||
counter: VariableID,
|
||||
counter: HeapID,
|
||||
variables: HashMap<String, Variable>,
|
||||
innerScope: Option<Box<Scope>>,
|
||||
inner_scope: Option<Box<Scope>>,
|
||||
}
|
||||
|
||||
impl Scope {
|
||||
fn get(&self, variable: String) -> Option<Variable> {
|
||||
if let Some(val) = self.variables.get(&variable) {
|
||||
Some(*val)
|
||||
} else if let Some(inner) = &self.innerScope {
|
||||
} else if let Some(inner) = &self.inner_scope {
|
||||
if let Some(val) = inner.get(variable) {
|
||||
Some((val.0 + self.counter, val.1))
|
||||
} else {
|
||||
@ -151,7 +152,7 @@ impl Scope {
|
||||
) -> Result<(), CompilerError> {
|
||||
if self.variables.contains_key(&variable) {
|
||||
Err(CompilerError::VariableExists(pos, variable))
|
||||
} else if let Some(inner) = &mut self.innerScope {
|
||||
} else if let Some(inner) = &mut self.inner_scope {
|
||||
inner.add_var(pos, variable, vtype)
|
||||
} else {
|
||||
self.variables.insert(variable, (self.counter, vtype));
|
||||
@ -161,19 +162,19 @@ impl Scope {
|
||||
}
|
||||
|
||||
fn begin_scope(&mut self) {
|
||||
if let Some(inner) = &mut self.innerScope {
|
||||
if let Some(inner) = &mut self.inner_scope {
|
||||
inner.begin_scope();
|
||||
} else {
|
||||
self.innerScope = Some(Box::default());
|
||||
self.inner_scope = Some(Box::default());
|
||||
}
|
||||
}
|
||||
|
||||
fn end_scope(&mut self, pos: Position) -> Result<(), CompilerError> {
|
||||
if let Some(inner) = &mut self.innerScope {
|
||||
if inner.innerScope.is_some() {
|
||||
if let Some(inner) = &mut self.inner_scope {
|
||||
if inner.inner_scope.is_some() {
|
||||
inner.end_scope(pos)?;
|
||||
} else {
|
||||
self.innerScope = None;
|
||||
self.inner_scope = None;
|
||||
}
|
||||
Ok(())
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user