p-lang 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,34 @@
1
+ :id
2
+ :integer
3
+ :break
4
+ :string
5
+ :char
6
+ :lsquare
7
+ :rsquare
8
+ :lround
9
+ :rround
10
+ :lcurly
11
+ :rcurly
12
+ :comma
13
+ :pipe
14
+ :colon
15
+ :sub
16
+ :arrow
17
+ :add
18
+ :mul
19
+ :div
20
+ :mod
21
+ :let
22
+ :equal
23
+ :diff
24
+ :major
25
+ :major_equal
26
+ :minor
27
+ :minor_equal
28
+ :and
29
+ :or
30
+ :not
31
+ :true
32
+ :false
33
+ :nil
34
+ :begin
@@ -1,24 +1,32 @@
1
1
  1+2
2
+ 1-2
3
+ 1*2
4
+ 1/2
5
+ 1%2
2
6
  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
7
+ 1*2/3
8
+ 1-2%3
9
+ 1-(1*2)+((2-3)*4)
11
10
  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}
11
+ 1<2
12
+ 1>=2
13
+ 1<=2
14
+ 1==2
15
+ 1!=2
16
+ (1>2) and (1<2)
17
+ (1>2) or (1<2)
18
+ not ((1>2) and (1<2))
19
+ '(1,2,3+4)
20
+ begin(x=1, y=x+1)
21
+ fib = [1|1]; [2|1]; [n| fib(n-1) + fib(n-2)]
22
+ fib(10)
23
+ x->aaa()
24
+ f()->aaa()
25
+ f = [12+n] : (n=123)
26
+ {aaaa: 1,2,3}
27
+ {aaaa: 1,2,3}->aaaa()
28
+ {aaaa: 1,2,3}->aaaa() + f(1,2,3) - 1->next()
20
29
  {obj: x, 2, {other}}
21
- {obj: 1}
22
30
  "teste"
23
31
  'a'
24
32
  if(x>1, "verdadeiro", "falso")
@@ -36,10 +44,8 @@ p1 = point(1,2)
36
44
  [x,y| x+y]
37
45
  [1, 2, x, {obj: x, y}| 1]
38
46
  [x| y] : (y = [x| x+6])
39
- [x| y] : (y = [x| x+6], z = [x| x-6], k=1)
47
+ [x| y] : (y = [x| x+6], z = [x| x-6])
40
48
  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
49
  point = [x, y| {point: x, y}]
44
50
  point_x = [{point: x, y}| x]
45
51
  point_y = [{point: x, y}| y]
@@ -63,10 +69,3 @@ x->algo()
63
69
  {algo} -> algo = 1
64
70
  true
65
71
  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_parser.rb CHANGED
@@ -2,25 +2,18 @@ require 'helper'
2
2
 
3
3
  class TestParser < Test::Unit::TestCase
4
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"))
5
+ EXPRESSIONS = File.readlines(File.join(File.dirname(__FILE__), "test_parser"))
6
+ BUILD = File.readlines(File.join(File.dirname(__FILE__), "test_parser_build"))
7
7
 
8
- context "The PLangParser" do
9
- setup do
10
- @parser = PLangParser.new
11
- end
8
+ context "The Parser" do
12
9
 
13
10
  EXPRESSIONS.each_with_index do |expr, i|
11
+ parser = PLang::Parser::SyntaxAnalyser.new(EXPRESSIONS[i])
14
12
  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)
13
+ assert_equal eval(parser.parse.inspect), eval(BUILD[i])
22
14
  end
23
15
  end
16
+
24
17
  end
25
18
 
26
19
  end
