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.
- data/README.rdoc +38 -8
- data/Rakefile +0 -1
- data/VERSION.yml +3 -3
- data/bin/p-lang +36 -8
- data/lib/p-lang.rb +16 -26
- data/lib/parser/error.rb +32 -0
- data/lib/parser/lexer.rb +245 -0
- data/lib/parser/node.rb +23 -0
- data/lib/parser/syntax_analyser.rb +378 -0
- data/lib/parser/token.rb +19 -0
- data/lib/vm/core/pboolean.rb +27 -0
- data/lib/vm/core/pchar.rb +13 -0
- data/lib/vm/core/pdecimal.rb +130 -0
- data/lib/vm/core/pinteger.rb +125 -0
- data/lib/vm/core/pio.rb +16 -0
- data/lib/vm/core/plist.rb +33 -0
- data/lib/vm/core/pstring.rb +39 -0
- data/lib/vm/environment.rb +67 -42
- data/lib/vm/interpreter.rb +209 -0
- data/lib/vm/pfunctions.rb +46 -0
- data/lib/vm/plambda.rb +42 -0
- data/lib/vm/pobject.rb +44 -42
- data/test/test_lexer +34 -0
- data/test/test_lexer.rb +19 -0
- data/test/test_lexer_tokens +34 -0
- data/test/{test_parser_ok.txt → test_parser} +26 -27
- data/test/test_parser.rb +6 -13
- data/test/test_parser_build +73 -0
- data/test/test_vm +29 -0
- data/test/test_vm.rb +7 -10
- data/test/test_vm_result +29 -0
- metadata +31 -38
- data/bin/teste.p +0 -3
- data/lib/parser/ast.rb +0 -168
- data/lib/parser/nodes.rb +0 -212
- data/lib/parser/p-lang.treetop +0 -197
- data/lib/vm/perror.rb +0 -8
- data/lib/vm/proc.rb +0 -67
- data/lib/vm/std/pdecimal.rb +0 -42
- data/lib/vm/std/pinteger.rb +0 -42
- data/lib/vm/std/pio.rb +0 -17
- data/lib/vm/std/pstring.rb +0 -160
- data/lib/vm/vm.rb +0 -233
- data/test/test_parser_build.txt +0 -72
- data/test/test_vm_programs.txt +0 -64
- data/test/test_vm_results.txt +0 -64
data/lib/parser/nodes.rb
DELETED
@@ -1,212 +0,0 @@
|
|
1
|
-
module PLang
|
2
|
-
|
3
|
-
module NStatements
|
4
|
-
def build
|
5
|
-
elements.collect { |element| PLang::Ast::PStatement.new(element.statement.build) }
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
module NCStatementList
|
10
|
-
def build
|
11
|
-
stm = statement_list.build
|
12
|
-
unless stm.class == Array
|
13
|
-
stm = [stm]
|
14
|
-
end
|
15
|
-
[statement.build] + stm
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
module NBinOp
|
20
|
-
def build
|
21
|
-
PLang::Ast::PBinOp.new(op.text_value, expr.build, statement.build)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
module NUnOp
|
26
|
-
def build
|
27
|
-
PLang::Ast::PUnOp.new(:not, statement.build)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
module NInteger
|
32
|
-
def build
|
33
|
-
PLang::Ast::PLiteral.new(:integer, text_value.to_i)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
module NDecimal
|
38
|
-
def build
|
39
|
-
PLang::Ast::PLiteral.new(:decimal, text_value.to_f)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
module NString
|
44
|
-
def build
|
45
|
-
PLang::Ast::PLiteral.new(:string, str.text_value)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
module NChar
|
50
|
-
def build
|
51
|
-
PLang::Ast::PLiteral.new(:char, c.text_value)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
module NId
|
56
|
-
def build
|
57
|
-
PLang::Ast::PId.new(text_value)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
module NObject
|
62
|
-
def build
|
63
|
-
if obj_list.respond_to?(:build)
|
64
|
-
params = obj_list.build
|
65
|
-
unless params.class == Array
|
66
|
-
params = [params]
|
67
|
-
end
|
68
|
-
PLang::Ast::PObject.new(id.text_value, params)
|
69
|
-
else
|
70
|
-
PLang::Ast::PObject.new(id.text_value, [])
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
module NObjectList
|
76
|
-
def build
|
77
|
-
statement_list.build
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
module NParemExpr
|
82
|
-
def build
|
83
|
-
statement.build
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
module NCall
|
88
|
-
def build
|
89
|
-
params = []
|
90
|
-
if cparams.respond_to?(:build)
|
91
|
-
params = cparams.build
|
92
|
-
unless params.class == Array
|
93
|
-
params = [params]
|
94
|
-
end
|
95
|
-
end
|
96
|
-
PLang::Ast::PCall.new(cid.build, params)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
module NVarLet
|
101
|
-
def build
|
102
|
-
PLang::Ast::PLet.new(var.build, statement.build)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
module NLambda
|
107
|
-
def build
|
108
|
-
@where = []
|
109
|
-
if where.respond_to?(:build)
|
110
|
-
@where = where.build
|
111
|
-
end
|
112
|
-
@params = []
|
113
|
-
if params.respond_to?(:build)
|
114
|
-
@params = params.build
|
115
|
-
end
|
116
|
-
PLang::Ast::PLambda.new(@params, statement.build, @where)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
module NCLambda
|
121
|
-
def build
|
122
|
-
nlambda = lamb.build
|
123
|
-
nlambda.next_lambda = lambda.build.to_sexp
|
124
|
-
nlambda
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
module NWhere
|
129
|
-
def build
|
130
|
-
w = where_params.build
|
131
|
-
if w.class == Array
|
132
|
-
w
|
133
|
-
else
|
134
|
-
[w]
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
module NCWhereParams
|
140
|
-
def build
|
141
|
-
w = where_params.build
|
142
|
-
unless w.class == Array
|
143
|
-
w = [w]
|
144
|
-
end
|
145
|
-
[let.build] + w
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
module NLambdaParams
|
150
|
-
def build
|
151
|
-
params = lambda_params_list.build
|
152
|
-
if params.class == Array
|
153
|
-
params
|
154
|
-
else
|
155
|
-
[params]
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
module NCLambdaParamsList
|
161
|
-
def build
|
162
|
-
params = lambda_params_list.build
|
163
|
-
unless params.class == Array
|
164
|
-
params = [params]
|
165
|
-
end
|
166
|
-
[form.build] + params
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
module NObjectForm
|
171
|
-
def build
|
172
|
-
if obj_form_list.respond_to?(:build)
|
173
|
-
PLang::Ast::PObject.new(id.text_value, obj_form_list.build)
|
174
|
-
else
|
175
|
-
PLang::Ast::PObject.new(id.text_value, [])
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
module NObjectGet
|
181
|
-
def build
|
182
|
-
PLang::Ast::PObjectCall.new(expr.build, id.build)
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
module NObjectMsg
|
187
|
-
def build
|
188
|
-
params = []
|
189
|
-
if statement_list.respond_to?(:build)
|
190
|
-
params = statement_list.build
|
191
|
-
unless params.class == Array
|
192
|
-
params = [params]
|
193
|
-
end
|
194
|
-
end
|
195
|
-
PLang::Ast::PCall.new(PLang::Ast::PObjectCall.new(expr.build, id.build), [expr.build] | params)
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
module NObjectLet
|
200
|
-
def build
|
201
|
-
PLang::Ast::PObjectLet.new(object_form.build, var.build, statement.build)
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
module NBoolean
|
206
|
-
def build
|
207
|
-
PLang::Ast::PLiteral.new(:boolean, text_value.to_sym)
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
end
|
212
|
-
|
data/lib/parser/p-lang.treetop
DELETED
@@ -1,197 +0,0 @@
|
|
1
|
-
grammar PLang
|
2
|
-
|
3
|
-
rule statements
|
4
|
-
(spaces? statement spaces?)* <NStatements>
|
5
|
-
end
|
6
|
-
|
7
|
-
rule statement
|
8
|
-
unop / binop / let / object_op / expr
|
9
|
-
end
|
10
|
-
|
11
|
-
rule object_op
|
12
|
-
object_msg /
|
13
|
-
object_get
|
14
|
-
end
|
15
|
-
|
16
|
-
rule object_msg
|
17
|
-
expr spaces? '->' spaces? id sspaces? '(' spaces? statement_list:statement_list? spaces? ')' <NObjectMsg>
|
18
|
-
end
|
19
|
-
|
20
|
-
rule object_get
|
21
|
-
expr spaces? '->' spaces? id spaces? <NObjectGet>
|
22
|
-
end
|
23
|
-
|
24
|
-
rule let
|
25
|
-
var_let /
|
26
|
-
obj_let
|
27
|
-
end
|
28
|
-
|
29
|
-
rule var_let
|
30
|
-
var spaces? '=' spaces? statement <NVarLet>
|
31
|
-
end
|
32
|
-
|
33
|
-
rule obj_let
|
34
|
-
object_form spaces? '->' spaces? var spaces? '=' spaces? statement <NObjectLet>
|
35
|
-
end
|
36
|
-
|
37
|
-
rule var
|
38
|
-
id / object
|
39
|
-
end
|
40
|
-
|
41
|
-
rule unop
|
42
|
-
'not' spaces? statement <NUnOp>
|
43
|
-
end
|
44
|
-
|
45
|
-
rule binop
|
46
|
-
expr spaces? op spaces? statement <NBinOp>
|
47
|
-
end
|
48
|
-
|
49
|
-
rule op
|
50
|
-
'+' / '-' / '*' / '/' / '%' / '>=' / '<=' / '>' / '<' / '==' / 'and' / 'or'
|
51
|
-
end
|
52
|
-
|
53
|
-
rule call
|
54
|
-
cid:(id / lambda) sspaces? '(' spaces? cparams:statement_list? spaces? ')' <NCall>
|
55
|
-
end
|
56
|
-
|
57
|
-
rule sspaces
|
58
|
-
[\s\t]*
|
59
|
-
end
|
60
|
-
|
61
|
-
rule expr
|
62
|
-
number / boolean / call / id / object / char / string / lambda / parem_expr
|
63
|
-
end
|
64
|
-
|
65
|
-
rule parem_expr
|
66
|
-
'(' spaces? statement spaces? ')' <NParemExpr>
|
67
|
-
end
|
68
|
-
|
69
|
-
rule statement_list
|
70
|
-
cstatement_list / statement
|
71
|
-
end
|
72
|
-
|
73
|
-
rule cstatement_list
|
74
|
-
statement spaces? ',' spaces? statement_list <NCStatementList>
|
75
|
-
end
|
76
|
-
|
77
|
-
rule lambda
|
78
|
-
clamb / lamb
|
79
|
-
end
|
80
|
-
|
81
|
-
rule clamb
|
82
|
-
lamb spaces? ',' spaces? lambda <NCLambda>
|
83
|
-
end
|
84
|
-
|
85
|
-
rule lamb
|
86
|
-
'[' spaces? params:lambda_params? spaces? statement spaces? ']' spaces? where:where? <NLambda>
|
87
|
-
end
|
88
|
-
|
89
|
-
rule where
|
90
|
-
':' spaces? '(' spaces? where_params spaces? ')' <NWhere>
|
91
|
-
end
|
92
|
-
|
93
|
-
rule where_params
|
94
|
-
cwhere_params / let
|
95
|
-
end
|
96
|
-
|
97
|
-
rule cwhere_params
|
98
|
-
let spaces? ',' spaces? where_params <NCWhereParams>
|
99
|
-
end
|
100
|
-
|
101
|
-
rule lambda_params
|
102
|
-
lambda_params_list spaces? '|' <NLambdaParams>
|
103
|
-
end
|
104
|
-
|
105
|
-
rule lambda_params_list
|
106
|
-
clambda_params_list / form
|
107
|
-
end
|
108
|
-
|
109
|
-
rule clambda_params_list
|
110
|
-
form spaces? ',' spaces? lambda_params_list <NCLambdaParamsList>
|
111
|
-
end
|
112
|
-
|
113
|
-
rule form
|
114
|
-
number / id / object_form / char / string
|
115
|
-
end
|
116
|
-
|
117
|
-
rule object_form
|
118
|
-
'{' spaces? id spaces? obj_form_list:object_form_list? spaces? '}' <NObjectForm>
|
119
|
-
end
|
120
|
-
|
121
|
-
rule object_form_list
|
122
|
-
':' spaces? lambda_params_list <NLambdaParams>
|
123
|
-
end
|
124
|
-
|
125
|
-
rule object
|
126
|
-
'{' spaces? id spaces? obj_list:object_list? spaces? '}' <NObject>
|
127
|
-
end
|
128
|
-
|
129
|
-
rule object_list
|
130
|
-
':' spaces? statement_list <NObjectList>
|
131
|
-
end
|
132
|
-
|
133
|
-
rule boolean
|
134
|
-
(true / false) <NBoolean>
|
135
|
-
end
|
136
|
-
|
137
|
-
rule true
|
138
|
-
"true"
|
139
|
-
end
|
140
|
-
|
141
|
-
rule false
|
142
|
-
"false"
|
143
|
-
end
|
144
|
-
|
145
|
-
rule id
|
146
|
-
[a-zA-Z_0-9]+ <NId>
|
147
|
-
end
|
148
|
-
|
149
|
-
rule string
|
150
|
-
"\"" str:(!"\"" .)* "\"" <NString>
|
151
|
-
end
|
152
|
-
|
153
|
-
rule char
|
154
|
-
"'" c:(!"'" .) "'" <NChar>
|
155
|
-
end
|
156
|
-
|
157
|
-
rule number
|
158
|
-
decimal / integer
|
159
|
-
end
|
160
|
-
|
161
|
-
rule decimal
|
162
|
-
sign? spaces? digits? dot digits <NDecimal>
|
163
|
-
end
|
164
|
-
|
165
|
-
rule integer
|
166
|
-
sign? spaces? digits <NInteger>
|
167
|
-
end
|
168
|
-
|
169
|
-
rule digits
|
170
|
-
digit+
|
171
|
-
end
|
172
|
-
|
173
|
-
rule digit
|
174
|
-
[0-9]
|
175
|
-
end
|
176
|
-
|
177
|
-
rule sign
|
178
|
-
"-"
|
179
|
-
end
|
180
|
-
|
181
|
-
rule dot
|
182
|
-
"."
|
183
|
-
end
|
184
|
-
|
185
|
-
rule spaces
|
186
|
-
space* ("#" (!break .)* break+ space*)*
|
187
|
-
end
|
188
|
-
|
189
|
-
rule space
|
190
|
-
[\r\n\t\s]
|
191
|
-
end
|
192
|
-
|
193
|
-
rule break
|
194
|
-
[\r\n]
|
195
|
-
end
|
196
|
-
|
197
|
-
end
|
data/lib/vm/perror.rb
DELETED
data/lib/vm/proc.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
class Proc
|
2
|
-
attr_accessor :form
|
3
|
-
|
4
|
-
def compare_form(form, obj)
|
5
|
-
if(form)
|
6
|
-
unless obj[1] == form[1]
|
7
|
-
return false
|
8
|
-
else
|
9
|
-
if form[0] == :literal
|
10
|
-
unless form == obj
|
11
|
-
return false
|
12
|
-
end
|
13
|
-
else
|
14
|
-
if obj[0] == :literal
|
15
|
-
unless form[2].length == 1
|
16
|
-
return false
|
17
|
-
else
|
18
|
-
unless form[2][0][0] == :id
|
19
|
-
return false
|
20
|
-
end
|
21
|
-
end
|
22
|
-
else
|
23
|
-
if form[2].length == obj[2].length
|
24
|
-
form[2].each_with_index do |p, i|
|
25
|
-
unless p[0] == :id
|
26
|
-
unless p == obj[2][i]
|
27
|
-
if p[0] == :object
|
28
|
-
return compare_form(p, obj[2][i])
|
29
|
-
else
|
30
|
-
return false
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
else
|
36
|
-
return false
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
return true
|
43
|
-
end
|
44
|
-
|
45
|
-
def call?(params)
|
46
|
-
if @form.length == params.length
|
47
|
-
params.each_with_index do |param, i|
|
48
|
-
unless param.class == Array
|
49
|
-
unless compare_form(@form[i], param.form)
|
50
|
-
return false
|
51
|
-
end
|
52
|
-
else
|
53
|
-
if @form[i]
|
54
|
-
return false
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
return true
|
59
|
-
else
|
60
|
-
return false
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def to_s
|
65
|
-
"#lambda:#{self.object_id}"
|
66
|
-
end
|
67
|
-
end
|