p-lang 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -75,7 +75,11 @@ IO:
75
75
 
76
76
  == Running
77
77
 
78
- $ p-lang -i your-program.p
78
+ $ p-lang your-program.p
79
+
80
+ == Interactive P Shell
81
+
82
+ $ p-lang
79
83
 
80
84
  == Note on Patches/Pull Requests
81
85
 
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
- :minor: 2
3
+ :minor: 3
4
4
  :patch: 0
5
5
  :build:
data/bin/p-lang CHANGED
@@ -14,7 +14,12 @@ options = OptionParser.new do|opts|
14
14
  vm.execute!
15
15
  end
16
16
 
17
- opts.on("-i", "-i FILE", "interp a script file.") do |file|
17
+ opts.on("-i", "-i", "interactive p shell.") do
18
+ shell = PLang::IPS::Shell.new
19
+ shell.start
20
+ end
21
+
22
+ opts.on("-f", "-f FILE", "interp a script file.") do |file|
18
23
  begin
19
24
  program = File.readlines(file).join("")
20
25
  rescue
@@ -35,10 +40,11 @@ argv = ARGV
35
40
  begin
36
41
  if ARGV.length > 0
37
42
  if options.parse!(ARGV).length > 0
38
- options.parse!(["-h"])
43
+ options.parse!(["-f" + ARGV[0]])
39
44
  end
40
45
  else
41
- options.parse!(["-h"])
46
+ # without arguments
47
+ options.parse!(["-i"])
42
48
  end
43
49
  rescue
44
50
  puts "p-lang: unrecognized option"
data/lib/ips/shell.rb ADDED
@@ -0,0 +1,59 @@
1
+ module PLang
2
+ module IPS # = Interactive P Shell
3
+ class Shell
4
+ def initialize
5
+ @expr_c = ""
6
+ @interpreter = PLang::VM::Interpreter.new(nil)
7
+ @env = @interpreter.send(:load_basic_environment)
8
+ end
9
+
10
+ def start
11
+ while true
12
+ begin
13
+ execute(read)
14
+ rescue Exception => e
15
+ if e.class == SystemExit
16
+ raise e
17
+ else
18
+ puts "ips:#{e}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ def execute(expr)
25
+ expr = @expr_c + expr
26
+ sa = PLang::Parser::SyntaxAnalyser.new(expr)
27
+ begin
28
+ ast = sa.parse
29
+ result = nil
30
+ ast.each do |a|
31
+ result = @interpreter.send(:execute, a, @env)
32
+ end
33
+ @expr_c = ""
34
+ show(result)
35
+ rescue Exception => e
36
+ if e.message =~ /sintax error: unexpected '\\n'/
37
+ @expr_c = expr
38
+ else
39
+ @expr_c = ""
40
+ raise e
41
+ end
42
+ end
43
+ end
44
+
45
+ def show(out)
46
+ puts " => #{out.to_s}"
47
+ end
48
+
49
+ def read
50
+ if @expr_c == ""
51
+ print "p-lang > "
52
+ else
53
+ print "...... > "
54
+ end
55
+ gets
56
+ end
57
+ end
58
+ end
59
+ end
data/lib/p-lang.rb CHANGED
@@ -19,3 +19,6 @@ require File.join(ROOT_PATH, '/vm/core/pstring')
19
19
  require File.join(ROOT_PATH, '/vm/core/pchar')
20
20
  require File.join(ROOT_PATH, '/vm/core/plist')
21
21
  require File.join(ROOT_PATH, '/vm/core/pio')
22
+ require File.join(ROOT_PATH, '/vm/core/miscellaneous')
23
+
24
+ require File.join(ROOT_PATH, '/ips/shell.rb')
@@ -0,0 +1,11 @@
1
+ module PLang
2
+ module VM
3
+ module PFunctions
4
+ def add_to_interpreter_miscellaneous_functions
5
+ def_function :exit, do
6
+ exit
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -3,19 +3,19 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_boolean_functions
5
5
 