@@ -0,0 +1,73 @@
1
+ [[:add, [:integer, 1], [:integer, 2]]]
2
+ [[:sub, [:integer, 1], [:integer, 2]]]
3
+ [[:mul, [:integer, 1], [:integer, 2]]]
4
+ [[:div, [:integer, 1], [:integer, 2]]]
5
+ [[:mod, [:integer, 1], [:integer, 2]]]
6
+ [[:add,[:add, [:integer, 1], [:integer, 2]],[:integer, 3]]]
7
+ [[:div,[:mul, [:integer, 1], [:integer, 2]],[:integer, 3]]]
8
+ [[:mod,[:sub, [:integer, 1], [:integer, 2]],[:integer, 3]]]
9
+ [[:add,[:sub,[:integer, 1],[:mul, [:integer, 1], [:integer, 2]]],[:mul,[:sub, [:integer, 2], [:integer, 3]],[:integer, 4]]]]
10
+ [[:major, [:integer, 1], [:integer, 2]]]
11
+ [[:minor, [:integer, 1], [:integer, 2]]]
12
+ [[:major_equal, [:integer, 1], [:integer, 2]]]
13
+ [[:minor_equal, [:integer, 1], [:integer, 2]]]
14
+ [[:equal, [:integer, 1], [:integer, 2]]]
15
+ [[:diff, [:integer, 1], [:integer, 2]]]
16
+ [[:and,[:major, [:integer, 1], [:integer, 2]],[:minor, [:integer, 1], [:integer, 2]]]]
17
+ [[:or,[:major, [:integer, 1], [:integer, 2]],[:minor, [:integer, 1], [:integer, 2]]]]
18
+ [[:not,[:and,[:major, [:integer, 1], [:integer, 2]],[:minor, [:integer, 1], [:integer, 2]]]]]
19
+ [[:list,[[:integer, 1],[:integer, 2],[:add, [:integer, 3], [:integer, 4]]]]]
20
+ [[:begin,[[:let, [:id, :x], [:integer, 1]],[:let, [:id, :y], [:add, [:id, :x], [:integer, 1]]]]]]
21
+ [[:let,[:id, :fib],[:lambda,[[:integer, 1]],[:integer, 1],[],[:lambda,[[:integer, 2]],[:integer, 1],[],[:lambda,[[:id, :n]],[:add,[:call, [:id, :fib], [[:sub, [:id, :n], [:integer, 1]]]],[:call, [:id, :fib], [[:sub, [:id, :n], [:integer, 2]]]]],[],nil]]]]]
22
+ [[:call, [:id, :fib], [[:integer, 10]]]]
23
+ [[:call, [:object_message, [:id, :x], [:id, :aaa]], []]]
24
+ [[:call, [:object_message, [:call, [:id, :f], []], [:id, :aaa]], []]]
25
+ [[:let,[:id, :f],[:lambda,[],[:add, [:integer, 12], [:id, :n]],[[:let, [:id, :n], [:integer, 123]]],nil]]]
26
+ [[:object,[:id,:aaaa],[[:integer, 1], [:integer, 2], [:integer, 3]]]]
27
+ [[:call,[:object_message,[:object,[:id,:aaaa],[[:integer, 1],[:integer, 2],[:integer, 3]]],[:id, :aaaa]],[]]]
28
+ [[:sub,[:add,[:call,[:object_message,[:object,[:id,:aaaa],[[:integer, 1],[:integer, 2],[:integer, 3]]],[:id, :aaaa]],[]],[:call,[:id, :f],[[:integer, 1],[:integer, 2],[:integer, 3]]]],[:call, [:object_message, [:integer, 1], [:id, :next]], []]]]
29
+ [[:object,[:id, :obj],[[:id, :x], [:integer, 2], [:object, [:id, :other], []]]]]
30
+ [[:string, "teste"]]
31
+ [[:char, "a"]]
32
+ [[:if,[:major, [:id, :x], [:integer, 1]],[:string, "verdadeiro"],[:string, "falso"]]]
33
+ [[:begin,[[:add, [:add, [:integer, 1], [:integer, 2]], [:integer, 3]],[:string, "oi"],[:minor, [:integer, 2], [:integer, 3]],[:char, "a"]]]]
34
+ [[:sub,[:call, [:id, :sin], [[:mul, [:integer, 2], [:id, :pi]]]],[:call, [:id, :cos], [[:mul, [:integer, 2], [:id, :pi]]]]]]
35
+ [[:call, [:id, :f], []]]
36
+ [[:let, [:id, :x], [:integer, 1]]]
37
+ [[:let,[:id, :x],[:add,[:add, [:add, [:integer, 1], [:integer, 2]], [:integer, 3]],[:integer, 4]]]]
38
+ [[:let,[:id, :y],[:div,[:mul, [:add, [:integer, 1], [:integer, 2]], [:id, :x]],[:integer, 2]]]]
39
+ [[:let, [:id, :str], [:string, "string"]]]
40
+ [[:let, [:id, :p1], [:call, [:id, :point], [[:integer, 1], [:integer, 2]]]]]
41
+ [[:let, [:object, [:id,:obj], [[:id, :x]]], [:object, [:id,:obj], [[:integer, 1]]]]]
42
+ [[:let, [:object, [:id,:obj], [[:id, :x], [:id, :t]]], [:id, :obj]]]
43
+ [[:lambda, [[:id, :x]], [:id, :x], [], nil]]
44
+ [[:lambda, [[:id, :x], [:id, :y]], [:add, [:id, :x], [:id, :y]], [], nil]]
45
+ [[:lambda,[[:integer, 1],[:integer, 2],[:id, :x],[:object, [:id,:obj], [[:id, :x], [:id, :y]]]],[:integer, 1],[],nil]]
46
+ [[:lambda,[[:id, :x]],[:id, :y],[[:let,[:id, :y],[:lambda, [[:id, :x]], [:add, [:id, :x], [:integer, 6]], [], nil]]],nil]]
47
+ [[:lambda,[[:id, :x]],[:id, :y],[[:let,[:id, :y],[:lambda, [[:id, :x]], [:add, [:id, :x], [:integer, 6]], [], nil]],[:let,[:id, :z],[:lambda, [[:id, :x]], [:sub, [:id, :x], [:integer, 6]], [], nil]]],nil]]
48
+ [[:let, [:id, :x], [:lambda, [], [:integer, 1], [], nil]]]
49
+ [[:let,[:id, :point],[:lambda,[[:id, :x], [:id, :y]],[:object, [:id,:point], [[:id, :x], [:id, :y]]],[],nil]]]
50
+ [[:let,[:id, :point_x],[:lambda, [[:object, [:id,:point], [[:id, :x], [:id, :y]]]], [:id, :x], [], nil]]]
51
+ [[:let,[:id, :point_y],[:lambda, [[:object, [:id,:point], [[:id, :x], [:id, :y]]]], [:id, :y], [], nil]]]
52
+ [[:let,[:id, :point_sum],[:lambda,[[:object, [:id,:point], [[:id, :x1], [:id, :y1]]],[:object, [:id,:point], [[:id, :x2], [:id, :y2]]]],[:object,[:id,:point],[[:add, [:id, :x1], [:id, :x2]], [:add, [:id, :y1], [:id, :y2]]]],[],nil]]]
53
+ [[:let,[:id, :sum],[:lambda, [[:id, :a], [:id, :b]], [:add, [:id, :a], [:id, :b]], [], nil]]]
54
+ [[:let,[:id, :f],[:lambda,[[:id, :x]],[:begin,[[:let, [:id, :algo], [:id, :x]],[:mul, [:id, :algo], [:id, :algo]],[:id, :algo]]],[],nil]]]
55
+ [[:let,[:id, :f],[:lambda,[[:id, :x]],[:add, [:call, [:id, :f], [[:id, :x]]], [:call, [:id, :g], [[:id, :x]]]],[[:let,[:id, :f],[:lambda, [[:id, :x]], [:mul, [:id, :x], [:id, :x]], [], nil]],[:let,[:id, :g],[:lambda, [[:id, :x]], [:div, [:id, :x], [:integer, 2]], [], nil]]],nil]]]
56
+ [[:let,[:id, :f],[:lambda,[[:id, :x]],[:id, :y],[[:let, [:id, :y], [:mul, [:integer, 2], [:id, :x]]]],nil]]]
57
+ [[:object_message, [:id, :p], [:id, :x]]]
58
+ [[:call, [:object_message, [:id, :p], [:id, :x]], [[:integer, 1]]]]
59
+ [[:call, [:object_message, [:id, :p], [:id, :x]], []]]
60
+ [[:call,[:object_message, [:call, [:id, :f], [[:integer, 1]]], [:id, :algo]],[[:integer, 1]]]]
61
+ [[:call, [:object_message, [:id, :x], [:id, :algo]], []]]
62
+ [[:call,[:object_message, [:integer, 10], [:id, :algo]],[[:integer, 1], [:integer, 2], [:integer, 3]]]]
63
+ [[:call,[:object_message,[:object, [:id,:algo], [[:integer, 1], [:integer, 2]]],[:id, :algo]],[]]]
64
+ [[:call,[:object_message, [:object, [:id,:algo], [[:id, :x], [:id, :y]]], [:id, :x]],[]]]
65
+ [[:let,[:object_message, [:object, [:id,:point], [[:id, :x], [:id, :y]]], [:id, :x]],[:lambda, [[:id, :x]], [:id, :x], [], nil]]]
66
+ [[:let,[:object_message, [:object, [:id,:aaaa], [[:id, :x], [:id, :y]]], [:id, :a]],[:lambda, [], [:id, :x], [[:let, [:id, :x], [:integer, 1]]], nil]]]
67
+ [[:let,[:object_message, [:object, [:id,:aaaa], [[:id, :x], [:id, :y]]], [:id, :algo]],[:lambda,[[:id, :x]],[:id, :y],[[:let,[:id, :y],[:lambda, [[:id, :x]], [:add, [:id, :x], [:integer, 6]], [], nil]]],nil]]]
68
+ [[:let,[:object_message, [:object, [:id,:algo], [[:id, :x], [:id, :y]]], [:id, :algo]],[:lambda, [[:id, :x]], [:id, :x], [], nil]]]
69
+ [[:let,[:object_message, [:object, [:id, :algo], []], [:id, :algo]],[:integer, 1]]]
70
+ [[:boolean, :true]]
71
+ [[:boolean, :false]]
72
+
73
+
data/test/test_vm ADDED
@@ -0,0 +1,29 @@
1
+ 1
2
+ 1.1
3
+ 'a'
4
+ "word"
5
+ 1+1
6
+ 1.1+1
7
+ 1+1.1
8
+ 1/2
9
+ 1.0/2
10
+ 1/2.0
11
+ f = [x| x] f(10)
12
+ f = [x|x+1] f(10)
13
+ f = [x, y, z| x+y-z] f(10,9,8)
14
+ f = [1|1]; [2|1]; [n|f(n-1)+f(n-2)] f(10)
15
+ f = [1|1] f = [2|1] f = [n|f(n-1)+f(n-2)] f(10)
16
+ f = [1, x| x+1] f(1,10)
17
+ f = [x, {obj: y}| x+y] f(10, {obj: 15})
18
+ f = [1, {obj: {obj2: x}}| x] f(1, {obj: {obj2: "dog"}})
19
+ f = [1, {obj: {obj2: x}}| x->concat("s")] f(1, {obj: {obj2: "dog"}})
20
+ 'a'->ord()
21
+ {obj: x} -> next = [x+1] x = {obj: 15} x->next()
22
+ begin(x=1, y=2, x+y)
23
+ x = '(1,2,3,4) x->head()
24
+ x = '(1,2,3,4) x->tail()->head()
25
+ x = '(1,2,3,4) x->concat(10)->head()
26
+ x = '(1,2,3,4) x->concat(10)->tail()->head()
27
+ sum = [{empty}| 0]; [x| x->head() + sum(x->tail())] x = '(1,2,3,4) sum(x)
28
+ if(2>=2, 1, 2)
29
+ if(2<2, 1, 2)
data/test/test_vm.rb CHANGED
@@ -2,21 +2,18 @@ require 'helper'
2
2
 
