source debug/instructions.tcl

proc make_parser_rules {is} {
    proc type_name_to_type_enum {n} {
        switch $n {
            "register" {
                return "REG"
            }
            "immediate" {
                return "IMM"
            }
            "memory" {
                return "MEM"
            }
            default {
                malformed_instruction $n
            }
        }
    }
    proc type_name_to_type_value {n e} {
        switch $n {
            "register" {
                return "$e.number"
            }
            "immediate" {
                return "(int)$e"
            }
            "memory" {
                return "???"
            }
            default {
                malformed_instruction $n
            }
        }
    }
    proc make_parser_rule {i} {
        if {[llength $i] == 1} {
            set rule [format "    | I%s { append_instruction_t1(%s); }" \
                [string toupper [lindex $i 0]] \
                [string toupper [lindex $i 0]]
            ]
        } elseif {[llength $i] == 3} {
            set rule [format "    | I%s %s %s \{ append_instruction_t4(\
                                                    %s,\
                                                    \$2.size,\
                                                    %s,\
                                                    %s,\
                                                    %s,\
                                                    %s\
                            );" \
                [string toupper [lindex $i 0]] \
                [lindex $i 1]                  \
                [lindex $i 2]                  \
                \
                [string toupper [lindex $i 0]] \
                [type_name_to_type_enum  [lindex $i 1]]       \
                [type_name_to_type_value [lindex $i 1] "\$2"] \
                [type_name_to_type_enum  [lindex $i 2]]       \
                [type_name_to_type_value [lindex $i 2] "\$3"] \
            ]
        } else {
            malformed_instruction $i
        }
        puts $rule
    }

    foreach i $is {
        make_parser_rule $i
    }
}

make_parser_rules $instructions