premature start on the salama object files, just for reading the compiled code

This commit is contained in:
Torsten Ruger 2014-08-13 20:05:00 +03:00
parent 200228a33d
commit 90cbeddc0a
5 changed files with 107 additions and 0 deletions

30
lib/sof/README.md Normal file
View File

@ -0,0 +1,30 @@
### Salama Object File
Ok, so we all heard about object files, it's the things compilers create so we don't have to have huge compiles and
can link them later.
Much few know what they include, and that is not because they are not very useful, but rather very complicated.
An object machine must off course have it's own object files, because:
- otherwise we'd have to express the object machine in c (nischt gut)
- we would be forced to read the source every time (slow)
- we would have no language independant format
And i was going to get there, juust not now. I mean i think it's a great idea to have many languages compile and run
on the same object machine. Not neccessarily my idea, but i haven't seen it pulled off. Not that i will.
I just want to be able to read my compiled code!!
And so this is a little start, just some outputter.
#### Direction
The way this is meant to go (planned for 2020+) was a salama core with only a sof parser (as that is soo much simpler).
Then to_ruby for all the ast classes to be able to roundtrip ruby code.
Then go to storing sof in git, rather than ruby.
Then write a python/java parser and respective runtime conversion. Extracting common features. With the respective
to_python on the ast's to roundtrip that too. Have to since by now we work on sof's. Etc . ..

3
lib/sof/all.rb Normal file
View File

@ -0,0 +1,3 @@
require_relative "members"
require_relative "array"
require_relative "occurence"

8
lib/sof/array.rb Normal file
View File

@ -0,0 +1,8 @@
Array.class_eval do
def attributes
[]
end
def to_sof
""
end
end

53
lib/sof/members.rb Normal file
View File

@ -0,0 +1,53 @@
module Sof
class Members
def initialize root
@root = root
@counter = 1
@objects = {}
add(root ,0 )
end
def add object , level
if( @objects.has_key?(object) )
occurence = @objects.get(object)
occurence.level = level if occurence.level > level
else
o = Occurence.new( object , @counter , level )
@objects[object] = o
c = @counter
@counter = @counter + 1
object.attributes.each do a
val = object.send a
add(val , level + 1)
end
end
end
def write
string = ""
output string , @root
end
def output string , object
occurence = @objects[object]
indent = " " * occurence.level
string += indent
if(object.respond_to? :to_sof)
string += object.to_sof + "\n"
else
string += "!" + object.class.name + "\n"
indent += " "
object.attributes.each do a
val = object.send a
output( string , val)
end
end
end
def self.write object
members = Members.new object
members.write
end
end
end

13
lib/sof/occurence.rb Normal file
View File

@ -0,0 +1,13 @@
module Sof
class Occurence
def initialize object , level , number
@number = number
@object = object
@level = level
end
attr_reader :object , :number
attr_accessor :level
end
end