3
3
  class TestVM < Test::Unit::TestCase
4
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"))
5
+ PROGRAMS = File.readlines(File.join(File.dirname(__FILE__), "test_vm"))
6
+ RESULT = File.readlines(File.join(File.dirname(__FILE__), "test_vm_result"))
7
7
 
8
8
  context "The VM" do
9
- setup do
10
- @parser = PLangParser.new
11
- end
12
-
9
+
13
10
  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]
11
+ vm = PLang::VM::Interpreter.new(PLang::Parser::SyntaxAnalyser.new(program).parse)
12
+ should "interp the expression ##{i}" do
13
+ assert_equal vm.execute!.params[0], eval(RESULT[i])
18
14
  end
19
15
  end
16
+
20
17
  end
21
18
 
22
19
  end
@@ -0,0 +1,29 @@
1
+ 1
2
+ 1.1
3
+ 'a'
4
+ "word"
5
+ 2
6
+ 2.1
7
+ 2.1
8
+ 0
9
+ 0.5
10
+ 0.5
11
+ 10
12
+ 11
13
+ 11
14
+ 55
15
+ 55
16
+ 11
17
+ 25
18
+ "dog"
19
+ "dogs"
20
+ 97
21
+ 16
22
+ 3
23
+ 1
24
+ 2
25
+ 10
26
+ 1
27
+ 10
28
+ 1
29
+ 2
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: p-lang
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 1
10
- version: 0.1.1
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Igor Bonadio
@@ -15,27 +15,13 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-12 00:00:00 -03:00
19
- default_executable:
18
+ date: 2010-07-29 00:00:00 -03:00
19
+ default_executable: p-lang
20
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: :runtime
34
- version_requirements: *id001
35
21
  - !ruby/object:Gem::Dependency
