p-lang 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/test/helper.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'p-lang'
8
+
9
+ class Test::Unit::TestCase
10
+ end
@@ -0,0 +1,26 @@
1
+ require 'helper'
2
+
3
+ class TestParser < Test::Unit::TestCase
4
+
5
+ EXPRESSIONS = File.readlines(File.join(File.dirname(__FILE__), "test_parser_ok.txt"))
6
+ BUILT_EXPRESSIONS = File.readlines(File.join(File.dirname(__FILE__), "test_parser_build.txt"))
7
+
8
+ context "The PLangParser" do
9
+ setup do
10
+ @parser = PLangParser.new
11
+ end
12
+
13
+ EXPRESSIONS.each_with_index do |expr, i|
14
+ should "parse the expression ##{i}" do
15
+ assert @parser.parse expr
16
+ end
17
+ end
18
+
19
+ EXPRESSIONS.each_with_index do |expr, i|
20
+ should "build the expression ##{i}" do
21
+ assert_equal eval(BUILT_EXPRESSIONS[i]), @parser.parse(expr).build.collect(&:to_sexp)
22
+ end
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,72 @@
1
+ [[:+, [:literal, :integer, 1], [:literal, :integer, 2]]]
2
+ [[:+,[:literal, :integer, 1],[:+, [:literal, :integer, 2], [:literal, :integer, 3]]]]
3
+ [[:*, [:literal, :integer, 4], [:literal, :integer, 5]]]
4
+ [[:/, [:literal, :integer, 4], [:literal, :integer, 2]]]
5
+ [[:%, [:literal, :integer, 5], [:literal, :integer, 3]]]
6
+ [[:+,[:literal, :integer, 1],[:*,[:literal, :integer, 2],[:/, [:literal, :integer, 3], [:literal, :integer, 5]]]]]
7
+ [[:*,[:+,[:literal, :integer, 1],[:literal, :integer, 6]],[:literal, :integer, 5]]]
8
+ [[:+,[:literal, :integer, 1],[:/,[:*, [:literal, :integer, 2], [:literal, :integer, 3]],[:-, [:literal, :integer, 5], [:literal, :integer, 1]]]]]
9
+ [[:+, [:literal, :decimal, 1.3],[:*,[:literal, :integer, 5],[:+, [:literal, :integer, 1], [:literal, :decimal, 1.568]]]]]
10
+ [[:id, :xyz]]
11
+ [[:>, [:literal, :integer, 1], [:literal, :integer, 2]]]
12
+ [[:>=, [:id, :x], [:literal, :integer, 1]]]
13
+ [[:<=, [:literal, :integer, 2], [:id, :b]]]
14
+ [[:==, [:literal, :integer, 4], [:literal, :integer, 1]]]
15
+ [[:<, [:literal, :integer, 2], [:id, :x]]]
16
+ [[:object, :obj, []]]
17
+ [[:object, :obj, [[:literal, :integer, 1], [:literal, :integer, 2], [:literal, :integer, 3]]]]
18
+ [[:object,:obj,[[:+, [:literal, :integer, 1], [:literal, :integer, 2]], [:id, :x]]]]
19
+ [[:object, :obj, [[:literal, :integer, 1], [:literal, :integer, 2]]]]
20
+ [[:object, :obj, [[:id, :x], [:literal, :integer, 2], [:object, :other, []]]]]
21
+ [[:object, :obj, [[:literal, :integer, 1]]]]
22
+ [[:literal, :string, "teste"]]
23
+ [[:literal, :char, "a"]]
24
+ [[:if,[:>, [:id, :x], [:literal, :integer, 1]],[:literal, :string, "verdadeiro"],[:literal, :string, "falso"]]]
25
+ [[:begin,[[:+,[:literal, :integer, 1],[:+, [:literal, :integer, 2], [:literal, :integer, 3]]],[:literal, :string, "oi"],[:<, [:literal, :integer, 2], [:literal, :integer, 3]],[:literal, :char, "a"]]]]
26
+ [[:-,[:call, [:id, :sin], [[:*, [:literal, :integer, 2], [:id, :pi]]]],[:call, [:id, :cos], [[:*, [:literal, :integer, 2], [:id, :pi]]]]]]
27
+ [[:call, [:id, :f], []]]
28
+ [[:let, [:id, :x], [:literal, :integer, 1]]]
29
+ [[:let,[:id, :x],[:+,[:literal, :integer, 1],[:+,[:literal, :integer, 2],[:+, [:literal, :integer, 3], [:literal, :integer, 4]]]]]]
30
+ [[:let,[:id, :y],[:+,[:literal, :integer, 1],[:*, [:literal, :integer, 2], [:/, [:id, :x], [:literal, :integer, 2]]]]]]
31
+ [[:let, [:id, :str], [:literal, :string, "string"]]]
32
+ [[:let,[:id, :p1],[:call, [:id, :point], [[:literal, :integer, 1], [:literal, :integer, 2]]]]]
33
+ [[:let,[:object, :obj, [[:id, :x]]],[:object, :obj, [[:literal, :integer, 1]]]]]
34
+ [[:let, [:object, :obj, [[:id, :x], [:id, :t]]], [:id, :obj]]]
35
+ [[:lambda, [[:id, :x]], [:id, :x], [],nil]]
36
+ [[:lambda, [[:id, :x],[:id, :y]], [:+, [:id, :x], [:id, :y]], [],nil]]
37
+ [[:lambda,[[:literal, :integer, 1],[:literal, :integer, 2],[:id, :x],[:object, :obj, [[:id, :x], [:id, :y]]]],[:literal, :integer, 1],[],nil]]
38
+ [[:lambda,[[:id, :x]],[:id, :y],[[:let,[:id, :y],[:lambda, [[:id, :x]], [:+, [:id, :x], [:literal, :integer, 6]], [],nil]]],nil]]
39
+ [[:lambda,[[:id, :x]],[:id, :y],[[:let,[:id, :y],[:lambda, [[:id, :x]], [:+, [:id, :x], [:literal, :integer, 6]], [], nil]],[:let,[:id, :z],[:lambda,[[:id, :x]],[:-, [:id, :x], [:literal, :integer, 6]],[],nil]],[:let, [:id, :k], [:literal, :integer, 1]]],nil]]
40
+ [[:let, [:id, :x], [:lambda, [], [:literal, :integer, 1], [],nil]]]
41
+ [[:let,[:id, :fibonacci],[:lambda,[[:literal, :integer, 1]],[:literal, :integer, 1],[],[:lambda,[[:literal, :integer, 2]],[:literal, :integer, 1],[],[:lambda,[[:id, :n]],[:+,[:call, [:id, :fibonacci], [[:-, [:id, :n], [:literal, :integer, 1]]]],[:call, [:id, :fibonacci], [[:-, [:id, :n], [:literal, :integer, 2]]]]],[],nil]]]]]
42
+ [[:let,[:id, :str_list],[:object,:list,[[:literal, :char, "s"],[:object,:list,[[:literal, :char, "t"],[:object,:list,[[:literal, :char, "r"],[:object,:list,[[:literal, :char, "i"],[:object,:list,[[:literal, :char, "n"],[:object,:list,[[:literal, :char, "g"], [:object, :list, []]]]]]]]]]]]]]]]
43
+ [[:let,[:id, :point],[:lambda,[[:id, :x], [:id, :y]],[:object, :point, [[:id, :x], [:id, :y]]],[],nil]]]
44
+ [[:let,[:id, :point_x],[:lambda, [[:object, :point, [[:id, :x], [:id, :y]]]], [:id, :x], [],nil]]]
45
+ [[:let,[:id, :point_y],[:lambda, [[:object, :point, [[:id, :x], [:id, :y]]]], [:id, :y], [],nil]]]
46
+ [[:let,[:id, :point_sum],[:lambda,[[:object, :point, [[:id, :x1], [:id, :y1]]],[:object, :point, [[:id, :x2], [:id, :y2]]]],[:object,:point,[[:+, [:id, :x1], [:id, :x2]], [:+, [:id, :y1], [:id, :y2]]]],[],nil]]]
47
+ [[:let,[:id, :sum],[:lambda, [[:id, :a], [:id, :b]], [:+, [:id, :a], [:id, :b]], [], nil]]]
48
+ [[:let,[:id, :f],[:lambda,[[:id, :x]],[:begin,[[:let, [:id, :algo], [:id, :x]],[:*, [:id, :algo], [:id, :algo]],[:id, :algo]]],[], nil]]]
49
+ [[:let,[:id, :f],[:lambda,[[:id, :x]],[:+, [:call, [:id, :f], [[:id, :x]]], [:call, [:id, :g], [[:id, :x]]]],[[:let,[:id, :f],[:lambda, [[:id, :x]], [:*, [:id, :x], [:id, :x]], [], nil]],[:let,[:id, :g],[:lambda,[[:id, :x]],[:/, [:id, :x], [:literal, :integer, 2]],[],nil]]],nil]]]
50
+ [[:let,[:id, :f],[:lambda,[[:id, :x]],[:id, :y],[[:let, [:id, :y], [:*, [:literal, :integer, 2], [:id, :x]]]], nil]]]
51
+ [[:object_call, [:id, :p], [:id, :x]]]
52
+ [[:call,[:object_call, [:id, :p], [:id, :x]],[[:id, :p], [:literal, :integer, 1]]]]
53
+ [[:call, [:object_call, [:id, :p], [:id, :x]], [[:id, :p]]]]
54
+ [[:call,[:object_call, [:call, [:id, :f], [[:literal, :integer, 1]]], [:id, :algo]],[[:call, [:id, :f], [[:literal, :integer, 1]]], [:literal, :integer, 1]]]]
55
+ [[:call, [:object_call, [:id, :x], [:id, :algo]], [[:id, :x]]]]
56
+ [[:call,[:object_call, [:literal, :integer, 10], [:id, :algo]],[[:literal, :integer, 10],[:literal, :integer, 1],[:literal, :integer, 2],[:literal, :integer, 3]]]]
57
+ [[:call,[:object_call,[:object, :algo, [[:literal, :integer, 1], [:literal, :integer, 2]]],[:id, :algo]],[[:object, :algo, [[:literal, :integer, 1], [:literal, :integer, 2]]]]]]
58
+ [[:call,[:object_call, [:object, :algo, [[:id, :x], [:id, :y]]], [:id, :x]],[[:object, :algo, [[:id, :x], [:id, :y]]]]]]
59
+ [[:object_let,[:object, :point, [[:id, :x], [:id, :y]]],[:id, :x],[:lambda, [[:id, :x]], [:id, :x], [], nil]]]
60
+ [[:object_let,[:object, :aaaa, [[:id, :x], [:id, :y]]],[:id, :a],[:lambda, [], [:id, :x], [[:let, [:id, :x], [:literal, :integer, 1]]], nil]]]
61
+ [[:object_let,[:object, :aaaa, [[:id, :x], [:id, :y]]],[:id, :algo],[:lambda,[[:id, :x]],[:id, :y],[[:let,[:id, :y],[:lambda, [[:id, :x]], [:+, [:id, :x], [:literal, :integer, 6]], [], nil]]], nil]]]
62
+ [[:object_let,[:object, :algo, [[:id, :x], [:id, :y]]],[:id, :algo],[:lambda, [[:id, :x]], [:id, :x], [], nil]]]
63
+ [[:object_let, [:object, :algo, []], [:id, :algo], [:literal, :integer, 1]]]
64
+ [[:literal, :boolean, :true]]
65
+ [[:literal, :boolean, :false]]
66
+ [[:let, [:id, :x], [:literal, :boolean, :true]]]
67
+ [[:if,[:literal, :boolean, :true],[:literal, :string, "sim"],[:literal, :string, "nao"]]]
68
+ [[:and, [:id, :x], [:id, :y]]]
69
+ [[:if,[:and, [:literal, :boolean, :true], [:literal, :boolean, :false]],[:literal, :integer, 1],[:literal, :integer, 2]]]
70
+ [[:if,[:or, [:and, [:id, :x], [:id, :y]], [:id, :z]],[:literal, :integer, 1],[:literal, :integer, 2]]]
71
+ [[:not, [:literal, :boolean, :true]]]
72
+ [[:let, [:id, :x], [:or, [:and, [:id, :x], [:id, :y]], [:not, [:id, :k]]]]]
@@ -0,0 +1,72 @@
1
+ 1+2
2
+ 1+2+3
3
+ 4*5
4
+ 4/2
5
+ 5%3
6
+ 1+2*3/5
7
+ (1+6)*5
8
+ 1+(2*3)/(5-1)
9
+ 1.3+5*(1+1.568)
10
+ xyz
11
+ 1>2
12
+ x>=1
13
+ 2<=b
14
+ 4==1
15
+ 2<x
16
+ {obj}
17
+ {obj: 1, 2, 3}
18
+ {obj: 1+2, x}
19
+ {obj: 1, 2}
20
+ {obj: x, 2, {other}}
21
+ {obj: 1}
22
+ "teste"
23
+ 'a'
24
+ if(x>1, "verdadeiro", "falso")
25
+ begin(1+2+3, "oi", 2<3, 'a')
26
+ sin(2*pi)-cos(2*pi)
27
+ f()
28
+ x = 1
29
+ x = 1+2+3+4
30
+ y = 1+2*x/2
31
+ str = "string"
32
+ p1 = point(1,2)
33
+ {obj: x} = {obj: 1}
34
+ {obj: x, t} = obj
35
+ [x|x]
36
+ [x,y| x+y]
37
+ [1, 2, x, {obj: x, y}| 1]
38
+ [x| y] : (y = [x| x+6])
39
+ [x| y] : (y = [x| x+6], z = [x| x-6], k=1)
40
+ x = [1]
41
+ fibonacci = [1| 1], [2| 1] , [n| fibonacci(n-1)+fibonacci(n-2)]
42
+ str_list = {list: 's', {list: 't', {list: 'r', {list: 'i', {list: 'n', {list: 'g', {list}}}}}}}
43
+ point = [x, y| {point: x, y}]
44
+ point_x = [{point: x, y}| x]
45
+ point_y = [{point: x, y}| y]
46
+ point_sum = [{point: x1, y1}, {point: x2, y2}| {point: x1+x2, y1+y2}]
47
+ sum = [ a, b| a + b]
48
+ f = [x| begin(algo=x, algo*algo, algo)]
49
+ f = [x| f(x) + g(x)] : (f = [x| x*x], g = [x| x/2])
50
+ f = [x| y] : (y = 2*x)
51
+ p->x
52
+ p->x(1)
53
+ p->x()
54
+ f(1)->algo(1)
55
+ x->algo()
56
+ 10->algo(1,2,3)
57
+ {algo: 1, 2} -> algo()
58
+ {algo: x, y} -> x()
59
+ {point: x, y} -> x = [x|x]
60
+ {aaaa: x, y}->a = [x] : (x = 1)
61
+ {aaaa: x, y} -> algo = [x| y] : (y = [x| x+6])
62
+ {algo: x, y}->algo = [x| x]
63
+ {algo} -> algo = 1
64
+ true
65
+ false
66
+ x = true
67
+ if(true, "sim", "nao")
68
+ x and y
69
+ if(true and false, 1, 2)
70
+ if((x and y) or z, 1, 2)
71
+ not true
72
+ x = (x and y) or (not k)
data/test/test_vm.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'helper'
2
+
3
+ class TestVM < Test::Unit::TestCase
4
+
5
+ PROGRAMS = File.readlines(File.join(File.dirname(__FILE__), "test_vm_programs.txt"))
6
+ RESULTS = File.readlines(File.join(File.dirname(__FILE__), "test_vm_results.txt"))
7
+
8
+ context "The VM" do
9
+ setup do
10
+ @parser = PLangParser.new
11
+ end
12
+
13
+ PROGRAMS.each_with_index do |program, i|
14
+ should "interp the program ##{i}" do
15
+ ast = @parser.parse(program)
16
+ vm = PLang::VM.new(ast.build.collect(&:to_sexp))
17
+ assert_equal eval(RESULTS[i]), vm.execute!.params[0]
18
+ end
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,37 @@
1
+ 1
2
+ 1+2
3
+ 4-7
4
+ 3*2
5
+ 6/2
6
+ 6.0-0.5
7
+ 5%2
8
+ 1>2
9
+ 1>=1
10
+ 3<1
11
+ 7<=0
12
+ (2>0) and (3<1)
13
+ true or false
14
+ x=1 x+2
15
+ x=1 y=2 x+y
16
+ soma = [a,b| a+b] soma(3,4)
17
+ soma = [a,b| a+b] soma(3,4)+10
18
+ soma = [a,b| sum] : (sum = a+b) soma(10,5)
19
+ fib = [1|1], [2|1], [n| fib(n-1)+fib(n-2)] fib(8)
20
+ x=1 y=2 f=[x| x+y] f(10)
21
+ if (true, 1, 2)
22
+ if (false, 1, 2)
23
+ begin(1,2,3,4)
24
+ {obj: x, y} = {obj: 1, 2} x+y
25
+ {obj: 5, 10, z} = {obj: 5, 10, 15} z
26
+ [{obj: 10, x}| x]({obj: 10, -5})
27
+ [{obj: {algo}, x}| x]({obj: {algo}, 13})
28
+ [{obj: {algo: 10}, x}| x]({obj: {algo: 10}, 1})
29
+ [{obj: {algo: x}, y}| x+y]({obj: {algo: 1}, 2})
30
+ [{obj: {algo: x}, y}, 1, z, {ok}| x+y+z]({obj: {algo: 1}, 2}, 1, 10, {ok})
31
+ [{ok}| 10]({ok})
32
+ {obj: 1, x} -> f = [x] {obj: 2, x} -> f = [x+1] a = {obj: 2, 20} a -> f()
33
+ {obj: 1, x} -> f = [x] {obj: 2, x} -> f = [x+1] a = {obj: 1, 20} a -> f()
34
+ {obj: x} -> f = [x-1] {obj: 1} -> f()
35
+ {obj: 1, 2, 3, x} -> f = [1+2+3+x] {obj: 1, 2, 3, 10}->f()
36
+ f = [_,x,_| x*2] f(1,2,3)
37
+ f = [{obj: {xxx: _}, x}, y| x+y] f({obj: {xxx: 1}, 2}, 3)
@@ -0,0 +1,37 @@
1
+ 1
2
+ 3
3
+ -3
4
+ 6
5
+ 3
6
+ 5.5
7
+ 1
8
+ false
9
+ true
10
+ false
11
+ false
12
+ false
13
+ true
14
+ 3
15
+ 3
16
+ 7
17
+ 17
18
+ 15
19
+ 21
20
+ 12
21
+ 1
22
+ 2
23
+ 4
24
+ 3
25
+ 15
26
+ -5
27
+ 13
28
+ 1
29
+ 3
30
+ 13
31
+ 10
32
+ 21
33
+ 20
34
+ 0
35
+ 16
36
+ 4
37
+ 5
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: p-lang
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Igor Bonadio
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-07-06 00:00:00 -03:00
19
+ default_executable: p-lang
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: treetop
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: shoulda
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :development
48
+ version_requirements: *id002
49
+ description: P programming language
50
+ email: igorbonadio@gmail.com
51
+ executables:
52
+ - p-lang
53
+ extensions: []
54
+
55
+ extra_rdoc_files:
56
+ - LICENSE
57
+ - README.rdoc
58
+ files:
59
+ - .document
60
+ - .gitignore
61
+ - LICENSE
62
+ - README.rdoc
63
+ - Rakefile
64
+ - VERSION.yml
65
+ - bin/p-lang
66
+ - lib/p-lang.rb
67
+ - lib/parser/ast.rb
68
+ - lib/parser/nodes.rb
69
+ - lib/parser/p-lang.treetop
70
+ - lib/vm/environment.rb
71
+ - lib/vm/pobject.rb
72
+ - lib/vm/proc.rb
73
+ - lib/vm/std/io.rb
74
+ - lib/vm/vm.rb
75
+ - test/helper.rb
76
+ - test/test_parser.rb
77
+ - test/test_parser_build.txt
78
+ - test/test_parser_ok.txt
79
+ - test/test_vm.rb
80
+ - test/test_vm_programs.txt
81
+ - test/test_vm_results.txt
82
+ has_rdoc: true
83
+ homepage: http://github.com/igorbonadio/p-lang
84
+ licenses: []
85
+
86
+ post_install_message:
87
+ rdoc_options:
88
+ - --charset=UTF-8
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ hash: 3
97
+ segments:
98
+ - 0
99
+ version: "0"
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ requirements: []
110
+
111
+ rubyforge_project:
112
+ rubygems_version: 1.3.7
113
+ signing_key:
114
+ specification_version: 3
115
+ summary: P programming language
116
+ test_files:
117
+ - test/helper.rb
118
+ - test/test_parser.rb
119
+ - test/test_vm.rb