p-lang 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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