add InsId

This commit is contained in:
2020-05-06 00:01:07 +08:00
parent 57e91ff32e
commit a40b6e09cd
2 changed files with 107 additions and 38 deletions

View File

@@ -1,8 +1,77 @@
#[derive(Debug)]
pub enum InsId {
Push, // has data
Dup,
CopyN, // has data
Swap,
Pop,
PopN, // has data
Add,
Sub,
Mul,
Div,
Mod,
Store,
Retrieve,
DefineLabel, // has data
CallAtLabel, // has data
GotoLabel, // has data
GotoLabelE0, // has data
GotoLabelL0, // has data
ReturnCallAt,
End,
StdOutChar,
StdOutNum,
StdInChar,
StdInNum,
}
impl InsId {
pub fn has_data(&self) -> bool {
match self {
InsId::Push | InsId::CopyN | InsId::PopN |
InsId::DefineLabel | InsId::CallAtLabel |
InsId::GotoLabel | InsId::GotoLabelE0 | InsId::GotoLabelL0 => true,
_ => false,
}
}
pub fn new_instruction(&self, data: Option<isize>) -> Instruction {
match self {
InsId::Push => Instruction::Push(data.unwrap_or(0)),
InsId::Dup => Instruction::Dup,
InsId::CopyN => Instruction::CopyN(data.unwrap_or(0)),
InsId::Swap => Instruction::Swap,
InsId::Pop => Instruction::Pop,
InsId::PopN => Instruction::PopN(data.unwrap_or(0)),
InsId::Add => Instruction::Add,
InsId::Sub => Instruction::Sub,
InsId::Mul => Instruction::Mul,
InsId::Div => Instruction::Div,
InsId::Mod => Instruction::Mod,
InsId::Store => Instruction::Store,
InsId::Retrieve => Instruction::Retrieve,
InsId::DefineLabel => Instruction::DefineLabel(data.unwrap_or(0)),
InsId::CallAtLabel => Instruction::CallAtLabel(data.unwrap_or(0)),
InsId::GotoLabel => Instruction::GotoLabel(data.unwrap_or(0)),
InsId::GotoLabelE0 => Instruction::GotoLabelE0(data.unwrap_or(0)),
InsId::GotoLabelL0 => Instruction::GotoLabelL0(data.unwrap_or(0)),
InsId::ReturnCallAt => Instruction::ReturnCallAt,
InsId::End => Instruction::End,
InsId::StdOutChar => Instruction::StdOutChar,
InsId::StdOutNum => Instruction::StdOutNum,
InsId::StdInChar => Instruction::StdInChar,
InsId::StdInNum => Instruction::StdInNum,
}
}
}
#[derive(Debug)]
pub enum InsType {
Path(InsColl),
Node(Instruction),
Node(InsId),
}
#[derive(Debug)]
@@ -19,57 +88,57 @@ pub struct InsColl {
pub fn make_instruction_tree() -> InsColl {
InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Node(Instruction::Push) },
Ins{ c: '', ins_type: InsType::Node(InsId::Push) },
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Node(Instruction::Dup) },
Ins{ c: '', ins_type: InsType::Node(Instruction::Swap) },
Ins{ c: '', ins_type: InsType::Node(Instruction::Pop) }
Ins{ c: '', ins_type: InsType::Node(InsId::Dup) },
Ins{ c: '', ins_type: InsType::Node(InsId::Swap) },
Ins{ c: '', ins_type: InsType::Node(InsId::Pop) }
]})},
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Node(Instruction::CopyN) },
Ins{ c: '', ins_type: InsType::Node(Instruction::PopN) }
Ins{ c: '', ins_type: InsType::Node(InsId::CopyN) },
Ins{ c: '', ins_type: InsType::Node(InsId::PopN) }
]})},
]})},
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Node(Instruction::Add) },
Ins{ c: '', ins_type: InsType::Node(Instruction::Sub) },
Ins{ c: '', ins_type: InsType::Node(Instruction::Mul) },
Ins{ c: '', ins_type: InsType::Node(InsId::Add) },
Ins{ c: '', ins_type: InsType::Node(InsId::Sub) },
Ins{ c: '', ins_type: InsType::Node(InsId::Mul) },
]})},
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Node(Instruction::Div) },
Ins{ c: '', ins_type: InsType::Node(Instruction::Mod) },
Ins{ c: '', ins_type: InsType::Node(InsId::Div) },
Ins{ c: '', ins_type: InsType::Node(InsId::Mod) },
]})},
]})},
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Node(Instruction::Store) },
Ins{ c: '', ins_type: InsType::Node(Instruction::Retrieve) },
Ins{ c: '', ins_type: InsType::Node(InsId::Store) },
Ins{ c: '', ins_type: InsType::Node(InsId::Retrieve) },
]})},
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Node(Instruction::StdOutChar) },
Ins{ c: '', ins_type: InsType::Node(Instruction::StdOutNum) },
Ins{ c: '', ins_type: InsType::Node(InsId::StdOutChar) },
Ins{ c: '', ins_type: InsType::Node(InsId::StdOutNum) },
]})},
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Node(Instruction::StdInChar) },
Ins{ c: '', ins_type: InsType::Node(Instruction::StdInNum) },
Ins{ c: '', ins_type: InsType::Node(InsId::StdInChar) },
Ins{ c: '', ins_type: InsType::Node(InsId::StdInNum) },
]})},
]})},
]})},
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Node(Instruction::DefineLabel) },
Ins{ c: '', ins_type: InsType::Node(Instruction::CallAtLabel) },
Ins{ c: '', ins_type: InsType::Node(Instruction::GotoLabel) },
Ins{ c: '', ins_type: InsType::Node(InsId::DefineLabel) },
Ins{ c: '', ins_type: InsType::Node(InsId::CallAtLabel) },
Ins{ c: '', ins_type: InsType::Node(InsId::GotoLabel) },
]})},
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Node(Instruction::GotoLabelE0) },
Ins{ c: '', ins_type: InsType::Node(Instruction::GotoLabelL0) },
Ins{ c: '', ins_type: InsType::Node(Instruction::ReturnCallAt) },
Ins{ c: '', ins_type: InsType::Node(InsId::GotoLabelE0) },
Ins{ c: '', ins_type: InsType::Node(InsId::GotoLabelL0) },
Ins{ c: '', ins_type: InsType::Node(InsId::ReturnCallAt) },
]})},
Ins{ c: '', ins_type: InsType::Path(InsColl{ inses: vec![
Ins{ c: '', ins_type: InsType::Node(Instruction::End) },
Ins{ c: '', ins_type: InsType::Node(InsId::End) },
]})},
]})},
]}
@@ -77,12 +146,12 @@ pub fn make_instruction_tree() -> InsColl {
#[derive(Debug, Clone)]
pub enum Instruction {
Push,
Push(isize),
Dup,
CopyN,
CopyN(isize),
Swap,
Pop,
PopN,
PopN(isize),
Add,
Sub,
Mul,
@@ -90,11 +159,11 @@ pub enum Instruction {
Mod,
Store,
Retrieve,
DefineLabel,
CallAtLabel,
GotoLabel,
GotoLabelE0,
GotoLabelL0,
DefineLabel(isize),
CallAtLabel(isize),
GotoLabel(isize),
GotoLabelE0(isize),
GotoLabelL0(isize),
ReturnCallAt,
End,
StdOutChar,