lib/kaiser_ruby/rockstar_transform.rb in kaiser-ruby-0.1.0 vs lib/kaiser_ruby/rockstar_transform.rb in kaiser-ruby-0.2.0

- old
+ new

@@ -1,13 +1,56 @@ module KaiserRuby class RockstarTransform < Parslet::Transform - rule(:number_str => simple(:str)) { str.to_s.split(/\s+/).map {|e| e.length % 10}.join.to_i } + rule(variable_name: simple(:str)) { |c| parameterize(c[:str]) } - rule(:var => { :var_name => simple(:name), :var_value => simple(:value) }) do |context| - "#{parameterize(context[:name])} = #{context[:value]}" + rule(nil_value: simple(:_)) { 'nil' } + rule(true_value: simple(:_)) { 'true' } + rule(false_value: simple(:_)) { 'false' } + rule(string_value: simple(:str)) { str } + rule(numeric_value: simple(:num)) { num } + rule(unquoted_string: simple(:str)) { "\"#{str}\"" } + rule(string_as_number: simple(:str)) do |c| + if c[:str].to_s.include?('.') + c[:str].to_s.gsub(/[^A-Za-z\s\.]/, '').split('.').map do |sub| + str_to_num(sub) + end.join('.').to_f + else + str_to_num(c[:str]) + end end + rule(assignment: { left: simple(:left), right: simple(:right) }) { "#{left} = #{right}" } + rule(increment: simple(:str)) { "#{str} += 1" } + rule(decrement: simple(:str)) { "#{str} -= 1" } + rule(addition: { left: simple(:left), right: simple(:right) }) { "#{left} + #{right}" } + rule(subtraction: { left: simple(:left), right: simple(:right) }) { "#{left} - #{right}" } + rule(multiplication: { left: simple(:left), right: simple(:right) }) { "#{left} * #{right}" } + rule(division: { left: simple(:left), right: simple(:right) }) { "#{left} / #{right}" } + + rule(print: { output: simple(:output) }) { "puts #{output}" } + + rule(equals: { left: simple(:left), right: simple(:right) }) { "#{left} == #{right}" } + rule(if: { if_condition: simple(:if_condition), if_block: sequence(:if_block_lines), endif: simple(:_)} ) do + "if #{if_condition}\n" + + if_block_lines.map { |l| "#{l}\n" }.join + + "end" + end + rule(if_else: { if_condition: simple(:if_condition), if_block: sequence(:if_block_lines), else_block: sequence(:else_block_lines), endif: simple(:_)} ) do + "if #{if_condition}\n" + + if_block_lines.map { |l| "#{l}\n" }.join + + "else\n" + + else_block_lines.map { |l| "#{l}\n" }.join + + "end" + end + + rule(line: simple(:line)) { line == "\n" ? nil : line } + rule(lyrics: sequence(:lines)) { lines.join("\n") + "\n" } + def self.parameterize(string) string.to_s.downcase.gsub(/\s+/, '_') + end + + def self.str_to_num(string) + string.to_s.split(/\s+/).map { |e| e.length % 10 }.join.to_i end end end \ No newline at end of file