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 +7 -0
- data/exe/refill +12 -0
- data/lib/refill.rb +11 -0
- data/lib/refill/ast.rb +27 -0
- data/lib/refill/compiler.rb +24 -0
- data/lib/refill/lexer.rb +29 -0
- data/lib/refill/parser.rb +30 -0
- data/lib/refill/translator.rb +48 -0
- data/lib/refill/version.rb +3 -0
- metadata +66 -0
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
data/lib/refill.rb
ADDED
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
|
data/lib/refill/lexer.rb
ADDED
@@ -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
|
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: []
|