Website Summary Files Commits Branches @commit @diff @stats
path: root / assembler / src / parser / semantic.rs
diff options
context:
space:
mode:
Commit9517d3d05e86621b6c4ed58edd7f5821632e0872 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-02-14 08:23:08 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-02-14 08:24:27 +0200
Files2d633e6452e8167bada5db90d061cbdbd8ffcf89 /assembler/src/parser/semantic.rs
tonkobali-9517d3d05e86621b6c4ed58edd7f5821632e0872.tar
tonkobali-9517d3d05e86621b6c4ed58edd7f5821632e0872.tar.gz
tonkobali-9517d3d05e86621b6c4ed58edd7f5821632e0872.zip
Parent2cf1097e124c5a0c5836987416b080b6aa4cdd0f (diff)
feat(assembler): Implemented semantic analysis
1 files changed, 23 insertions, 0 deletions
-rw-r--r--assembler/src/parser/semantic.rs23
diff --git a/assembler/src/parser/semantic.rs b/assembler/src/parser/semantic.rs
new file mode 100644
index 0000000..47ba201
--- /dev/null
+++ b/assembler/src/parser/semantic.rs
@@ -0,0 +1,23 @@
+use super::{ Address, Program };
+
+impl Program {
+ pub(crate) fn remove_definition_addresses(&mut self) {
+ for instr in &mut self.instructions {
+ for arg in &mut instr.args {
+ if let Address::Definitions(name) = arg {
+ *arg = self.definitions[name].clone();
+ }
+ }
+ }
+ self.definitions.clear();
+ }
+
+ pub(crate) fn analyze(&self) {
+ for instr in &self.instructions {
+ let result = instr.check_args();
+ if result.is_err() {
+ panic!("Instruction '{}' error: {:?}", instr.name, result.err().unwrap());
+ }
+ }
+ }
+}