6
- object_message "{boolean: x}", :_and do |object|
6
+ def_object_message "{boolean: x}", :_and do |object|
7
7
  plambda "{boolean: y}" do |value|
8
8
  PObject.new(:boolean, [(object.params[0] and value[0].params[0])])
9
9
  end
10
10
  end
11
11
 
12
- object_message "{boolean: x}", :_or do |object|
12
+ def_object_message "{boolean: x}", :_or do |object|
13
13
  plambda "{boolean: y}" do |value|
14
14
  PObject.new(:boolean, [(object.params[0] or value[0].params[0])])
15
15
  end
16
16
  end
17
17
 
18
- object_message "{boolean: x}", :_not do |object|
18
+ def_object_message "{boolean: x}", :_not do |object|
19
19
  plambda do
20
20
  PObject.new(:boolean, [(not object.params[0])])
21
21
  end
@@ -24,4 +24,4 @@ module PLang
24
24
  end
25
25
  end
26
26
  end
27
- end
27
+ end
data/lib/vm/core/pchar.rb CHANGED
@@ -2,7 +2,7 @@ module PLang
2
2
  module VM
3
3
  module PFunctions
4
4
  def add_to_interpreter_char_functions
5
- object_message "{char: x}", :ord do |object|
5
+ def_object_message "{char: x}", :ord do |object|
6
6
  plambda do |value|
7
7
  PObject.new(:integer, [object.params[0].ord])
8
8
  end
@@ -10,4 +10,4 @@ module PLang
10
10
  end
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -3,7 +3,7 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_decimal_functions
5
5
 
6
- object_message "{decimal: x}", :add do |object|
6
+ def_object_message "{decimal: x}", :add do |object|
7
7
  plambda "y" do |value|
8
8
  case value[0].id
9
9
  when :integer, :decimal
@@ -14,7 +14,7 @@ module PLang
14
14
  end
15
15
  end
16
16
 
17
- object_message "{decimal: x}", :sub do |object|
17
+ def_object_message "{decimal: x}", :sub do |object|
18
18
  plambda "y" do |value|
19
19
  case value[0].id
20
20
  when :integer, :decimal
@@ -25,7 +25,7 @@ module PLang
25
25
  end
26
26
  end
27
27
 
28
- object_message "{decimal: x}", :mul do |object|
28
+ def_object_message "{decimal: x}", :mul do |object|
29
29
  plambda "y" do |value|
30
30
  case value[0].id
31
31
  when :integer, :decimal
@@ -36,7 +36,7 @@ module PLang
36
36
  end
37
37
  end
38
38
 
39
- object_message "{decimal: x}", :div do |object|
39
+ def_object_message "{decimal: x}", :div do |object|
40
40
  plambda "y" do |value|
41
41
  case value[0].id
42
42
  when :integer, :decimal
@@ -47,7 +47,7 @@ module PLang
47
47
  end
48
48
  end
49
49
 
50
- object_message "{decimal: x}", :mod do |object|
50
+ def_object_message "{decimal: x}", :mod do |object|
51
51
  plambda "y" do |value|
52
52
  case value[0].id
53
53
  when :integer, :decimal
@@ -58,7 +58,7 @@ module PLang
58
58
  end
59
59
  end
60
60
 
61
- object_message "{decimal: x}", :major do |object|
61
+ def_object_message "{decimal: x}", :major do |object|
62
62
  plambda "y" do |value|
63
63
  case value[0].id
64
64
  when :integer, :decimal
@@ -69,7 +69,7 @@ module PLang
69
69
  end
70
70
  end
71
71
 
72
- object_message "{decimal: x}", :major_equal do |object|
72
+ def_object_message "{decimal: x}", :major_equal do |object|
73
73
  plambda "y" do |value|
74
74
  case value[0].id
