class Bpl::Sorting
Constants
- KINDS
Public Instance Methods
order(d,e)
click to toggle source
# File lib/bpl/passes/transformation/sorting.rb, line 32 def order(d,e) res = type_order(d, e) return res unless res == 0 return d.names.first <=> e.names.first unless d.names.empty? if d.is_a?(Declaration) return d.to_s <=> e.to_s end
run!(program)
click to toggle source
# File lib/bpl/passes/transformation/sorting.rb, line 39 def run! program if kind.match(/locals|all/) info "SORTING LOCAL DECLARATIONS" info program.declarations.each do |d| next unless d.is_a?(ProcedureDeclaration) next unless d.body d.body.locals.each do |v| v.instance_variable_set "@names", v.names.sort end d.body.replace_children :locals, *d.body.locals.sort {|d1,d2| order(d1,d2)} end end if kind.match(/globals|all/) info "SORTING GLOBAL DECLARATIONS" info program.declarations.each do |d| next unless d.instance_variable_defined?("@names") d.instance_variable_set "@names", d.names.sort end program.replace_children :declarations, *program.declarations.sort {|d,e| order(d,e)} end if kind.match(/specs|all/) info "SORTING SPECIFICATIONS" info program.declarations.each do |d| next unless d.is_a?(ProcedureDeclaration) d.specifications.each do |s| next unless s.is_a?(ModifiesClause) s.instance_variable_set "@identifiers", s.identifiers.sort {|i,j| i.name <=> j.name} end d.replace_children :specifications, *d.specifications.sort {|s,t| order(s,t)} end end end
type_order(d,e)
click to toggle source
# File lib/bpl/passes/transformation/sorting.rb, line 12 def type_order(d,e) return 0 if d.class == e.class res = [ TypeDeclaration, ConstantDeclaration, FunctionDeclaration, AxiomDeclaration, VariableDeclaration, ProcedureDeclaration, ImplementationDeclaration, RequiresClause, EnsuresClause, ModifiesClause ].each do |c| break -1 if d.is_a?(c) break 1 if e.is_a?(c) end return 0 if res.is_a?(Array) return res end