base/AstRewritter.rb in maroon-0.7.0 vs base/AstRewritter.rb in maroon-0.7.1
- old
+ new
@@ -1,60 +1,71 @@
context :AstRewritter do
role :ast do
end
def initialize (ast, interpretation_context)
- @ast = Production.new ast, interpretation_context
+ @ast = AbstractSyntaxTree.new ast, interpretation_context
+ @roles = interpretation_context.roles
end
def rewrite!
- ast.each { |production|
+ ast.each_production { |production|
case production.type
when Tokens::rolemethod_call
data = production.data
production[2] = ('self_' + data[1].to_s + '_' + data[0].to_s).to_sym
production[1] = nil
when Tokens::block_with_bind
block = production.last
- must_b_sym = 'aliased_role must be a Symbol'.to_sym
- local_must_b_sym = 'local must be a Symbol'.to_sym
- raise must_b_sym unless aliased_role.instance_of? Symbol
- raise local_must_b_sym unless local.instance_of? Symbol
- # assigning role player to role field
- #notice that this will be executed after the next block
- aliased_field = ('@' + aliased_role.to_s).to_sym
- temp_symbol = ('temp____' + aliased_role.to_s).to_sym
+ block.delete_at 1
+ production.data.each do |local,aliased_role|
+ must_b_sym = 'aliased_role must be a Symbol'.to_sym
+ local_must_b_sym = 'local must be a Symbol'.to_sym
+ raise must_b_sym unless aliased_role.instance_of? Symbol
+ raise local_must_b_sym unless local.instance_of? Symbol
+ unless @roles.has_key? aliased_role
+ role_names = []
+ @interpretation_context.each do |k,v|
+ role_names << k.to_s
+ end
+ raise aliased_role.to_s + ' is not a role. Available roles are ' + role_names.join(',')
+ end
+ # assigning role player to role field
+ #notice that this will be executed after the next block
+ aliased_field = ('@' + aliased_role.to_s).to_sym
+ temp_symbol = ('temp____' + aliased_role.to_s).to_sym
- assignment = Sexp.new
- assignment[0] = :iasgn
- assignment[1] = aliased_field
- load_arg = Sexp.new
- load_arg[0] = :lvar
- load_arg[1] = local
- assignment[2] = load_arg
- block.insert 1, assignment
+ assignment = Sexp.new
+ assignment[0] = :iasgn
+ assignment[1] = aliased_field
+ load_arg = Sexp.new
+ load_arg[0] = :lvar
+ load_arg[1] = local
+ assignment[2] = load_arg
+ block.insert 1, assignment
- # assign role player to temp
- # notice this is prepended Ie. inserted in front of the role player to role field
- assignment = Sexp.new
- assignment[0] = :lasgn
- assignment[1] = temp_symbol
- load_field = Sexp.new
- load_field[0] = :ivar
- load_field[1] = aliased_field
- assignment[2] = load_field
- block.insert 1, assignment
+ # assign role player to temp
+ # notice this is prepended Ie. inserted in front of the role player to role field
+ assignment = Sexp.new
+ assignment[0] = :lasgn
+ assignment[1] = temp_symbol
+ load_field = Sexp.new
+ load_field[0] = :ivar
+ load_field[1] = aliased_field
+ assignment[2] = load_field
+ block.insert 1, assignment
- # reassign original player
- assignment = Sexp.new
- assignment[0] = :iasgn
- assignment[1] = aliased_field
- load_temp = Sexp.new
- load_temp[0] = :lvar
- load_temp[1] = temp_symbol
- assignment[2] = load_temp
- block[block.length] = assignment
+ # reassign original player
+ assignment = Sexp.new
+ assignment[0] = :iasgn
+ assignment[1] = aliased_field
+ load_temp = Sexp.new
+ load_temp[0] = :lvar
+ load_temp[1] = temp_symbol
+ assignment[2] = load_temp
+ block[block.length] = assignment
+ end
else
#do nothing
end
}
end
\ No newline at end of file