75
75
  when :integer, :decimal
@@ -80,7 +80,7 @@ module PLang
80
80
  end
81
81
  end
82
82
 
83
- object_message "{decimal: x}", :minor do |object|
83
+ def_object_message "{decimal: x}", :minor do |object|
84
84
  plambda "y" do |value|
85
85
  case value[0].id
86
86
  when :integer, :decimal
@@ -91,7 +91,7 @@ module PLang
91
91
  end
92
92
  end
93
93
 
94
- object_message "{decimal: x}", :minor_equal do |object|
94
+ def_object_message "{decimal: x}", :minor_equal do |object|
95
95
  plambda "y" do |value|
96
96
  case value[0].id
97
97
  when :integer, :decimal
@@ -102,7 +102,7 @@ module PLang
102
102
  end
103
103
  end
104
104
 
105
- object_message "{decimal: x}", :equal do |object|
105
+ def_object_message "{decimal: x}", :equal do |object|
106
106
  plambda "y" do |value|
107
107
  case value[0].id
108
108
  when :integer, :decimal
@@ -113,7 +113,7 @@ module PLang
113
113
  end
114
114
  end
115
115
 
116
- object_message "{decimal: x}", :diff do |object|
116
+ def_object_message "{decimal: x}", :diff do |object|
117
117
  plambda "y" do |value|
118
118
  case value[0].id
119
119
  when :integer, :decimal
@@ -127,4 +127,4 @@ module PLang
127
127
  end
128
128
  end
129
129
  end
130
- end
130
+ end
@@ -3,7 +3,7 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_integer_functions
5
5
 
6
- object_message "{integer: x}", :add do |object|
6
+ def_object_message "{integer: x}", :add do |object|
7
7
  plambda "y" do |value|
8
8
  if value[0].id == :integer
9
9
  PObject.new(:integer, [object.params[0] + value[0].params[0]])
@@ -13,7 +13,7 @@ module PLang
13
13
  end
14
14
  end
15
15
 
16
- object_message "{integer: x}", :sub do |object|
16
+ def_object_message "{integer: x}", :sub do |object|
17
17
  plambda "y" do |value|
18
18
  if value[0].id == :integer
19
19
  PObject.new(:integer, [object.params[0] - value[0].params[0]])
@@ -23,7 +23,7 @@ module PLang
23
23
  end
24
24
  end
25
25
 
26
- object_message "{integer: x}", :mul do |object|
26
+ def_object_message "{integer: x}", :mul do |object|
27
27
  plambda "y" do |value|
28
28
  if value[0].id == :integer
29
29
  PObject.new(:integer, [object.params[0] * value[0].params[0]])
@@ -33,7 +33,7 @@ module PLang
33
33
  end
34
34
  end
35
35
 
36
- object_message "{integer: x}", :div do |object|
36
+ def_object_message "{integer: x}", :div do |object|
37
37
  plambda "y" do |value|
38
38
  if value[0].id == :integer
39
39
  PObject.new(:integer, [object.params[0] / value[0].params[0]])
@@ -43,7 +43,7 @@ module PLang
43
43
  end
44
44
  end
45
45
 
46
- object_message "{integer: x}", :mod do |object|
46
+ def_object_message "{integer: x}", :mod do |object|
47
47
  plambda "y" do |value|
48
48
  if value[0].id == :integer
49
49
  PObject.new(:integer, [object.params[0] % value[0].params[0]])
@@ -53,7 +53,7 @@ module PLang
53
53
  end
54
54
  end
55
55
 
56
- object_message "{integer: x}", :major do |object|
56
+ def_object_message "{integer: x}", :major do |object|
57
57
  plambda "y" do |value|
58
58
  case value[0].id
59
59
  when :integer, :decimal
@@ -64,7 +64,7 @@ module PLang
64
64
  end
65
65
  end
66
66
 
