refill_script 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []