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