eaxhla/tool/generators/instruction_parser_rules.tcl
2024-07-19 04:10:50 +02:00

89 lines
3.0 KiB
Tcl

source tool/generators/instructions.tcl
proc make_parser_rules {is} {
proc init_iarg {a n} {
set r [dict create]
switch $a {
"register" {
dict set r enum "REG"
dict set r value "\$$n.number"
dict set r size "\$$n.size"
}
"immediate" {
dict set r enum "$$n.type"
dict set r value "$$n.value"
# XXX
dict set r size "D32"
}
"relative" {
dict set r enum "REL"
dict set r value "$$n"
dict set r size "D32"
}
"memory" {
dict set r enum "MEM"
dict set r value "0 /* ??? */"
dict set r size "0 /* ??? */"
}
default { malformed_instruction $n }
}
return $r
}
proc make_parser_rule {i} {
set token_name [string toupper [lindex $i 0]]
if {[llength $i] == 1} {
set rule [format " | IT%s { append_instructions(%s); }" \
$token_name \
$token_name \
]
} elseif {[llength $i] == 2} {
set arg [init_iarg [lindex $i 1] 2]
set rule [format " | IT%s %s \{ append_instructions(\
%s,\
%s,\
%s,\
%s\
); \}" \
$token_name \
[lindex $i 1] \
\
$token_name \
[dict get $arg size] \
[dict get $arg enum] \
[dict get $arg value] \
]
} elseif {[llength $i] == 3} {
set arg1 [init_iarg [lindex $i 1] 2]
set arg2 [init_iarg [lindex $i 2] 3]
set rule [format " | IT%s %s %s \{ append_instructions(\
%s,\
%s,\
%s,\
%s,\
%s,\
%s\
); \}" \
$token_name \
[lindex $i 1] \
[lindex $i 2] \
\
$token_name \
[dict get $arg1 size] \
[dict get $arg1 enum] \
[dict get $arg1 value] \
[dict get $arg2 enum] \
[dict get $arg2 value] \
]
} else {
malformed_instruction $i
}
puts $rule
}
foreach i $is {
make_parser_rule $i
}
}
make_parser_rules $instructions