36
22
  name: shoulda
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ requirement: &id001 !ruby/object:Gem::Requirement
39
25
  none: false
40
26
  requirements:
41
27
  - - ">="
@@ -45,12 +31,11 @@ dependencies:
45
31
  - 0
46
32
  version: "0"
47
33
  type: :development
48
- version_requirements: *id002
34
+ version_requirements: *id001
49
35
  description: P is a small ('pequena' in portuguese) functional programming language.
50
36
  email: igorbonadio@gmail.com
51
37
  executables:
52
38
  - p-lang
53
- - teste.p
54
39
  extensions: []
55
40
 
56
41
  extra_rdoc_files:
@@ -65,26 +50,33 @@ files:
65
50
  - VERSION.yml
66
51
  - bin/p-lang
67
52
  - lib/p-lang.rb
68
- - lib/parser/ast.rb
69
- - lib/parser/nodes.rb
70
- - lib/parser/p-lang.treetop
53
+ - lib/parser/error.rb
54
+ - lib/parser/lexer.rb
55
+ - lib/parser/node.rb
56
+ - lib/parser/syntax_analyser.rb
57
+ - lib/parser/token.rb
58
+ - lib/vm/core/pboolean.rb
59
+ - lib/vm/core/pchar.rb
60
+ - lib/vm/core/pdecimal.rb
61
+ - lib/vm/core/pinteger.rb
62
+ - lib/vm/core/pio.rb
63
+ - lib/vm/core/plist.rb
64
+ - lib/vm/core/pstring.rb
71
65
  - lib/vm/environment.rb
