Skip to content

Commit 7c370d2

Browse files
Finish implementation of modifier parsing
Also updated expected_loadfile and test_file in integration tests
1 parent 1389df5 commit 7c370d2

File tree

4 files changed

+48
-23
lines changed

4 files changed

+48
-23
lines changed

src/load_file.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,9 @@ impl Instruction {
146146
impl ToString for Instruction {
147147
fn to_string(&self) -> String {
148148
format!(
149-
"{} {}, {}",
149+
"{}.{} {}, {}",
150150
self.opcode.to_string(),
151+
self.modifier.to_string(),
151152
self.field_a.to_string(),
152153
self.field_b.to_string(),
153154
)

src/parser.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,21 @@ pub fn parse(file_contents: &str) -> Result<Core, Error> {
6666
}
6767

6868
fn parse_instruction(mut instruction_pairs: Pairs<Rule>) -> Instruction {
69+
let mut operation_pairs = instruction_pairs
70+
.next()
71+
.expect("Operation must be first pair in Instruction")
72+
.into_inner();
73+
6974
let opcode = parse_opcode(
70-
&instruction_pairs
75+
&operation_pairs
7176
.next()
72-
.expect("Opcode must be first pair in Instruction"),
77+
.expect("Opcode must be first pair in Operation"),
7378
);
7479

75-
let maybe_modifier = instruction_pairs
80+
let maybe_modifier = operation_pairs
7681
.peek()
7782
.filter(|pair| pair.as_rule() == Rule::Modifier)
78-
.map(|pair| Modifier::from_str(pair.as_str()).expect("Invalid Modifier"));
83+
.and_then(|pair| Some(parse_modifier(&pair)));
7984

8085
let field_a = parse_field(
8186
instruction_pairs
@@ -100,6 +105,10 @@ fn parse_instruction(mut instruction_pairs: Pairs<Rule>) -> Instruction {
100105
}
101106
}
102107

108+
fn parse_modifier(modifier_pair: &Pair<Rule>) -> Modifier {
109+
Modifier::from_str(modifier_pair.as_str().to_uppercase().as_ref()).unwrap()
110+
}
111+
103112
fn parse_opcode(opcode_pair: &Pair<Rule>) -> Opcode {
104113
Opcode::from_str(opcode_pair.as_str().to_uppercase().as_ref()).unwrap()
105114
}

tests/expected_loadfile.red

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
1-
MOV $0, $1
2-
DAT $1, $2
3-
MOV $1, $0
4-
JMP $123, $0
5-
ADD #1, @2
6-
SUB $3, $4
7-
MUL $5, $6
8-
DIV $7, $8
9-
MOD $9, $10
10-
JMZ $0, $0
11-
JMN $0, $0
12-
DJN $0, $0
13-
CMP $0, $0
14-
SEQ $0, $0
15-
SNE $0, $0
16-
SLT $0, $0
17-
SPL $0, $0
18-
NOP $0, $0
1+
MOV.I $0, $1
2+
DAT.F $1, $2
3+
MOV.I $1, $0
4+
JMP.B $123, $0
5+
ADD.AB #1, @2
6+
SUB.F $3, $4
7+
MUL.F $5, $6
8+
DIV.F $7, $8
9+
MOD.F $9, $10
10+
JMZ.B $0, $0
11+
JMN.B $0, $0
12+
DJN.B $0, $0
13+
CMP.I $0, $0
14+
SEQ.I $0, $0
15+
SNE.I $0, $0
16+
SLT.B $0, $0
17+
SPL.B $0, $0
18+
NOP.B $0, $0
19+
MOV.A $1, $2
20+
MOV.B $1, $2
21+
MOV.AB $1, $2
22+
MOV.BA $1, $2
23+
MOV.F $1, $2
24+
MOV.X $1, $2
25+
MOV.I $1, $2

tests/test_file.red

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,11 @@ nop 0
2424
; org 0
2525
; equ 0
2626
; end 0
27+
28+
mov.a 1, 2
29+
mov.b 1, 2
30+
mov.ab 1, 2
31+
mov.ba 1, 2
32+
mov.f 1, 2
33+
mov.x 1, 2
34+
mov.i 1, 2

0 commit comments

Comments
 (0)