diff --git a/lib/crystal.rb b/lib/crystal.rb index 1eab46d5..fd03b5ac 100644 --- a/lib/crystal.rb +++ b/lib/crystal.rb @@ -1,7 +1,7 @@ require 'parslet' require "elf/object_writer" -require 'parser/composed' +require 'parser/crystal' require 'parser/transform' require "vm/context" require "vm/machine" diff --git a/lib/parser/composed.rb b/lib/parser/crystal.rb similarity index 86% rename from lib/parser/composed.rb rename to lib/parser/crystal.rb index 73aa5da9..6dd25a5a 100644 --- a/lib/parser/composed.rb +++ b/lib/parser/crystal.rb @@ -7,7 +7,7 @@ module Parser # obviously a work in progress !! # We "compose" the parser from bits, divide and hopefully conquer - class Composed < Parslet::Parser + class Crystal < Parslet::Parser include BasicTypes include Tokens include Keywords @@ -19,9 +19,9 @@ module Parser rule(:argument_list) { left_parenthesis >> - ( (simple_expression.as(:argument) >> - (comma >> simple_expression.as(:argument)).repeat(0)).repeat(0,1)).as(:argument_list) >> - right_parenthesis + ( (simple_expression.as(:argument) >> space? >> + (comma >> space? >> simple_expression.as(:argument)).repeat(0)).repeat(0,1)).as(:argument_list) >> + space? >> right_parenthesis } rule(:function_call) { name.as(:function_call) >> argument_list } @@ -54,6 +54,6 @@ module Parser ((name.as(:parmeter) >> (comma >> name.as(:parmeter)).repeat(0)).repeat(0,1)).as(:parmeter_list) >> right_parenthesis } - rule(:root){ function_definition | expression | assignment } + rule(:root){ function_definition | expression | assignment | function_call } end end diff --git a/lib/vm/values.rb b/lib/vm/values.rb index d83c4067..f065b0a0 100644 --- a/lib/vm/values.rb +++ b/lib/vm/values.rb @@ -65,14 +65,16 @@ module Vm # currently aligned to 4 (ie padded with 0) and off course 0 at the end def initialize(str) - super() + super(str) length = str.length # rounding up to the next 4 (always adding one for zero pad) pad = ((length / 4 ) + 1 ) * 4 - length raise "#{pad} #{self}" unless pad >= 1 @string = str + "\x00" * pad end - attr_reader :string + def string + @value + end def load reg_num Machine.instance.string_load self , reg_num diff --git a/test/parser/helper.rb b/test/parser/helper.rb index d3de61d1..5341ff47 100644 --- a/test/parser/helper.rb +++ b/test/parser/helper.rb @@ -10,7 +10,7 @@ module ParserHelper module InstanceMethods def setup - @parser = Parser::Composed.new + @parser = Parser::Crystal.new @transform = Parser::Transform.new end diff --git a/test/test_runner.rb b/test/test_runner.rb index 99df65e8..e430cc46 100644 --- a/test/test_runner.rb +++ b/test/test_runner.rb @@ -19,7 +19,7 @@ class TestRunner < MiniTest::Test def execute file string = File.read(file) - parser = Parser::Composed.new + parser = Parser::Crystal.new program = Vm::Program.new "Arm" parts = string.split "SPLIT" parts.each_with_index do |part,index|