riml 0.2.8 → 0.2.9
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/Gemfile +1 -0
- data/Gemfile.lock +8 -0
- data/bin/riml +14 -7
- data/lib/compiler.rb +2 -0
- data/lib/grammar.y +1 -0
- data/lib/nodes.rb +8 -1
- data/lib/parser.rb +298 -290
- data/lib/riml.rb +51 -30
- data/version.rb +2 -2
- metadata +2 -2
data/lib/riml.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'pathname'
|
2
|
+
require 'fileutils'
|
2
3
|
|
3
4
|
require File.expand_path('../environment', __FILE__)
|
4
5
|
require 'nodes'
|
@@ -8,30 +9,35 @@ require 'compiler'
|
|
8
9
|
require 'warning_buffer'
|
9
10
|
|
10
11
|
module Riml
|
11
|
-
# lex code into tokens
|
12
|
+
# lex code (String) into tokens (Array)
|
12
13
|
def self.lex(code)
|
13
14
|
Lexer.new(code).tokenize
|
14
15
|
end
|
15
16
|
|
16
|
-
# parse
|
17
|
+
# parse tokens (Array) or code (String) into AST (Nodes)
|
17
18
|
def self.parse(input, ast_rewriter = AST_Rewriter.new, filename = nil)
|
18
19
|
unless input.is_a?(Array) || input.is_a?(String)
|
19
|
-
raise ArgumentError, "input must be tokens or code,
|
20
|
+
raise ArgumentError, "input must be tokens (Array) or code (String), " \
|
21
|
+
"is #{input.inspect}"
|
20
22
|
end
|
21
23
|
Parser.new.parse(input, ast_rewriter, filename)
|
22
24
|
end
|
23
25
|
|
24
|
-
# compile
|
26
|
+
# compile AST (Nodes), tokens (Array), code (String) or object that returns
|
27
|
+
# String from :read to output code (String). Writes file(s) if `input` is a
|
28
|
+
# File.
|
25
29
|
def self.compile(input, parser = Parser.new, compiler = Compiler.new)
|
26
30
|
if input.is_a?(Nodes)
|
27
31
|
nodes = input
|
28
32
|
elsif input.is_a?(String) || input.is_a?(Array)
|
29
33
|
nodes = parser.parse(input)
|
30
|
-
elsif input.
|
34
|
+
elsif input.respond_to?(:read)
|
31
35
|
source = input.read
|
32
|
-
|
36
|
+
path = input.respond_to?(:path) ? input.path : nil
|
37
|
+
nodes = parser.parse(source, AST_Rewriter.new, path)
|
33
38
|
else
|
34
|
-
raise ArgumentError, "input must be
|
39
|
+
raise ArgumentError, "input must be one of AST (Nodes), tokens (Array), " \
|
40
|
+
"code (String) or respond_to?(:read), is #{input.inspect}"
|
35
41
|
end
|
36
42
|
|
37
43
|
if compiler.parser == parser
|
@@ -44,7 +50,7 @@ module Riml
|
|
44
50
|
output = compiler.compile(nodes)
|
45
51
|
|
46
52
|
if input.is_a?(File)
|
47
|
-
write_file(output, input.path, compiling_cmdline_file)
|
53
|
+
write_file(compiler, output, input.path, compiling_cmdline_file)
|
48
54
|
else
|
49
55
|
output
|
50
56
|
end
|
@@ -53,15 +59,38 @@ module Riml
|
|
53
59
|
process_compile_queue!(compiler)
|
54
60
|
end
|
55
61
|
|
56
|
-
# expects `
|
62
|
+
# expects `filenames` (String) arguments, to be readable files. Optional options (Hash) as
|
63
|
+
# last argument.
|
57
64
|
def self.compile_files(*filenames)
|
65
|
+
parser, compiler = Parser.new, Compiler.new
|
66
|
+
|
67
|
+
if filenames.last.is_a?(Hash)
|
68
|
+
opts = filenames.pop
|
69
|
+
if dir = opts[:output_dir]
|
70
|
+
compiler.output_dir = dir
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
58
74
|
if filenames.size > 1
|
59
|
-
|
75
|
+
threads = []
|
76
|
+
filenames.each_with_index do |fname, i|
|
77
|
+
if i.zero?
|
78
|
+
_parser, _compiler = parser, compiler
|
79
|
+
else
|
80
|
+
_parser, _compiler = Parser.new, Compiler.new
|
81
|
+
_compiler.output_dir = compiler.output_dir
|
82
|
+
end
|
83
|
+
threads << Thread.new do
|
84
|
+
f = File.open(fname)
|
85
|
+
compile(f, _parser, _compiler)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
threads.each {|t| t.join}
|
60
89
|
elsif filenames.size == 1
|
61
90
|
fname = filenames.first
|
62
91
|
f = File.open(fname)
|
63
92
|
# `compile` will close file handle
|
64
|
-
compile(f)
|
93
|
+
compile(f, parser, compiler)
|
65
94
|
else
|
66
95
|
raise ArgumentError, "need filenames to compile"
|
67
96
|
end
|
@@ -69,10 +98,11 @@ module Riml
|
|
69
98
|
flush_warnings
|
70
99
|
end
|
71
100
|
|
72
|
-
# checks syntax of `input` (
|
101
|
+
# checks syntax of `input` (String).
|
102
|
+
# lexes + parses without going through AST rewriting or compilation
|
73
103
|
def self.check_syntax(input)
|
74
104
|
raise ArgumentError.new(input) unless input.is_a?(String)
|
75
|
-
parse(input,
|
105
|
+
parse(input, nil)
|
76
106
|
true
|
77
107
|
end
|
78
108
|
|
@@ -148,17 +178,6 @@ module Riml
|
|
148
178
|
set_path(name, val)
|
149
179
|
end
|
150
180
|
|
151
|
-
def self.threaded_compile_files(*filenames)
|
152
|
-
threads = []
|
153
|
-
filenames.each do |fname|
|
154
|
-
threads << Thread.new do
|
155
|
-
f = File.open(fname)
|
156
|
-
compile(f)
|
157
|
-
end
|
158
|
-
end
|
159
|
-
threads.each {|t| t.join}
|
160
|
-
end
|
161
|
-
|
162
181
|
# This is for when another file is sourced within a file we're compiling.
|
163
182
|
def self.process_compile_queue!(compiler)
|
164
183
|
while full_path = compiler.compile_queue.shift
|
@@ -172,21 +191,23 @@ module Riml
|
|
172
191
|
FILE_HEADER = File.read(File.expand_path("../header.vim", __FILE__)) % VERSION.join('.')
|
173
192
|
INCLUDE_COMMENT_FMT = File.read(File.expand_path("../included.vim", __FILE__))
|
174
193
|
|
175
|
-
def self.write_file(output, fname, cmdline_file = true)
|
176
|
-
# writing out a file that's compiled from cmdline, output into
|
194
|
+
def self.write_file(compiler, output, fname, cmdline_file = true)
|
195
|
+
# writing out a file that's compiled from cmdline, output into output_dir
|
177
196
|
output_dir = if cmdline_file
|
178
|
-
Dir.getwd
|
197
|
+
compiler.output_dir || Dir.getwd
|
179
198
|
# writing out a riml_source'd file
|
180
199
|
else
|
181
|
-
# absolute path
|
182
|
-
if
|
200
|
+
# absolute path for filename sent from cmdline or from riml_sourced files,
|
201
|
+
# output to that same directory if no --output-dir option is set
|
202
|
+
if fname[0] == File::SEPARATOR && !compiler.output_dir
|
183
203
|
Pathname.new(fname).parent.to_s
|
184
204
|
# relative path
|
185
205
|
else
|
186
|
-
File.join(Dir.getwd, Pathname.new(fname).parent.to_s)
|
206
|
+
File.join(compiler.output_dir || Dir.getwd, Pathname.new(fname).parent.to_s)
|
187
207
|
end
|
188
208
|
end
|
189
209
|
basename_without_riml_ext = File.basename(fname).sub(/\.riml\Z/i, '')
|
210
|
+
FileUtils.mkdir_p(output_dir) unless File.directory?(output_dir)
|
190
211
|
full_path = File.join(output_dir, "#{basename_without_riml_ext}.vim")
|
191
212
|
File.open(full_path, 'w') do |f|
|
192
213
|
f.write FILE_HEADER + output
|
data/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: racc
|