yadriggy 1.2.1 → 1.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +5 -1
- data/lib/yadriggy/ast.rb +20 -4
- data/lib/yadriggy/checker.rb +8 -3
- data/lib/yadriggy/py/codegen.rb +15 -0
- data/lib/yadriggy/py/py_typechecker.rb +2 -1
- data/lib/yadriggy/py/python.rb +1 -65
- data/lib/yadriggy/py/syntax.rb +75 -0
- data/lib/yadriggy/source_code.rb +21 -4
- data/lib/yadriggy/typecheck.rb +7 -1
- data/lib/yadriggy/version.rb +1 -1
- data/yadriggy.gemspec +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5af1fba63b8de51cbdd01aec66b557292134c43f
|
4
|
+
data.tar.gz: f797ce20c6a020eac1cd3ecc7de7cdc6567ccd13
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e91097275404a17c9c6e98c1ee0b4ae58c4c21a13562baae2fdad877d0d9905dc53878a99d754ba729465d2e8716d925ef1191ce836419307ea85c2c91f25605
|
7
|
+
data.tar.gz: 8a6e29162f1f420ec5598ffed5de0a179cc45f3cf9639570d08d281566bff2bf21d176730b5767bb19f0d4a10012825eda4e6044dc86626da47e5f95cef0e857
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Yadriggy
|
2
2
|
|
3
|
-
Yadriggy (mistletoe in
|
3
|
+
Yadriggy (mistletoe in English) is a library for building a
|
4
4
|
domain-specific language (DSL) embedded in Ruby. It was developed for
|
5
5
|
a particular kind of embedded DSLs.
|
6
6
|
These DSLs borrow the syntax from the host language, Ruby, and the
|
@@ -91,6 +91,10 @@ The idea of `reify` was proposed in the following paper:
|
|
91
91
|
|
92
92
|
- Shigeru Chiba, YungYu Zhuang, Maximilian Scherr, "Deeply Reifying Running Code for Constructing a Domain-Specific Language", PPPJ'16, Article No. 1, ACM, August 2016.
|
93
93
|
|
94
|
+
Yadriggy-Py was presented in the following paper:
|
95
|
+
|
96
|
+
- Shigeru Chiba, Foreign language interfaces by code migration, Proc. of the 18th ACM SIGPLAN International Conference on Generative Programming: Concepts and Experiences (GPCE 2019), pp. 1-13, ACM, 2019.
|
97
|
+
|
94
98
|
## Installation
|
95
99
|
|
96
100
|
To install, run:
|
data/lib/yadriggy/ast.rb
CHANGED
@@ -912,7 +912,7 @@ module Yadriggy
|
|
912
912
|
|
913
913
|
def initialize_call(sexp)
|
914
914
|
@receiver = to_node(sexp[1])
|
915
|
-
@op = sexp[2]
|
915
|
+
@op = op_symbol(sexp[2]) # :"." or :"::" or nil.
|
916
916
|
@name = if sexp[3] == :call
|
917
917
|
nil
|
918
918
|
else
|
@@ -922,6 +922,16 @@ module Yadriggy
|
|
922
922
|
add_child(@name)
|
923
923
|
end
|
924
924
|
|
925
|
+
def op_symbol(op)
|
926
|
+
if op.is_a?(Array)
|
927
|
+
op = has_tag?(op, :@period)
|
928
|
+
op[1].to_sym
|
929
|
+
else
|
930
|
+
# Ruby 2.5 or earlier
|
931
|
+
op
|
932
|
+
end
|
933
|
+
end
|
934
|
+
|
925
935
|
def initialize_args(args_block)
|
926
936
|
args = if args_block[0] == :args_add_block
|
927
937
|
args_block[1]
|
@@ -1380,7 +1390,7 @@ module Yadriggy
|
|
1380
1390
|
if body.is_a?(Array) && body.length > 0 && body[0] == :bodystmt
|
1381
1391
|
bodystmnt = body[1]
|
1382
1392
|
@rescue = Rescue.make(body[2], body[3], body[4])
|
1383
|
-
else # if Ruby 2.
|
1393
|
+
else # if Ruby 2.5 or earlier
|
1384
1394
|
bodystmnt = body
|
1385
1395
|
@rescue = nil
|
1386
1396
|
end
|
@@ -1488,8 +1498,14 @@ module Yadriggy
|
|
1488
1498
|
if else_expr.nil?
|
1489
1499
|
@else = nil
|
1490
1500
|
else
|
1491
|
-
|
1492
|
-
|
1501
|
+
if !else_expr.nil? && else_expr[0].is_a?(Array)
|
1502
|
+
else_body = else_expr
|
1503
|
+
else
|
1504
|
+
# Ruby 2.4 or earlier
|
1505
|
+
elsexpr = has_tag?(else_expr, :else)
|
1506
|
+
else_body = else_expr[1]
|
1507
|
+
end
|
1508
|
+
@else = Exprs.make(else_body)
|
1493
1509
|
add_child(@else)
|
1494
1510
|
end
|
1495
1511
|
|
data/lib/yadriggy/checker.rb
CHANGED
@@ -36,6 +36,7 @@ module Yadriggy
|
|
36
36
|
[@rules, @rule_declarators]
|
37
37
|
end
|
38
38
|
|
39
|
+
# @api private
|
39
40
|
private_class_method def self.init_class
|
40
41
|
@rules = {}
|
41
42
|
@rule_declarators = {}
|
@@ -56,6 +57,7 @@ module Yadriggy
|
|
56
57
|
find_rule_entry2(ast.class, ast.usertype)
|
57
58
|
end
|
58
59
|
|
60
|
+
# @api private
|
59
61
|
private_class_method def self.find_rule_entry2(ast_class, utype)
|
60
62
|
unless utype.nil?
|
61
63
|
rule = @rules[utype]
|
@@ -147,7 +149,7 @@ module Yadriggy
|
|
147
149
|
# This is the entry point of the checker. It may also
|
148
150
|
# check the other ASTs invoked in the given AST.
|
149
151
|
#
|
150
|
-
# @param [ASTree|ASTnode] an_ast the AST.
|
152
|
+
# @param [ASTree|ASTnode|nil] an_ast the AST.
|
151
153
|
# @return [Object]
|
152
154
|
def check_all(an_ast)
|
153
155
|
return nil if an_ast.nil?
|
@@ -162,6 +164,9 @@ module Yadriggy
|
|
162
164
|
end
|
163
165
|
|
164
166
|
# Makes a new base environment with the given context class.
|
167
|
+
# It is called by `check_all`. Override this method to customize
|
168
|
+
# `check_all`.
|
169
|
+
#
|
165
170
|
# @param [Module] klass the context class.
|
166
171
|
def make_base_env(klass)
|
167
172
|
klass
|
@@ -191,7 +196,7 @@ module Yadriggy
|
|
191
196
|
# internal use only
|
192
197
|
def apply_typing_rule(rule, an_ast, ast_tenv)
|
193
198
|
if rule.nil?
|
194
|
-
error_found!(an_ast, "no
|
199
|
+
error_found!(an_ast, "no rule for #{an_ast.class}")
|
195
200
|
else
|
196
201
|
old_ast = @current_ast
|
197
202
|
old_tenv = @current_env
|
@@ -210,7 +215,7 @@ module Yadriggy
|
|
210
215
|
# Applies the rule supplied by the superclass.
|
211
216
|
# @param [ASTnode] an_ast an AST.
|
212
217
|
# @param [Object] envi an environment object.
|
213
|
-
# @return [
|
218
|
+
# @return [Object] the result of the application.
|
214
219
|
def proceed(an_ast, envi=nil)
|
215
220
|
rule = if @rule_declarator&.superclass == Object
|
216
221
|
nil
|
data/lib/yadriggy/py/codegen.rb
CHANGED
@@ -333,6 +333,21 @@ module Yadriggy
|
|
333
333
|
print_lambda(ast.block)
|
334
334
|
end
|
335
335
|
|
336
|
+
rule(:with_call) do
|
337
|
+
pairs = ast.args[0].pairs
|
338
|
+
# ast.args[0].pairs[0][1]
|
339
|
+
@printer << 'with '
|
340
|
+
print_each(ast.args[0].pairs, true) do |expr_var|
|
341
|
+
print(expr_var[0])
|
342
|
+
@printer << ' as '
|
343
|
+
print(expr_var[1])
|
344
|
+
end
|
345
|
+
@printer << ':'
|
346
|
+
@printer.down
|
347
|
+
print(ast.block.body)
|
348
|
+
@printer.up
|
349
|
+
end
|
350
|
+
|
336
351
|
rule(Conditional) do
|
337
352
|
if ast.op == :if
|
338
353
|
@printer << ast.op << ' '
|
data/lib/yadriggy/py/python.rb
CHANGED
@@ -2,77 +2,13 @@
|
|
2
2
|
|
3
3
|
require 'pycall'
|
4
4
|
require 'yadriggy'
|
5
|
+
require 'yadriggy/py/syntax'
|
5
6
|
require 'yadriggy/py/codegen'
|
6
7
|
require 'yadriggy/py/py_typechecker'
|
7
8
|
require 'yadriggy/py/import'
|
8
9
|
|
9
10
|
module Yadriggy
|
10
11
|
module Py
|
11
|
-
|
12
|
-
Syntax = Yadriggy.define_syntax do
|
13
|
-
expr = Name | Number | Super | Binary | Unary | ternary |
|
14
|
-
StringLiteral | Lambda |
|
15
|
-
ArrayLiteral | Paren | lambda_call | fun_call | ArrayRef | HashLiteral
|
16
|
-
stmnt = Return | ForLoop | Loop | if_stmnt | Break |
|
17
|
-
BeginEnd | Def | ModuleDef
|
18
|
-
exprs = Exprs | stmnt | expr
|
19
|
-
|
20
|
-
Name = { name: String }
|
21
|
-
Number = { value: Numeric }
|
22
|
-
VariableCall = Name
|
23
|
-
InstanceVariable = nil
|
24
|
-
GlobalVariable = nil
|
25
|
-
Reserved = Name
|
26
|
-
Const = Name
|
27
|
-
Binary = { left: expr, op: Symbol, right: expr }
|
28
|
-
ArrayRef = { array: expr, indexes: expr }
|
29
|
-
ArrayRefField = ArrayRef
|
30
|
-
Assign = { left: [expr] | expr, op: Symbol,
|
31
|
-
right: [expr] | expr }
|
32
|
-
Dots = Binary
|
33
|
-
Unary = { op: Symbol, operand: expr }
|
34
|
-
StringLiteral = { value: String }
|
35
|
-
ArrayLiteral = { elements: ForLoop | [ expr ] }
|
36
|
-
Paren = { expression: expr }
|
37
|
-
HashLiteral = { pairs: [ (expr|Label|SymbolLiteral) * expr ] }
|
38
|
-
Return = { values: [ expr ] }
|
39
|
-
ForLoop = {vars: [ Identifier ], set: expr, body: exprs }
|
40
|
-
Loop = { op: :while, cond: expr, body: exprs }
|
41
|
-
Break = { values: nil }
|
42
|
-
if_stmnt = Conditional + { op: :if, cond: expr, then: exprs,
|
43
|
-
all_elsif: [expr * exprs], else: (exprs) }
|
44
|
-
ternary = Conditional + { op: :ifop, cond: expr, then: expr,
|
45
|
-
all_elsif: nil, else: expr }
|
46
|
-
Parameters = { params: [ Identifier ],
|
47
|
-
optionals: [ Identifier * expr ],
|
48
|
-
rest_of_params: (Identifier),
|
49
|
-
params_after_rest: [ Identifier ],
|
50
|
-
keywords: [ Label * expr ],
|
51
|
-
rest_of_keywords: (Identifier),
|
52
|
-
block_param: (Identifier) }
|
53
|
-
Block = Parameters + { body: exprs }
|
54
|
-
Lambda = Block + { body: expr } # -> (x) { x + 1 }
|
55
|
-
lambda_name = { name: "lambda" }
|
56
|
-
lambda_call = Call + { receiver: nil, op: nil, name: lambda_name,
|
57
|
-
args: nil, block_arg: nil, block: Block }
|
58
|
-
fun_call = Call + { receiver: (expr), op: (Symbol), name: Identifier,
|
59
|
-
args: [ expr ], block_arg: nil, block: nil }
|
60
|
-
Command = fun_call
|
61
|
-
Exprs = { expressions: [ exprs ] }
|
62
|
-
Rescue = { types: [ Const | ConstPathRef ],
|
63
|
-
parameter: (Identifier),
|
64
|
-
body: (exprs), nested_rescue: (Rescue),
|
65
|
-
else: (exprs), ensure: (exprs) }
|
66
|
-
BeginEnd = { body: exprs, rescue: (Rescue) }
|
67
|
-
Def = Parameters +
|
68
|
-
{ singular: (expr), name: Identifier, body: exprs,
|
69
|
-
rescue: (Rescue) }
|
70
|
-
ModuleDef = { name: Const | ConstPathRef, body: exprs,
|
71
|
-
rescue: (Rescue) }
|
72
|
-
ClassDef = ModuleDef +
|
73
|
-
{ superclass: (Const | ConstPathRef) }
|
74
|
-
end
|
75
|
-
|
76
12
|
def self.run(&blk)
|
77
13
|
ast = Yadriggy::reify(blk)
|
78
14
|
Syntax.raise_error unless Syntax.check(ast.tree)
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# Copyright (C) 2018- Shigeru Chiba. All rights reserved.
|
2
|
+
|
3
|
+
require 'yadriggy'
|
4
|
+
|
5
|
+
module Yadriggy
|
6
|
+
module Py
|
7
|
+
Syntax = Yadriggy.define_syntax do
|
8
|
+
expr = Name | Number | Super | Binary | Unary | ternary |
|
9
|
+
StringLiteral | Lambda |
|
10
|
+
ArrayLiteral | Paren | lambda_call | with_call | fun_call |
|
11
|
+
ArrayRef | HashLiteral
|
12
|
+
stmnt = Return | ForLoop | Loop | if_stmnt | Break |
|
13
|
+
BeginEnd | Def | ModuleDef
|
14
|
+
exprs = Exprs | stmnt | expr
|
15
|
+
|
16
|
+
Name = { name: String }
|
17
|
+
Number = { value: Numeric }
|
18
|
+
VariableCall = Name
|
19
|
+
InstanceVariable = nil
|
20
|
+
GlobalVariable = nil
|
21
|
+
Reserved = Name
|
22
|
+
Const = Name
|
23
|
+
Binary = { left: expr, op: Symbol, right: expr }
|
24
|
+
ArrayRef = { array: expr, indexes: expr }
|
25
|
+
ArrayRefField = ArrayRef
|
26
|
+
Assign = { left: [expr] | expr, op: Symbol,
|
27
|
+
right: [expr] | expr }
|
28
|
+
Dots = Binary
|
29
|
+
Unary = { op: Symbol, operand: expr }
|
30
|
+
StringLiteral = { value: String }
|
31
|
+
ArrayLiteral = { elements: ForLoop | [ expr ] }
|
32
|
+
Paren = { expression: expr }
|
33
|
+
HashLiteral = { pairs: [ (expr|Label|SymbolLiteral) * expr ] }
|
34
|
+
Return = { values: [ expr ] }
|
35
|
+
ForLoop = {vars: [ Identifier ], set: expr, body: exprs }
|
36
|
+
Loop = { op: :while, cond: expr, body: exprs }
|
37
|
+
Break = { values: nil }
|
38
|
+
if_stmnt = Conditional + { op: :if, cond: expr, then: exprs,
|
39
|
+
all_elsif: [expr * exprs], else: (exprs) }
|
40
|
+
ternary = Conditional + { op: :ifop, cond: expr, then: expr,
|
41
|
+
all_elsif: nil, else: expr }
|
42
|
+
Parameters = { params: [ Identifier ],
|
43
|
+
optionals: [ Identifier * expr ],
|
44
|
+
rest_of_params: (Identifier),
|
45
|
+
params_after_rest: [ Identifier ],
|
46
|
+
keywords: [ Label * expr ],
|
47
|
+
rest_of_keywords: (Identifier),
|
48
|
+
block_param: (Identifier) }
|
49
|
+
Block = Parameters + { body: exprs }
|
50
|
+
Lambda = Block + { body: expr } # -> (x) { x + 1 }
|
51
|
+
lambda_name = { name: "lambda" }
|
52
|
+
lambda_call = Call + { receiver: nil, op: nil, name: lambda_name,
|
53
|
+
args: nil, block_arg: nil, block: Block }
|
54
|
+
with_name = { name: "with" }
|
55
|
+
with_call = Call + { receiver: nil, op: nil, name: with_name,
|
56
|
+
args: HashLiteral, block_arg: nil, block: Block }
|
57
|
+
fun_call = Call + { receiver: (expr), op: (Symbol), name: Identifier,
|
58
|
+
args: [ expr ], block_arg: nil, block: nil }
|
59
|
+
Command = fun_call
|
60
|
+
Exprs = { expressions: [ exprs ] }
|
61
|
+
Rescue = { types: [ Const | ConstPathRef ],
|
62
|
+
parameter: (Identifier),
|
63
|
+
body: (exprs), nested_rescue: (Rescue),
|
64
|
+
else: (exprs), ensure: (exprs) }
|
65
|
+
BeginEnd = { body: exprs, rescue: (Rescue) }
|
66
|
+
Def = Parameters +
|
67
|
+
{ singular: (expr), name: Identifier, body: exprs,
|
68
|
+
rescue: (Rescue) }
|
69
|
+
ModuleDef = { name: Const | ConstPathRef, body: exprs,
|
70
|
+
rescue: (Rescue) }
|
71
|
+
ClassDef = ModuleDef +
|
72
|
+
{ superclass: (Const | ConstPathRef) }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/yadriggy/source_code.rb
CHANGED
@@ -3,10 +3,13 @@
|
|
3
3
|
require 'ripper'
|
4
4
|
require 'pry'
|
5
5
|
|
6
|
+
# Interactive shell.
|
6
7
|
class Pry
|
8
|
+
# Log.
|
7
9
|
class History
|
8
|
-
#
|
9
|
-
# We modify Pry::History::push to record a duplicated line as well.
|
10
|
+
# Records a line.
|
11
|
+
# We modify the original `Pry::History::push` to record a duplicated line as well.
|
12
|
+
# @param [String] line an input.
|
10
13
|
def push(line)
|
11
14
|
unless line.empty? || line.include?("\0")
|
12
15
|
@pusher.call(line)
|
@@ -22,6 +25,14 @@ class Pry
|
|
22
25
|
end
|
23
26
|
|
24
27
|
module Yadriggy
|
28
|
+
# Discards all the code given to Pry before.
|
29
|
+
# This should be called when the code given before includes
|
30
|
+
# a syntax error and hence {reify} cannot obtain an
|
31
|
+
# abstract syntax tree.
|
32
|
+
def self.reset_pry
|
33
|
+
SourceCode.reset_pry
|
34
|
+
end
|
35
|
+
|
25
36
|
# @api private
|
26
37
|
# Retrieves source code in the S-expression style.
|
27
38
|
class SourceCode
|
@@ -40,11 +51,17 @@ module Yadriggy
|
|
40
51
|
prog && [file_name, find_sexp(prog, line)]
|
41
52
|
end
|
42
53
|
|
54
|
+
@pry_offset = 0
|
55
|
+
|
56
|
+
def self.reset_pry
|
57
|
+
@pry_offset = Pry.history.history_line_count - Pry.history.original_lines
|
58
|
+
end
|
59
|
+
|
43
60
|
def self.read_pry_history
|
44
61
|
cmds = Pry.commands
|
45
|
-
his = Pry.history.to_a[Pry.history.original_lines ...
|
62
|
+
his = Pry.history.to_a[Pry.history.original_lines + @pry_offset ...
|
46
63
|
Pry.history.history_line_count]
|
47
|
-
his.reduce(
|
64
|
+
his.reduce("\n" * @pry_offset) do |source, line|
|
48
65
|
if cmds.select {|k,v| v.matches?(line) }.empty?
|
49
66
|
source << line << "\n"
|
50
67
|
else
|
data/lib/yadriggy/typecheck.rb
CHANGED
@@ -160,6 +160,7 @@ module Yadriggy
|
|
160
160
|
end
|
161
161
|
|
162
162
|
# Gets the current type environment.
|
163
|
+
# @return [TypeEnv] the type enviornment.
|
163
164
|
#
|
164
165
|
def type_env
|
165
166
|
@current_env
|
@@ -204,12 +205,17 @@ module Yadriggy
|
|
204
205
|
#
|
205
206
|
# This is an alias of check_all() but it memoizes the results.
|
206
207
|
#
|
208
|
+
# @param [ASTnode|ASTree|nil] an_ast an AST or nil.
|
209
|
+
# @return [Type] the type of the given AST. It memoizes the results.
|
210
|
+
#
|
207
211
|
def typecheck(an_ast)
|
208
212
|
check_all(an_ast)
|
209
213
|
end
|
210
214
|
|
211
215
|
# Makes a new base type environment with the given context class.
|
212
216
|
#
|
217
|
+
# @return [TypeEnv] the type enviornment.
|
218
|
+
#
|
213
219
|
def make_base_env(klass)
|
214
220
|
TypeEnv::BaseTypeEnv.new(klass)
|
215
221
|
end
|
@@ -248,7 +254,7 @@ module Yadriggy
|
|
248
254
|
#
|
249
255
|
# @param [ASTnode|nil] an_ast an AST.
|
250
256
|
# @param [Type] a_type a type.
|
251
|
-
# @return [Type|
|
257
|
+
# @return [Type|DynType] the given type `a_type`.
|
252
258
|
def type_as(an_ast, a_type)
|
253
259
|
if an_ast.nil?
|
254
260
|
DynType
|
data/lib/yadriggy/version.rb
CHANGED
data/yadriggy.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_dependency "ffi"
|
28
28
|
spec.add_dependency "pry"
|
29
29
|
|
30
|
-
spec.add_development_dependency "bundler"
|
30
|
+
spec.add_development_dependency "bundler"
|
31
31
|
spec.add_development_dependency "rake", "~> 10.0"
|
32
32
|
spec.add_development_dependency "yard"
|
33
33
|
# spec.add_development_dependency "minitest", "~> 5.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yadriggy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shigeru Chiba
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-12-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pycall
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,6 +148,7 @@ files:
|
|
148
148
|
- lib/yadriggy/py/import.rb
|
149
149
|
- lib/yadriggy/py/py_typechecker.rb
|
150
150
|
- lib/yadriggy/py/python.rb
|
151
|
+
- lib/yadriggy/py/syntax.rb
|
151
152
|
- lib/yadriggy/ruby_typecheck.rb
|
152
153
|
- lib/yadriggy/ruby_typeinfer.rb
|
153
154
|
- lib/yadriggy/source_code.rb
|