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