72
- - lib/vm/perror.rb
66
+ - lib/vm/interpreter.rb
67
+ - lib/vm/pfunctions.rb
68
+ - lib/vm/plambda.rb
73
69
  - lib/vm/pobject.rb
74
- - lib/vm/proc.rb
75
- - lib/vm/std/pdecimal.rb
76
- - lib/vm/std/pinteger.rb
77
- - lib/vm/std/pio.rb
78
- - lib/vm/std/pstring.rb
79
- - lib/vm/vm.rb
80
70
  - test/helper.rb
71
+ - test/test_lexer
72
+ - test/test_lexer.rb
73
+ - test/test_lexer_tokens
74
+ - test/test_parser
81
75
  - test/test_parser.rb
82
- - test/test_parser_build.txt
83
- - test/test_parser_ok.txt
76
+ - test/test_parser_build
77
+ - test/test_vm
84
78
  - test/test_vm.rb
85
- - test/test_vm_programs.txt
86
- - test/test_vm_results.txt
87
- - bin/teste.p
79
+ - test/test_vm_result
88
80
  has_rdoc: true
89
81
  homepage: http://github.com/igorbonadio/p-lang
90
82
  licenses: []
@@ -121,5 +113,6 @@ specification_version: 3
121
113
  summary: P programming language
122
114
  test_files:
123
115
  - test/helper.rb
116
+ - test/test_lexer.rb
124
117
  - test/test_parser.rb
125
118
  - test/test_vm.rb
