p-lang 0.2.0 → 0.3.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.
- data/README.rdoc +5 -1
- data/VERSION.yml +1 -1
- data/bin/p-lang +9 -3
- data/lib/ips/shell.rb +59 -0
- data/lib/p-lang.rb +3 -0
- data/lib/vm/core/miscellaneous.rb +11 -0
- data/lib/vm/core/pboolean.rb +4 -4
- data/lib/vm/core/pchar.rb +2 -2
- data/lib/vm/core/pdecimal.rb +12 -12
- data/lib/vm/core/pinteger.rb +12 -12
- data/lib/vm/core/pio.rb +4 -4
- data/lib/vm/core/plist.rb +4 -4
- data/lib/vm/core/pstring.rb +5 -5
- data/lib/vm/pfunctions.rb +22 -16
- data/lib/vm/pobject.rb +1 -1
- metadata +6 -4
data/README.rdoc
CHANGED
data/VERSION.yml
CHANGED
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
|
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!(["-
|
43
|
+
options.parse!(["-f" + ARGV[0]])
|
39
44
|
end
|
40
45
|
else
|
41
|
-
|
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')
|
data/lib/vm/core/pboolean.rb
CHANGED
@@ -3,19 +3,19 @@ module PLang
|
|
3
3
|
module PFunctions
|
4
4
|
def add_to_interpreter_boolean_functions
|
5
5
|
|
6
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
data/lib/vm/core/pdecimal.rb
CHANGED
@@ -3,7 +3,7 @@ module PLang
|
|
3
3
|
module PFunctions
|
4
4
|
def add_to_interpreter_decimal_functions
|
5
5
|
|
6
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
data/lib/vm/core/pinteger.rb
CHANGED
@@ -3,7 +3,7 @@ module PLang
|
|
3
3
|
module PFunctions
|
4
4
|
def add_to_interpreter_integer_functions
|
5
5
|
|
6
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
6
|
+
def_function :print, "x" do |params|
|
7
7
|
puts params[0].to_s
|
8
|
-
end
|
8
|
+
end
|
9
9
|
|
10
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
data/lib/vm/core/pstring.rb
CHANGED
@@ -3,31 +3,31 @@ module PLang
|
|
3
3
|
module PFunctions
|
4
4
|
def add_to_interpreter_string_functions
|
5
5
|
|
6
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
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:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 3
|
9
9
|
- 0
|
10
|
-
version: 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-
|
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
|