change type to class name

although int is still allowed for integers (gets replaced though)
This commit is contained in:
Torsten Ruger 2015-10-14 15:48:53 +03:00
parent 1b2802ecf4
commit ab0a94bd51
24 changed files with 79 additions and 70 deletions

View File

@ -36,7 +36,7 @@ module Parser
rule(:digit) { match('[0-9]') } rule(:digit) { match('[0-9]') }
rule(:exponent) { (str('e')| str('E')) } rule(:exponent) { (str('e')| str('E')) }
rule(:type) { (str("int") | str("ref")).as(:type) >> space } rule(:type) { (str("int") | class_name).as(:type) >> space }
# identifier must start with lower case # identifier must start with lower case
# TODO rule forbit names like true_statements, because it starts with a keyword. a little looser please! # TODO rule forbit names like true_statements, because it starts with a keyword. a little looser please!
rule(:name) { (keyword|type).absent? >> (match['a-z_'] >> match['a-zA-Z0-9_'].repeat).as(:name) >> space? } rule(:name) { (keyword|type).absent? >> (match['a-z_'] >> match['a-zA-Z0-9_'].repeat).as(:name) >> space? }

View File

@ -1,7 +1,17 @@
#include is private in 1.9, who'd have known without travis #include is private in 1.9, who'd have known without travis
Parslet::Context.send :include , AST::Sexp Parslet::Context.send :include , AST::Sexp
Parslet::Context.class_eval do
def type_sym t
if( t.is_a? AST::Node )
t = t.children.first
else
t = t.to_sym
t = :Integer if t == :int
end
t
end
end
module Parser module Parser
class Transform < Parslet::Transform class Transform < Parslet::Transform
@ -15,14 +25,14 @@ module Parser
rule(:integer => simple(:value)) { s(:int ,value.to_i) } rule(:integer => simple(:value)) { s(:int ,value.to_i) }
rule(:name => simple(:name)) { s(:name , name.to_sym) } rule(:name => simple(:name)) { s(:name , name.to_sym) }
# local variables # local variables
rule(:type => simple(:type), :name => simple(:name)) { s(:field_def , type.to_sym , name.to_sym) } rule(:type => simple(:type), :name => simple(:name)) { s(:field_def , type_sym(type) , name.to_sym) }
rule(:type => simple(:type), :name => simple(:name) , :value => simple(:value)) { rule(:type => simple(:type), :name => simple(:name) , :value => simple(:value)) {
s(:field_def , type.to_sym , name.to_sym , value ) } s(:field_def , type_sym(type) , name.to_sym , value ) }
# class field # class field
rule(:field => simple(:field) , :type => simple(:type), :name => simple(:name)) { rule(:field => simple(:field) , :type => simple(:type), :name => simple(:name)) {
s(:class_field , type.to_sym , name.to_sym) } s(:class_field , type_sym(type) , name.to_sym) }
rule(:field => simple(:field) , :type => simple(:type), :name => simple(:name) , :value => simple(:value)) { rule(:field => simple(:field) , :type => simple(:type), :name => simple(:name) , :value => simple(:value)) {
s(:class_field , type.to_sym , name.to_sym , value ) } s(:class_field , type_sym(type) , name.to_sym , value ) }
rule(:l_value => simple(:l_value) , :assign => simple(:assign) , :r_value => simple(:r_value)) { rule(:l_value => simple(:l_value) , :assign => simple(:assign) , :r_value => simple(:r_value)) {
s(:assignment , l_value , r_value) s(:assignment , l_value , r_value)
@ -82,7 +92,7 @@ module Parser
:function_name => simple(:function_name), :function_name => simple(:function_name),
:parameter_list => sequence(:parameter_list), :parameter_list => sequence(:parameter_list),
:statements => sequence(:statements) , :end => simple(:e)) do :statements => sequence(:statements) , :end => simple(:e)) do
s(:function, type.to_sym , function_name, s(:parameters , *parameter_list ), s(:function, type_sym(type) , function_name, s(:parameters , *parameter_list ),
s(:statements , *statements)) s(:statements , *statements))
end end
@ -91,7 +101,7 @@ module Parser
:function_name => simple(:function_name), :function_name => simple(:function_name),
:parameter_list => sequence(:parameter_list), :parameter_list => sequence(:parameter_list),
:statements => sequence(:statements) , :end => simple(:e)) do :statements => sequence(:statements) , :end => simple(:e)) do
s(:function, type.to_sym , function_name, s(:parameters , *parameter_list ), s(:function, type_sym(type) , function_name, s(:parameters , *parameter_list ),
s(:statements , *statements) , s(:receiver , *receiver)) s(:statements , *statements) , s(:receiver , *receiver))
end end