data/bin/teste.p DELETED
@@ -1,3 +0,0 @@
1
- f = ["aaaa"->equal("aaaa")]
2
-
3
- print(f())
data/lib/parser/ast.rb DELETED
@@ -1,168 +0,0 @@
1
- module PLang
2
- module Ast
3
- class PStatement
4
- def initialize(expression)
5
- @expression = expression
6
- end
7
-
8
- def to_sexp
9
- @expression.to_sexp
10
- end
11
- end
12
-
13
- class PUnOp
14
- attr_reader :op
15
- attr_reader :right
16
- def initialize(op, right)
17
- @op = op
18
- @right = right
19
- end
20
-
21
- def to_sexp
22
- [@op, @right.to_sexp]
23
- end
24
- end
25
-
26
- class PBinOp
27
- attr_reader :op
28
- attr_reader :left
29
- attr_reader :right
30
-
31
- def initialize(op, left, right)
32
- @op = op.to_sym
33
- @left = left
34
- @right = right
35
- end
36
-
37
- def to_sexp
38
- [@op, @left.to_sexp, @right.to_sexp]
39
- end
40
- end
41
-
42
- class PLiteral
43
- attr_reader :type
44
- attr_reader :value
45
-
46
- def initialize(type, value)
47
- @type = type.to_sym
48
- @value = value
49
- end
50
-
51
- def to_sexp
52
- [:literal, @type, @value]
53
- end
54
- end
55
-
56
- class PId
57
- attr_reader :name
58
-
59
- def initialize(name)
60
- @name = name.to_sym
61
- end
62
-
63
- def to_sexp
64
- [:id, @name]
65
- end
66
- end
67
-
68
- class PObject
69
- attr_reader :name
70
-
71
- def initialize(name, params)
72
- @name = name.to_sym
73
- @params = params
74
- end
75
-
76
- def to_sexp
77
- [:object, @name, @params.collect(&:to_sexp)]
78
- end
79
- end
80
-
81
- class PCall
82
- attr_reader :cid
83
-
84
- def initialize(cid, params)
85
- @cid = cid
86
- @params = params
87
- end
88
-
89
- def to_sexp
90
- @cid = @cid.to_sexp
91
- if @cid == [:id, :if]
92
- @params = @params.collect(&:to_sexp)
93
- if @params.size == 3
94
- [:if, @params[0], @params[1], @params[2]]
95
- else
96
- raise "'if' error"
97
- end
98
- elsif @cid == [:id, :begin]
99
- [:begin, @params.collect(&:to_sexp)]
100
- else
101
- [:call, @cid, @params.collect(&:to_sexp)]
102
- end
103
- end
104
- end
105
-
106
- class PLet
107
- attr_reader :var
108
- attr_reader :val
109
-
110
- def initialize(var, val)
111
- @var = var
112
- @val = val
113
- end
114
-
115
- def to_sexp
116
- [:let, @var.to_sexp, @val.to_sexp]
117
- end
118
- end
119
-
120
- class PLambda
121
- attr_reader :params
122
- attr_reader :expr
123
- attr_reader :where
124
- attr_accessor :next_lambda
125
-
126
- def initialize(params, expr, where)
127
- @params = params
128
- @expr = expr
129
- @where = where
130
- @next_lambda = nil
131
- end
132
-
133
- def to_sexp
134
- [:lambda, @params.collect(&:to_sexp), @expr.to_sexp, @where.collect(&:to_sexp), @next_lambda]
135
- end
136
- end
137
-
138
- class PObjectCall
139
- attr_reader :obj
140
- attr_reader :msg
141
-
142
- def initialize(obj, msg)
143
- @obj = obj
144
- @msg = msg
145
- end
146
-
147
- def to_sexp
148
- [:object_call, @obj.to_sexp, @msg.to_sexp]
149
- end
150
- end
151
-
152
- class PObjectLet
153
- attr_reader :obj
154
- attr_reader :id
155
- attr_reader :value
156
-
157
- def initialize(obj, id, value)
158
- @obj = obj
159
- @id = id
160
- @value = value
161
- end
162
-
163
- def to_sexp
164
- [:object_let, @obj.to_sexp, @id.to_sexp, @value.to_sexp]
165
- end
166
- end
167
- end
168
- end