refill_script 0.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fc1287e350f7b425fa9d25b778db2a441cbf6511
4
+ data.tar.gz: 63964121dbe7e70ef0ee0ae98a31747cac9dfbbe
5
+ SHA512:
6
+ metadata.gz: 6873425e72ce233a2cdedbc7e6c5f0127ffec5a729e7b28c44a0b6d9984ae775b35a38b4776acb5653a3208b39841de733e5d50cc9b0173f2fb10b478d9fb2f7
7
+ data.tar.gz: 96f1540acab8d529096f8e93d7373dfc951b76446e284777834c233dc5ae7da8e862dc5d73ba4e8c9eb81320bdf6fbeb8255263223ac9c0353a6501d6b3929fb
data/exe/refill ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # require 'thor'
4
+
5
+ # class RefillExecutor < Thor
6
+ # end
7
+
8
+ # RefillExecutor.start
9
+
10
+ require 'refill'
11
+
12
+ Refill::Compiler.new.compile('test.refill')
data/lib/refill.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'refill/version'
2
+ require 'refill/lexer'
3
+ require 'refill/ast'
4
+ require 'refill/parser'
5
+ require 'refill/translator'
6
+ require 'refill/compiler'
7
+
8
+ # for dev only
9
+ # TODO separate by env
10
+ require 'irb'
11
+ require 'pp'
data/lib/refill/ast.rb ADDED
@@ -0,0 +1,27 @@
1
+ require 'rltk/ast'
2
+
3
+ module Refill
4
+ module AST
5
+ class Expression < RLTK::ASTNode
6
+ end
7
+
8
+ class Expressions < RLTK::ASTNode
9
+ value :expressions, Array
10
+ end
11
+
12
+ class Integer < Expression
13
+ value :value, ::Integer
14
+ end
15
+
16
+ class Literal < Expression
17
+ value :value, ::String
18
+ end
19
+
20
+ class BinaryExpr < Expression
21
+ child :left, Expression
22
+ child :right, Expression
23
+ end
24
+
25
+ class Addition < BinaryExpr; end
26
+ end
27
+ end
@@ -0,0 +1,24 @@
1
+ module Refill
2
+ class Compiler
3
+ # TODOC
4
+ # @param [String, Pathname, File] source
5
+ def compile source, output: :nil
6
+ source = File.read source
7
+
8
+ # TODO logger
9
+ puts "source:\n#{source.inspect}"
10
+
11
+ ast_root = Refill::Parser::parse(Refill::Lexer::lex(source), parse_tree: File.open('./parse_tree.dot', 'w'), verbose: false)
12
+
13
+ # TODO
14
+ # dot -Tpng ./parse_tree.dot -o parse_tree.png
15
+
16
+ # TODO proper output option
17
+ output = StringIO.new
18
+ Refill::Translator.new(output: output).translate(ast_root)
19
+
20
+ output.rewind
21
+ puts "output:\n#{output.read}"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ require 'rltk/lexer'
2
+
3
+ module Refill
4
+ class Lexer < RLTK::Lexer
5
+ rule(/\n/) {
6
+ :DELI_LINE
7
+ }
8
+
9
+ # whitespace
10
+ rule(/\ /)
11
+
12
+ rule(/\+/) { :OP_PLUS }
13
+ # rule(/-/) { :OP_SUBTRACT }
14
+ # rule(/=/) { :OP_ASSIGN }
15
+
16
+ # rule(/\(/) { :BR_PAREN_L }
17
+
18
+ rule(/[1-9][0-9]*/) { |t| [:INTEGER, t.to_i] }
19
+
20
+ # string literal
21
+ rule(/"/) { push_state :string }
22
+ rule(/[^"]*/, :string) { |t| [:LITERAL, t.to_s] }
23
+ rule(/"/, :string) { pop_state }
24
+
25
+ rule(/[1-9][0-9]*/) { |t| [:INTEGER, t.to_i] }
26
+
27
+ # rule(/[A-Za-z][A-Za-z0-9]*/) { |t| [:IDENTIFIER, t] }
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ require 'rltk/parser'
2
+
3
+ module Refill
4
+ class Parser < RLTK::Parser
5
+ left :OP_PLUS
6
+
7
+ production :block do
8
+ clause 'expressions' do |e| e end
9
+ end
10
+
11
+ production :expressions do
12
+ clause 'expressions DELI_LINE expression' do |es, _, e|
13
+ AST::Expressions.new ( es.expressions + [e] )
14
+ end
15
+ clause('expressions DELI_LINE'){ |e, _| AST::Expressions.new [e] }
16
+ clause('expression'){ |e| AST::Expressions.new [e] }
17
+ end
18
+
19
+ production :expression do
20
+ clause('INTEGER') { |i| AST::Integer.new i }
21
+ clause('LITERAL') { |l| AST::Literal.new l }
22
+
23
+ clause('expression OP_PLUS expression') { |e0, _, e1| AST::Addition.new e0, e1 }
24
+ end
25
+
26
+ finalize
27
+ # TODO optimize via table
28
+ # finalize(use: 'refill.table')
29
+ end
30
+ end
@@ -0,0 +1,48 @@
1
+ module Refill
2
+ class Translator
3
+ def initialize output:
4
+ @output = output
5
+ end
6
+
7
+ def translate node
8
+ # TODO logger
9
+ puts "translating node #{node.class}"
10
+
11
+ case node
12
+ when AST::Expressions
13
+ translate_and_write_expressions node
14
+ else
15
+ raise 'UnknownNode'
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def translate_and_write_expressions expressions
22
+ expressions.expressions.each do |e|
23
+ case e
24
+ when AST::Expressions
25
+ translate_and_write_expressions e
26
+ when AST::Expression
27
+ @output.write "#{translate_expression e}\n"
28
+ else
29
+ raise 'UnknownExpressions'
30
+ end
31
+ end
32
+ end
33
+
34
+ def translate_expression expression
35
+ case expression
36
+ when AST::Addition
37
+ return "( #{translate_expression expression.left} + #{translate_expression expression.right} )"
38
+ when AST::Integer
39
+ return "( #{expression.value.to_s} )"
40
+ when AST::Literal
41
+ return "( \"#{expression.value.to_s}\" )"
42
+ else
43
+ raise 'UnknownExpression'
44
+ end
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,3 @@
1
+ module Refill
2
+ VERSION = '0.0.0'
3
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: refill_script
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Nano WANG
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-01-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rltk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description:
28
+ email: namiheike@gamil.com
29
+ executables:
30
+ - refill
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - exe/refill
35
+ - lib/refill.rb
36
+ - lib/refill/ast.rb
37
+ - lib/refill/compiler.rb
38
+ - lib/refill/lexer.rb
39
+ - lib/refill/parser.rb
40
+ - lib/refill/translator.rb
41
+ - lib/refill/version.rb
42
+ homepage: http://github.com/refill-script/refill-script
43
+ licenses:
44
+ - MIT
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 2.6.8
63
+ signing_key:
64
+ specification_version: 4
65
+ summary: Another cup of coffee-script.
66
+ test_files: []