riml 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
data/lib/repl.rb CHANGED
@@ -1,24 +1,41 @@
1
- require 'readline'
1
+ begin
2
+ require 'readline'
3
+ rescue LoadError => e
4
+ $stderr.puts e, "Readline is required to run repl."
5
+ exit 1
6
+ end
2
7
  require_relative 'riml'
3
8
 
4
9
  module Riml
5
10
  class Repl
6
11
  attr_reader :line
12
+ attr_reader :parser, :compiler
13
+ private :parser, :compiler
14
+
15
+ EXIT_ON = %w(quit exit q e)
16
+ COMPILE_ON = %w(compile c)
17
+ RELOAD_ON = %w(reload reload!)
7
18
 
8
19
  def initialize(vi_readline = false)
9
20
  @indent_amount = 0
10
21
  @line = nil
22
+ prepare_new_context
11
23
  Readline.vi_editing_mode if vi_readline
24
+ trap(:INT) { reset!; puts }
12
25
  end
13
26
 
14
27
  def run
15
28
  while @line = Readline.readline(current_indent, true)
16
29
  line.strip!
17
30
  next if line.empty?
18
- exit_repl if line == 'quit' || line == 'q'
19
- if line == 'c'
31
+ line_dc = line.downcase
32
+ exit_repl if EXIT_ON.include?(line_dc)
33
+ if COMPILE_ON.include?(line_dc)
20
34
  next if current_compilation_unit.empty?
21
35
  compile_unit!
36
+ elsif RELOAD_ON.include?(line_dc)
37
+ reload!
38
+ puts "reloaded"
22
39
  else
23
40
  current_compilation_unit << line
24
41
  check_indents
@@ -28,28 +45,49 @@ module Riml
28
45
 
29
46
  private
30
47
 
48
+ def prepare_new_context
49
+ @compiler = Compiler.new
50
+ @parser = Parser.new
51
+ end
52
+ alias reload! prepare_new_context
53
+
31
54
  def check_indents
32
- @lexer = Lexer.new("#{line}\n")
33
- @lexer.ignore_indentation_check = true
34
- @lexer.tokenize
35
- indent = @lexer.current_indent
36
- @indent_amount += indent
55
+ lexer = Lexer.new(line)
56
+ lexer.ignore_indentation_check = true
57
+ lexer.tokenize
58
+ @indent_amount += lexer.current_indent
59
+ rescue => e
60
+ print_error(e)
61
+ reset!
37
62
  end
38
63
 
39
64
  def current_indent
40
- " " * @indent_amount.abs
65
+ return '' if @indent_amount <= 0
66
+ ' ' * @indent_amount
41
67
  end
42
68
 
43
69
  def compile_unit!
44
- @indent_amount = 0
45
- puts Riml.compile(current_compilation_unit.join("\n"))
46
- current_compilation_unit.clear
70
+ puts Riml.compile(current_compilation_unit.join("\n"), parser, compiler), "\n"
71
+ rescue => e
72
+ raise unless e.kind_of?(RimlError)
73
+ print_error(e)
74
+ ensure
75
+ reset!
47
76
  end
48
77
 
49
78
  def current_compilation_unit
50
79
  @current_compilation_unit ||= []
51
80
  end
52
81
 
82
+ def reset!
83
+ @indent_amount = 0
84
+ current_compilation_unit.clear
85
+ end
86
+
87
+ def print_error(e)
88
+ puts "#{e.class}: #{e}"
89
+ end
90
+
53
91
  def exit_repl
54
92
  exit
55
93
  end
data/lib/riml.rb CHANGED
@@ -28,14 +28,15 @@ module Riml
28
28
  source = input.read
29
29
  nodes = parser.parse(source)
30
30
  else
31
- raise ArgumentError, "input must be nodes, tokens or code, is #{input.class}"
31
+ raise ArgumentError, "input must be nodes, tokens, code or file, is #{input.class}"
32
32
  end
33
+ compiler.parser = parser
33
34
  output = compiler.compile(nodes)
34
35
  return output unless input.is_a?(File)
35
36
  write_file(output, input.path)
36
37
  ensure
37
38
  input.close if input.is_a?(File)
38
- process_compile_queue!(parser, compiler)
39
+ process_compile_queue!(compiler)
39
40
  end
40
41
 
41
42
  # expects `file_names` to be readable files
@@ -79,15 +80,16 @@ module Riml
79
80
  # and we process this queue after each source we compile. We pass the same
80
81
  # parser instance to share Class state, as this state belongs to the
81
82
  # AST_Rewriter's `ClassMap`.
82
- def self.process_compile_queue!(parser, compiler)
83
+ def self.process_compile_queue!(compiler)
83
84
  return true if compiler.compile_queue.empty?
84
85
 
85
86
  file_name = compiler.compile_queue.shift
86
- compile(File.open(File.join(Riml.source_path, file_name)), parser)
87
- process_compile_queue!(parser, compiler)
87
+ compile(File.open(File.join(Riml.source_path, file_name)), compiler.parser)
88
+ process_compile_queue!(compiler)
88
89
  end
89
90
 
90
91
  FILE_HEADER = File.read(File.expand_path("../header.vim", __FILE__)) % VERSION.join('.')
92
+ INCLUDE_COMMENT_FMT = File.read(File.expand_path("../included.vim", __FILE__))
91
93
 
92
94
  def self.write_file(output, fname)
93
95
  file_basename = File.basename(fname)
data/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Riml
2
- # last changed: Jan. 13, 2013
3
- VERSION = [0,1,8]
2
+ # last changed: Mar. 2, 2013
3
+ VERSION = [0,1,9]
4
4
  end
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.1.8
4
+ version: 0.1.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-13 00:00:00.000000000Z
12
+ date: 2013-03-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: racc
16
- requirement: &80512100 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,12 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *80512100
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  description: ! " Riml is a superset of VimL that includes some nice features:\n classes,
26
31
  string interpolation, heredocs, default case-sensitive string\n comparison and
27
32
  other things most programmers take for granted.\n"
@@ -35,19 +40,20 @@ files:
35
40
  - LICENSE
36
41
  - version.rb
37
42
  - lib/parser.rb
38
- - lib/class_map.rb
39
- - lib/errors.rb
40
- - lib/repl.rb
41
43
  - lib/walker.rb
44
+ - lib/class_map.rb
45
+ - lib/included.vim
46
+ - lib/constants.rb
47
+ - lib/lexer.rb
48
+ - lib/grammar.y
49
+ - lib/compiler.rb
50
+ - lib/environment.rb
42
51
  - lib/header.vim
43
- - lib/ast_rewriter.rb
52
+ - lib/repl.rb
44
53
  - lib/riml.rb
45
- - lib/compiler.rb
46
54
  - lib/nodes.rb
47
- - lib/environment.rb
48
- - lib/grammar.y
49
- - lib/lexer.rb
50
- - lib/constants.rb
55
+ - lib/errors.rb
56
+ - lib/ast_rewriter.rb
51
57
  - Rakefile
52
58
  - CONTRIBUTING
53
59
  - Gemfile
@@ -74,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
80
  version: '0'
75
81
  requirements: []
76
82
  rubyforge_project:
77
- rubygems_version: 1.8.10
83
+ rubygems_version: 1.8.25
78
84
  signing_key:
79
85
  specification_version: 3
80
86
  summary: Relaxed VimL (Vimscript)