67
- object_message "{integer: x}", :major_equal do |object|
67
+ def_object_message "{integer: x}", :major_equal do |object|
68
68
  plambda "y" do |value|
69
69
  case value[0].id
70
70
  when :integer, :decimal
@@ -75,7 +75,7 @@ module PLang
75
75
  end
76
76
  end
77
77
 
78
- object_message "{integer: x}", :minor do |object|
78
+ def_object_message "{integer: x}", :minor do |object|
79
79
  plambda "y" do |value|
80
80
  case value[0].id
81
81
  when :integer, :decimal
@@ -86,7 +86,7 @@ module PLang
86
86
  end
87
87
  end
88
88
 
89
- object_message "{integer: x}", :minor_equal do |object|
89
+ def_object_message "{integer: x}", :minor_equal do |object|
90
90
  plambda "y" do |value|
91
91
  case value[0].id
92
92
  when :integer, :decimal
@@ -97,7 +97,7 @@ module PLang
97
97
  end
98
98
  end
99
99
 
100
- object_message "{integer: x}", :equal do |object|
100
+ def_object_message "{integer: x}", :equal do |object|
101
101
  plambda "y" do |value|
102
102
  case value[0].id
103
103
  when :integer, :decimal
@@ -108,7 +108,7 @@ module PLang
108
108
  end
109
109
  end
110
110
 
111
- object_message "{integer: x}", :diff do |object|
111
+ def_object_message "{integer: x}", :diff do |object|
112
112
  plambda "y" do |value|
113
113
  case value[0].id
114
114
  when :integer, :decimal
@@ -122,4 +122,4 @@ module PLang
122
122
  end
123
123
  end
124
124
  end
125
- end
125
+ end
data/lib/vm/core/pio.rb CHANGED
@@ -3,13 +3,13 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_io_functions
5
5
 
6
- var :print, (plambda "x" do |params|
6
+ def_function :print, "x" do |params|
7
7
  puts params[0].to_s
8
- end)
8
+ end
9
9
 
10
- var :read, (plambda do
10
+ def_function :read, do
11
11
  PObject.new(:string, [STDIN.gets])
12
- end)
12
+ end
13
13
  end
14
14
  end
15
15
  end
data/lib/vm/core/plist.rb CHANGED
@@ -3,25 +3,25 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_list_functions
5
5
 
6
- object_message "{list: x, xs}", :head do |object|
6
+ def_object_message "{list: x, xs}", :head do |object|
7
7
  plambda do |value|
8
8
  object.params[0]
9
9
  end
10
10
  end
11
11
 
12
- object_message "{list: x, xs}", :tail do |object|
12
+ def_object_message "{list: x, xs}", :tail do |object|
13
13
  plambda do |value|
14
14
  object.params[1]
15
15
  end
16
16
  end
17
17
 
18
- object_message "{list: x, xs}", :concat do |object|
18
+ def_object_message "{list: x, xs}", :concat do |object|
19
19
  plambda "x" do |value|
20
20
  PObject.new(:list, [value[0], object])
21
21
  end
22
22
  end
23
23
 
24
- object_message "{empty}", :concat do |object|
24
+ def_object_message "{empty}", :concat do |object|
25
25
  plambda "x" do |value|
26
26
  PObject.new(:list, [value[0], object])
27
27
  end
@@ -3,31 +3,31 @@ module PLang
3
3
  module PFunctions
4
4
  def add_to_interpreter_string_functions
5
5
 
6
- object_message "{string: x}", :at do |object|
6
+ def_object_message "{string: x}", :at do |object|
7
7
  plambda "{integer: y}" do |value|
8
8
  PObject.new(:char, [object.params[0][value[0].params[0]]])
9
9
  end
10
10
  end
11
11
 
12
- object_message "{string: x}", :concat do |object|
12
+ def_object_message "{string: x}", :concat do |object|
13
13
  plambda "{string: y}" do |value|
14
14
  PObject.new(:string, [object.params[0] + value[0].params[0]])
