lib/kompiler/mc_builder.rb in kompiler-0.2.0 vs lib/kompiler/mc_builder.rb in kompiler-0.3.0.pre.1

- old
+ new

@@ -1,14 +1,15 @@ # Copyright 2024 Kyrylo Shyshko # Licensed under the Apache License, Version 2.0. See LICENSE file for details. module Kompiler -class MachineCode_AST +module MachineCode_AST -MC_AST_NODES = [ +@MC_AST_NODES = [ {name: "get_operand", n_args: 1, func: lambda {|args, state| state[:operands][args[0]][:value]} }, + {name: "get_operand_hash", n_args: 1, func: lambda {|args, state| state[:operands][args[0]] } }, {name: "get_bits", n_args: 3, func: lambda {|args, state| (args[1]...(args[1] + args[2])).map{|bit_i| args[0][bit_i]} } }, {name: "get_bits_signed", n_args: 3, func: lambda do |args, state| if args[1] == 0 # If sign should be included (args[0] >= 0 ? [0] : [1]) + (0...(args[2] - 1)).map{|bit_i| args[0].abs[bit_i]} @@ -36,13 +37,25 @@ return eval_mc_node_arg(block, state) end end eval_mc_node_arg(args.last, state) end}, - {name: "raise_error", n_args: 1, func: lambda {|args, state| raise args[0] } }, - {name: "get_key", n_args: 2, func: lambda {|args, state| args[0][args[1]] }}, + + {name: "raise_error", n_args: 1, func: lambda {|args, state| raise args[0]; [] } }, + {name: "raise_warning", n_args: 1, func: lambda {|args, state| puts args[0]; [] } }, + + {name: "get_key", n_args: 2, func: lambda {|args, state| args[0].keys.include?(args[1]) ? args[0][args[1]] : raise("MC Constructor get_key Error: The key \"#{args[1]}\" doesn't exist - Program build not possible. This is likely a problem with the ISA configuration, not the program being compiled.") }}, {name: "concat", n_args: "any", func: lambda {|args, state| args.flatten}}, + {name: "set_var", n_args: 2, func: lambda {|args, state| state[:instruction_variables][args[0]] = args[1]; [] }}, + {name: "get_var", n_args: 1, func: lambda {|args, state| state[:instruction_variables].keys.include?(args[0]) ? state[:instruction_variables][args[0]] : raise("Instruction variable \"#{args[0]}\" not found: Program build not possible. This is likely a program with the ISA configuration, not the program being compiled.") }}, + + # String manipulations + {name: "downcase_str", n_args: 1, func: lambda {|args, state| args[0].downcase }}, + + # Bit manipulations + {name: "bit_and", n_args: 2, func: lambda {|args, state| args[0] & args[1] }}, + {name: "bit_or", n_args: 2, func: lambda {|args, state| args[0] | args[1] }}, ] def self.is_ast_node(val) val.is_a?(Array) && (val.size >= 1) && val[0].is_a?(String) end @@ -55,12 +68,13 @@ def self.run_mc_ast(node, state) node_name = node[0] node_args = node[1..] - node_logic = MC_AST_NODES.filter{|any_node| any_node[:name] == node_name}[0] + node_logic = @MC_AST_NODES.filter{|any_node| any_node[:name] == node_name}[0] + if !node_logic raise "MC Node \"#{node_name}\" wasn't found. Cannot build the program" end if !node_logic.keys.include?(:eval_args) || node_logic[:eval_args] != false @@ -95,6 +109,6 @@ end end # Kompiler::MC_AST -end # Kompiler \ No newline at end of file +end # Kompiler