Compare commits

..

No commits in common. "1bc28d02ffa9e900717ab22e8a8df6686b6846cc" and "6c6bac142b5bb04cb7505af1a0c947bdc162a967" have entirely different histories.

6 changed files with 22 additions and 123 deletions

1
.gitignore vendored
View file

@ -1,3 +1,2 @@
/target /target
Cargo.lock Cargo.lock
test.plonkus

View file

@ -14,14 +14,12 @@ pub struct Function {
pub enum Statement { pub enum Statement {
FunctionCall(String, Vec<ValueNode>), FunctionCall(String, Vec<ValueNode>),
VariableDeclaration(String, ValueNode), VariableDeclaration(String, ValueNode),
VariableAssignment(String, ValueNode),
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum ValueNode { pub enum ValueNode {
Literal(Literal), Literal(Literal),
Operator(Operator), Operator(Operator),
Variable(String),
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -38,7 +36,6 @@ pub enum Operator {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct AssemblerState { pub struct AssemblerState {
pub functions: HashMap<String, Function>, pub functions: HashMap<String, Function>,
pub variables: Vec<String>,
} }
pub trait Node { pub trait Node {
@ -64,7 +61,6 @@ impl AssemblerState {
pub fn new() -> AssemblerState { pub fn new() -> AssemblerState {
AssemblerState { AssemblerState {
functions: get_default_functions(), functions: get_default_functions(),
variables: Vec::new(),
} }
} }
} }
@ -118,9 +114,8 @@ F-OUT JMP 0xFF"
assembly: Some( assembly: Some(
" "
exit: exit:
F-OUT JMP 0xFF F-OUT JMP 0xFF"
" .to_string(),
.to_string(),
), ),
}, },
); );
@ -132,8 +127,7 @@ impl Node for Function {
match &self.assembly { match &self.assembly {
Some(v) => v.to_string(), Some(v) => v.to_string(),
None => format!( None => format!(
"{}: "{}:\n{}
{}
; ;
; Pop the return address of the stack ; Pop the return address of the stack
; ;
@ -170,8 +164,6 @@ impl Node for Statement {
todo!() todo!()
} }
state.variables.push(name.to_owned());
let argument_assembly: String = arguments let argument_assembly: String = arguments
.into_iter() .into_iter()
.map(|x| x.to_assembly(state)) .map(|x| x.to_assembly(state))
@ -184,10 +176,9 @@ impl Node for Statement {
.map(char::from) .map(char::from)
.collect(); .collect();
state.variables.pop();
format!( format!(
"; "
;
; Stack ; Stack
; ;
@ -218,37 +209,8 @@ F-OUT JMP 0xFF ; Jump to function
" "
) )
} }
Statement::VariableDeclaration(name, value) => { Statement::VariableDeclaration(_name, _value) => {
let assembly = value.to_assembly(state); todo!()
state.variables.pop();
state.variables.push(name.to_owned());
assembly
}
Statement::VariableAssignment(name, value) => {
let value_assembly = value.to_assembly(state);
state.variables.pop();
let stack_pos = state.variables.len()
- state.variables.iter().position(|x| x == name).unwrap()
- 1;
format!(
"{value_assembly}
SE-OUT RAM-ADDR-U-IN 0xFF ; Move RAM Pointer To Correct Position
RAM-OUT C-IN 0xFF ; Move The Contents Of The RAM To The C Register
ROM-OUT FLAGS-IN 0x80 ; Subtract Mode
SE-OUT A-IN 0xFF ; Fetch SE
ROM-OUT B-IN 0x01 ; Subtract 1
ALU-OUT SE-IN 0xFF ; Output SE-1 into SE
SE-OUT A-IN 0xFF ; Fetch SE
ROM-OUT B-IN {stack_pos} ; Subtract Stack Position From SE
ALU-OUT RAM-ADDR-U-IN 0xFF ; Move RAM Pointer To Correct Position
C-OUT RAM-IN 0xFF
ROM-OUT FLAGS-IN 0x00 ; Add Mode
"
)
} }
} }
} }
@ -259,56 +221,17 @@ impl Node for ValueNode {
match self { match self {
ValueNode::Literal(v) => v.to_assembly(state), ValueNode::Literal(v) => v.to_assembly(state),
ValueNode::Operator(o) => o.to_assembly(state), ValueNode::Operator(o) => o.to_assembly(state),
ValueNode::Variable(name) => {
if !state.variables.contains(name) {
todo!();
}
let stack_position = state.variables.len()
- state.variables.iter().position(|x| x == name).unwrap()
- 1;
dbg!(&state.variables);
state.variables.push(name.to_owned());
format!(
";
; Get From Stack
;
; Get value of variable {name}
ROM-OUT FLAGS-IN 0x80 ; Subtract Mode
SE-OUT A-IN 0xFF ; Fetch SE
ROM-OUT B-IN {stack_position} ; Subtract Position Of Variable In Stack
ALU-OUT RAM-ADDR-U-IN 0xFF ; Set RAM Address To Position Of Variable In RAM
ROM-OUT FLAGS-IN 0x00 ; Add Mode
RAM-OUT C-IN 0xFF ; Put Variable Value In C Register
;
; Push To Top Of Stack
;
; Add One To SE
ROM-OUT B-IN 0x01
ALU-OUT SE-IN 0xFF
SE-OUT RAM-ADDR-U-IN 0xFF
C-OUT RAM-IN 0xFF
"
)
}
} }
} }
} }
impl Node for Literal { impl Node for Literal {
fn to_assembly(&self, state: &mut AssemblerState) -> String { fn to_assembly(&self, _state: &mut AssemblerState) -> String {
match self { match self {
Literal::Int(v) => { Literal::Int(v) => {
state.variables.push(v.to_string());
format!( format!(
"; "
;
; Stack ; Stack
; ;
@ -332,8 +255,9 @@ impl Node for Operator {
fn to_assembly(&self, state: &mut AssemblerState) -> String { fn to_assembly(&self, state: &mut AssemblerState) -> String {
match self { match self {
Operator::Add(a, b) => { Operator::Add(a, b) => {
let assembly = format!( format!(
"{} "
{}
{} {}
SE-OUT RAM-ADDR-U-IN 0xFF ; Set ram address to stack end SE-OUT RAM-ADDR-U-IN 0xFF ; Set ram address to stack end
@ -366,13 +290,12 @@ C-OUT RAM-IN 0xFF ; Store address after jump in ram
", ",
a.to_assembly(state), a.to_assembly(state),
b.to_assembly(state) b.to_assembly(state)
); )
state.variables.pop();
assembly
} }
Operator::Sub(a, b) => { Operator::Sub(a, b) => {
format!( format!(
"{} "
{}
{} {}
SE-OUT RAM-ADDR-U-IN 0xFF ; Set ram address to stack end SE-OUT RAM-ADDR-U-IN 0xFF ; Set ram address to stack end

View file

@ -9,7 +9,7 @@ fn main() {
let tokens = tokeniser::tokenise(contents); let tokens = tokeniser::tokenise(contents);
let functions = dbg!(parse::ast(tokens)); let functions = parse::ast(tokens);
let assembly = ast::to_assembly(functions); let assembly = ast::to_assembly(functions);

View file

@ -28,7 +28,6 @@ fn parse_math(tokens: &Vec<Token>) -> ValueNode {
if tokens.len() == 1 { if tokens.len() == 1 {
return match &tokens[0] { return match &tokens[0] {
Token::Number(n) => ValueNode::Literal(Literal::Int(n.parse::<i64>().unwrap())), Token::Number(n) => ValueNode::Literal(Literal::Int(n.parse::<i64>().unwrap())),
Token::Identifier(identifier) => ValueNode::Variable(identifier.to_owned()),
_ => todo!(), _ => todo!(),
}; };
} }
@ -112,37 +111,13 @@ fn parse_statement(
_ => todo!(), _ => todo!(),
}; };
*i += 1;
let mut declaration_tokens: Vec<Token> = Vec::new(); let mut declaration_tokens: Vec<Token> = Vec::new();
while tokens[*i] != Token::Semi { while tokens[*i] != Token::Semi {
declaration_tokens.push(tokens[*i].clone());
*i += 1; *i += 1;
declaration_tokens.push(tokens[*i].clone());
} }
Statement::VariableDeclaration(name, parse_math(&declaration_tokens)) Statement::VariableDeclaration(name, parse_math(&declaration_tokens))
} }
Token::Keyword(Keyword::Assign) => {
*i += 1;
let name = match tokens[*i].clone() {
Token::Identifier(identifier) => identifier,
_ => todo!(),
};
*i += 1;
match tokens[*i].clone() {
Token::Equals => {}
_ => todo!(),
};
*i += 1;
let mut declaration_tokens: Vec<Token> = Vec::new();
while tokens[*i] != Token::Semi {
declaration_tokens.push(tokens[*i].clone());
*i += 1;
}
Statement::VariableAssignment(name, parse_math(&declaration_tokens))
}
Token::Identifier(identifier) => { Token::Identifier(identifier) => {
*i += 1; *i += 1;

View file

@ -19,7 +19,6 @@ pub enum Keyword {
Return, Return,
Function, Function,
Let, Let,
Assign,
} }
enum TokenFinishedUnfinished { enum TokenFinishedUnfinished {
@ -38,7 +37,6 @@ fn generate_keyword_map() -> HashMap<String, Keyword> {
keywords.insert("return".to_string(), K::Return); keywords.insert("return".to_string(), K::Return);
keywords.insert("fn".to_string(), K::Function); keywords.insert("fn".to_string(), K::Function);
keywords.insert("let".to_string(), K::Let); keywords.insert("let".to_string(), K::Let);
keywords.insert("assign".to_string(), K::Assign);
keywords keywords
} }

4
test.plonkus Normal file
View file

@ -0,0 +1,4 @@
fn main {
out(42 - 3 - 1,);
exit(,);
}