15
15
  end
16
16
  end
17
17
 
18
- object_message "x", :to_string do |object|
18
+ def_object_message "x", :to_string do |object|
19
19
  plambda do |value|
20
20
  PObject.new(:string, [object.to_s])
21
21
  end
22
22
  end
23
23
 
24
- object_message "{string: x}", :to_integer do |object|
24
+ def_object_message "{string: x}", :to_integer do |object|
25
25
  plambda do |value|
26
26
  PObject.new(:integer, [object.params[0].to_i])
27
27
  end
28
28
  end
29
29
 
30
- object_message "{string: x}", :to_decimal do |object|
30
+ def_object_message "{string: x}", :to_decimal do |object|
31
31
  plambda do |value|
32
32
  PObject.new(:decimal, [object.params[0].to_f])
33
33
  end
data/lib/vm/pfunctions.rb CHANGED
@@ -1,7 +1,28 @@
1
1
  module PLang
2
2
  module VM
3
3
  module PFunctions
4
+
5
+ def def_function(id, *params)
6
+ def_var(id, (plambda(*params) do |values|
7
+ yield(values)
8
+ end))
9
+ end
10
+
11
+ def def_object_message(object, message)
12
+ lamb = plambda(object, "{#{message.to_s}}") do |values|
13
+ yield(values[0], values[1])
14
+ end
15
+ begin
16
+ @env.set_var(:get_object_message, lamb)
17
+ rescue
18
+ @env.add_lambda(:get_object_message, lamb)
19
+ end
20
+ end
4
21
 
22
+ def def_var(id, value)
23
+ @env.set_var(id.to_sym, value)
24
+ end
25
+
5
26
  def plambda(*params)
6
27
  lamb = PLambda.new do |values|
7
28
  yield(values)
@@ -22,25 +43,10 @@ module PLang
22
43
  PObject.new(:lambda, [lamb])
23
44
  end
24
45
 
25
- def object_message(object, message)
26
- lamb = plambda(object, "{#{message.to_s}}") do |values|
27
- yield(values[0], values[1])
28
- end
29
- begin
30
- @env.set_var(:get_object_message, lamb)
31
- rescue
32
- @env.add_lambda(:get_object_message, lamb)
33
- end
34
- end
35
-
36
- def var(id, value)
37
- @env.set_var(id.to_sym, value)
38
- end
39
-
40
46
  def object(expr)
41
47
  PLang::Parser::SyntaxAnalyser.new(expr).parse[0]
42
48
  end
43
49
 
44
50
  end
45
51
  end
46
- end
52
+ end
data/lib/vm/pobject.rb CHANGED
@@ -12,7 +12,7 @@ module PLang
12
12
  def to_s
13
13
  case @id
14
14
  when :integer, :decimal, :char, :string, :boolean
15
- return params[0]
15
+ return params[0].to_s
16
16
  when :empty
17
17
  return "'()"
18
18
  when :list
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: 23
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
8
+ - 3
9
9
  - 0
10
- version: 0.2.0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Igor Bonadio
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-29 00:00:00 -03:00
18
+ date: 2010-07-31 00:00:00 -03:00
19
19
  default_executable: p-lang
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -49,12 +49,14 @@ files:
49
49
  - Rakefile
50
50
  - VERSION.yml
51
51
  - bin/p-lang
52
+ - lib/ips/shell.rb
52
53
  - lib/p-lang.rb
53
54
  - lib/parser/error.rb
54
55
  - lib/parser/lexer.rb
55
56
  - lib/parser/node.rb
56
57
  - lib/parser/syntax_analyser.rb
57
58
  - lib/parser/token.rb
59
+ - lib/vm/core/miscellaneous.rb
58
60
  - lib/vm/core/pboolean.rb
59
61
  - lib/vm/core/pchar.rb
60
62
  - lib/vm/core/pdecimal.rb