View File

@ -1,6 +1,6 @@
class String class String
ref self.new_string(int len ) String self.new_string(int len )
len = len << 2 len = len << 2
return super.new_object( len) return super.new_object( len)
end end
@ -9,7 +9,7 @@ class String
return self.length return self.length
end end
int plus(ref str) int plus(String str)
my_length = self.length my_length = self.length
str_len = str.length() str_len = str.length()
my_length = str_len + my_length my_length = str_len + my_length
@ -36,10 +36,10 @@ s(:statements,
s(:class, :String, s(:class, :String,
s(:derives, nil), s(:derives, nil),
s(:statements, s(:statements,
s(:function, :ref, s(:function, :String,
s(:name, :new_string), s(:name, :new_string),
s(:parameters, s(:parameters,
s(:parameter, :int, :len)), s(:parameter, :Integer, :len)),
s(:statements, s(:statements,
s(:assignment, s(:assignment,
s(:name, :len), s(:name, :len),
@ -54,7 +54,7 @@ s(:statements,
s(:receiver, s(:receiver,
s(:name, :super))))), s(:name, :super))))),
s(:receiver, :self)), s(:receiver, :self)),
s(:function, :int, s(:function, :Integer,
s(:name, :length), s(:name, :length),
s(:parameters), s(:parameters),
s(:statements, s(:statements,
@ -64,10 +64,10 @@ s(:statements,
s(:name, :self)), s(:name, :self)),
s(:field, s(:field,
s(:name, :length)))))), s(:name, :length)))))),
s(:function, :int, s(:function, :Integer,
s(:name, :plus), s(:name, :plus),
s(:parameters, s(:parameters,
s(:parameter, :ref, :str)), s(:parameter, :String, :str)),
s(:statements, s(:statements,
s(:assignment, s(:assignment,
s(:name, :my_length), s(:name, :my_length),

View File

@ -9,9 +9,9 @@ s(:statements,
s(:class, :Foo, s(:class, :Foo,
s(:derives, :Object), s(:derives, :Object),
s(:statements, s(:statements,
s(:class_field, :int, :fff, s(:class_field, :Integer, :fff,
s(:int, 3)), s(:int, 3)),
s(:function, :int, s(:function, :Integer,
s(:name, :func), s(:name, :func),
s(:parameters), s(:parameters),
s(:statements, s(:statements,

View File

@ -1,6 +1,6 @@
class Pifi class Pifi
int self.ofthen(int n , ref m) int self.ofthen(int n , Object m)
n = n + m.index n = n + m.index
return n return n
end end
@ -10,11 +10,11 @@ s(:statements,
s(:class, :Pifi, s(:class, :Pifi,
s(:derives, nil), s(:derives, nil),
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :ofthen), s(:name, :ofthen),
s(:parameters, s(:parameters,
s(:parameter, :int, :n), s(:parameter, :Integer, :n),
s(:parameter, :ref, :m)), s(:parameter, :Object, :m)),
s(:statements, s(:statements,
s(:assignment, s(:assignment,
s(:name, :n), s(:name, :n),

View File

@ -12,10 +12,10 @@ s(:statements,
s(:class, :Ifi, s(:class, :Ifi,
s(:derives, nil), s(:derives, nil),
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :ofthen), s(:name, :ofthen),
s(:parameters, s(:parameters,
s(:parameter, :int, :n)), s(:parameter, :Integer, :n)),
s(:statements, s(:statements,
s(:if_statement, s(:if_statement,
s(:condition, s(:condition,

View File

@ -8,7 +8,7 @@ s(:statements,
s(:class, :Foo, s(:class, :Foo,
s(:derives, :Object), s(:derives, :Object),
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :test), s(:name, :test),
s(:parameters), s(:parameters),
s(:statements, s(:statements,

View File

@ -9,12 +9,12 @@ s(:statements,
s(:class, :Opers, s(:class, :Opers,
s(:derives, nil), s(:derives, nil),
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :foo), s(:name, :foo),
s(:parameters, s(:parameters,
s(:parameter, :int, :x)), s(:parameter, :Integer, :x)),
s(:statements, s(:statements,
s(:field_def, :int, :abba, s(:field_def, :Integer, :abba,
s(:int, 5)), s(:int, 5)),
s(:return, s(:return,
s(:operator_value, :+, s(:operator_value, :+,

View File

@ -6,4 +6,4 @@ s(:statements,
s(:class, :Foo, s(:class, :Foo,
s(:derives, nil), s(:derives, nil),
s(:statements, s(:statements,
s(:class_field, :int, :x)))) s(:class_field, :Integer, :x))))

View File

@ -1,12 +1,12 @@
int self.length( ref x ) int self.length( Object x )
return 5 return 5
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :length), s(:name, :length),
s(:parameters, s(:parameters,
s(:parameter, :ref, :x)), s(:parameter, :Object, :x)),
s(:statements, s(:statements,
s(:return, s(:return,
s(:int, 5))), s(:int, 5))),

View File

@ -11,10 +11,10 @@ int fibonaccit(int n)
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :fibonaccit), s(:name, :fibonaccit),
s(:parameters, s(:parameters,
s(:parameter, :int, :n)), s(:parameter, :Integer, :n)),
s(:statements, s(:statements,
s(:assignment, s(:assignment,
s(:name, :a), s(:name, :a),

View File

@ -4,12 +4,12 @@ int foo(int x)
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :foo), s(:name, :foo),
s(:parameters, s(:parameters,
s(:parameter, :int, :x)), s(:parameter, :Integer, :x)),
s(:statements, s(:statements,
s(:field_def, :int, :a, s(:field_def, :Integer, :a,
s(:int, 5)), s(:int, 5)),
s(:return, s(:return,
s(:name, :a))))) s(:name, :a)))))

View File

@ -1,4 +1,4 @@
ref ofthen(int n) int ofthen(int n)
if(0) if(0)
isit = 42 isit = 42
else else
@ -7,10 +7,10 @@ ref ofthen(int n)
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :ref, s(:function, :Integer,
s(:name, :ofthen), s(:name, :ofthen),
s(:parameters, s(:parameters,
s(:parameter, :int, :n)), s(:parameter, :Integer, :n)),
s(:statements, s(:statements,
s(:if_statement, s(:if_statement,
s(:condition, s(:condition,

View File

@ -3,7 +3,7 @@ int foo()
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :foo), s(:name, :foo),
s(:parameters), s(:parameters),
s(:statements, s(:statements,

View File

@ -4,12 +4,12 @@ int foo(int x)
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :foo), s(:name, :foo),
s(:parameters, s(:parameters,
s(:parameter, :int, :x)), s(:parameter, :Integer, :x)),
s(:statements, s(:statements,
s(:field_def, :int, :abba, s(:field_def, :Integer, :abba,
s(:int, 5)), s(:int, 5)),
s(:assignment, s(:assignment,
s(:name, :abba), s(:name, :abba),

View File

@ -1,15 +1,15 @@
int retvar(ref n) int retvar(Object n)
int i = n.layout int i = n.layout
return i return i
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :retvar), s(:name, :retvar),
s(:parameters, s(:parameters,
s(:parameter, :ref, :n)), s(:parameter, :Object, :n)),
s(:statements, s(:statements,
s(:field_def, :int, :i, s(:field_def, :Integer, :i,
s(:field_access, s(:field_access,
s(:receiver, s(:receiver,
s(:name, :n)), s(:name, :n)),

View File

@ -7,10 +7,10 @@ int retvar(int n)
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :retvar), s(:name, :retvar),
s(:parameters, s(:parameters,
s(:parameter, :int, :n)), s(:parameter, :Integer, :n)),
s(:statements, s(:statements,
s(:if_statement, s(:if_statement,
s(:condition, s(:condition,

View File

@ -6,10 +6,10 @@ int retvar(int n )
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :retvar), s(:name, :retvar),
s(:parameters, s(:parameters,
s(:parameter, :int, :n)), s(:parameter, :Integer, :n)),
s(:statements, s(:statements,
s(:while_statement, s(:while_statement,
s(:condition, s(:condition,

View File

@ -1,13 +1,13 @@
int foo( int n ,ref m) int foo( int n ,String m)
return n return n
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :foo), s(:name, :foo),
s(:parameters, s(:parameters,
s(:parameter, :int, :n), s(:parameter, :Integer, :n),
s(:parameter, :ref, :m)), s(:parameter, :String, :m)),
s(:statements, s(:statements,
s(:return, s(:return,
s(:name, :n))))) s(:name, :n)))))

View File

@ -1,4 +1,4 @@
ref fibonaccit(int n) Biggie fibonaccit(int n)
a = 0 a = 0
while(n) while(n)
some = 43 some = 43
@ -7,10 +7,10 @@ ref fibonaccit(int n)
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :ref, s(:function, :Biggie,
s(:name, :fibonaccit), s(:name, :fibonaccit),
s(:parameters, s(:parameters,
s(:parameter, :int, :n)), s(:parameter, :Integer, :n)),
s(:statements, s(:statements,
s(:assignment, s(:assignment,
s(:name, :a), s(:name, :a),

View File

@ -1,12 +1,12 @@
int foo(ref x) int foo(Class x)
a = 1 a = 1
end end
-- -- -- -- -- --
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :foo), s(:name, :foo),
s(:parameters, s(:parameters,
s(:parameter, :ref, :x)), s(:parameter, :Class, :x)),
s(:statements, s(:statements,
s(:assignment, s(:assignment,
s(:name, :a), s(:name, :a),

View File

@ -9,7 +9,7 @@ s(:statements,
s(:class, :FooBo, s(:class, :FooBo,
s(:derives, nil), s(:derives, nil),
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :main), s(:name, :main),
s(:parameters), s(:parameters),
s(:statements, s(:statements,

View File

@ -1,10 +1,9 @@
class Object class Object
int foo(ref x) int foo(String x)
a = 5 a = 5
end end
end end
class Other < Object class Other < Object
int foo() int foo()
foo( 3 ) foo( 3 )
end end
@ -14,10 +13,10 @@ s(:statements,
s(:class, :Object, s(:class, :Object,
s(:derives, nil), s(:derives, nil),
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :foo), s(:name, :foo),
s(:parameters, s(:parameters,
s(:parameter, :ref, :x)), s(:parameter, :String, :x)),
s(:statements, s(:statements,
s(:assignment, s(:assignment,
s(:name, :a), s(:name, :a),
@ -25,7 +24,7 @@ s(:statements,
s(:class, :Other, s(:class, :Other,
s(:derives, :Object), s(:derives, :Object),
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :foo), s(:name, :foo),
s(:parameters), s(:parameters),
s(:statements, s(:statements,

View File

@ -20,10 +20,10 @@ s(:statements,
s(:class, :Object, s(:class, :Object,
s(:derives, nil), s(:derives, nil),
s(:statements, s(:statements,
s(:function, :int, s(:function, :Integer,
s(:name, :fibonaccit), s(:name, :fibonaccit),
s(:parameters, s(:parameters,
s(:parameter, :int, :n)), s(:parameter, :Integer, :n)),
s(:statements, s(:statements,
s(:assignment, s(:assignment,
s(:name, :a), s(:name, :a),
@ -57,7 +57,7 @@ s(:statements,
s(:operator_value, :-, s(:operator_value, :-,
s(:name, :n), s(:name, :n),
s(:int, 1))))))), s(:int, 1))))))),
s(:function, :int, s(:function, :Integer,
s(:name, :main), s(:name, :main),
s(:parameters), s(:parameters),
s(:statements, s(:statements,