xdrgen 0.0.1
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/.gitignore +18 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/Guardfile +12 -0
- data/LICENSE.txt +202 -0
- data/README.md +79 -0
- data/Rakefile +6 -0
- data/bin/xdrgen +5 -0
- data/lib/xdrgen.rb +24 -0
- data/lib/xdrgen/ast.rb +81 -0
- data/lib/xdrgen/ast/concerns/contained.rb +32 -0
- data/lib/xdrgen/ast/concerns/has_children.rb +9 -0
- data/lib/xdrgen/ast/concerns/has_definitions.rb +90 -0
- data/lib/xdrgen/ast/concerns/named.rb +16 -0
- data/lib/xdrgen/ast/concerns/namespace.rb +7 -0
- data/lib/xdrgen/ast/concerns/nested_definition.rb +16 -0
- data/lib/xdrgen/ast/constant.rb +7 -0
- data/lib/xdrgen/ast/decimal_constant.rb +7 -0
- data/lib/xdrgen/ast/declarations/array.rb +15 -0
- data/lib/xdrgen/ast/declarations/base.rb +28 -0
- data/lib/xdrgen/ast/declarations/opaque.rb +11 -0
- data/lib/xdrgen/ast/declarations/optional.rb +5 -0
- data/lib/xdrgen/ast/declarations/simple.rb +7 -0
- data/lib/xdrgen/ast/declarations/string.rb +7 -0
- data/lib/xdrgen/ast/declarations/void.rb +7 -0
- data/lib/xdrgen/ast/definitions/base.rb +9 -0
- data/lib/xdrgen/ast/definitions/const.rb +12 -0
- data/lib/xdrgen/ast/definitions/enum.rb +17 -0
- data/lib/xdrgen/ast/definitions/enum_member.rb +44 -0
- data/lib/xdrgen/ast/definitions/namespace.rb +9 -0
- data/lib/xdrgen/ast/definitions/nested_enum.rb +7 -0
- data/lib/xdrgen/ast/definitions/nested_struct.rb +7 -0
- data/lib/xdrgen/ast/definitions/nested_union.rb +7 -0
- data/lib/xdrgen/ast/definitions/struct.rb +18 -0
- data/lib/xdrgen/ast/definitions/struct_body.rb +11 -0
- data/lib/xdrgen/ast/definitions/struct_member.rb +12 -0
- data/lib/xdrgen/ast/definitions/typedef.rb +19 -0
- data/lib/xdrgen/ast/definitions/union.rb +55 -0
- data/lib/xdrgen/ast/definitions/union_arm.rb +33 -0
- data/lib/xdrgen/ast/definitions/union_arm_case.rb +11 -0
- data/lib/xdrgen/ast/definitions/union_body.rb +22 -0
- data/lib/xdrgen/ast/definitions/union_default_arm.rb +19 -0
- data/lib/xdrgen/ast/fixed_size.rb +23 -0
- data/lib/xdrgen/ast/hexadecimal_constant.rb +7 -0
- data/lib/xdrgen/ast/identifier.rb +5 -0
- data/lib/xdrgen/ast/octal_constant.rb +7 -0
- data/lib/xdrgen/ast/top.rb +5 -0
- data/lib/xdrgen/ast/typespecs/base.rb +27 -0
- data/lib/xdrgen/ast/typespecs/bool.rb +5 -0
- data/lib/xdrgen/ast/typespecs/double.rb +5 -0
- data/lib/xdrgen/ast/typespecs/float.rb +5 -0
- data/lib/xdrgen/ast/typespecs/hyper.rb +6 -0
- data/lib/xdrgen/ast/typespecs/int.rb +6 -0
- data/lib/xdrgen/ast/typespecs/opaque.rb +10 -0
- data/lib/xdrgen/ast/typespecs/quadruple.rb +5 -0
- data/lib/xdrgen/ast/typespecs/simple.rb +14 -0
- data/lib/xdrgen/ast/typespecs/string.rb +9 -0
- data/lib/xdrgen/ast/typespecs/unsigned_hyper.rb +5 -0
- data/lib/xdrgen/ast/typespecs/unsigned_int.rb +5 -0
- data/lib/xdrgen/ast/var_size.rb +26 -0
- data/lib/xdrgen/ast/whitespace.rb +5 -0
- data/lib/xdrgen/cli.rb +31 -0
- data/lib/xdrgen/compilation.rb +31 -0
- data/lib/xdrgen/generators.rb +16 -0
- data/lib/xdrgen/generators/base.rb +11 -0
- data/lib/xdrgen/generators/elixir.rb +260 -0
- data/lib/xdrgen/generators/go.rb +578 -0
- data/lib/xdrgen/generators/java.rb +810 -0
- data/lib/xdrgen/generators/java/XdrDataInputStream.erb +122 -0
- data/lib/xdrgen/generators/java/XdrDataOutputStream.erb +96 -0
- data/lib/xdrgen/generators/java/XdrElement.erb +10 -0
- data/lib/xdrgen/generators/java/XdrString.erb +58 -0
- data/lib/xdrgen/generators/javascript.rb +248 -0
- data/lib/xdrgen/generators/ruby.rb +283 -0
- data/lib/xdrgen/grammar/base.treetop +71 -0
- data/lib/xdrgen/grammar/comments.treetop +15 -0
- data/lib/xdrgen/grammar/const.treetop +8 -0
- data/lib/xdrgen/grammar/declaration.treetop +99 -0
- data/lib/xdrgen/grammar/enum.treetop +46 -0
- data/lib/xdrgen/grammar/main.treetop +30 -0
- data/lib/xdrgen/grammar/namespace.treetop +12 -0
- data/lib/xdrgen/grammar/struct.treetop +32 -0
- data/lib/xdrgen/grammar/typedef.treetop +12 -0
- data/lib/xdrgen/grammar/union.treetop +63 -0
- data/lib/xdrgen/output.rb +37 -0
- data/lib/xdrgen/output_file.rb +87 -0
- data/lib/xdrgen/parser.rb +40 -0
- data/lib/xdrgen/version.rb +3 -0
- data/spec/fixtures/generator/block_comments.x +14 -0
- data/spec/fixtures/generator/const.x +4 -0
- data/spec/fixtures/generator/enum.x +36 -0
- data/spec/fixtures/generator/nesting.x +24 -0
- data/spec/fixtures/generator/optional.x +8 -0
- data/spec/fixtures/generator/struct.x +10 -0
- data/spec/fixtures/generator/test.x +77 -0
- data/spec/fixtures/generator/union.x +28 -0
- data/spec/fixtures/parser/block_comments.x +14 -0
- data/spec/fixtures/parser/const.x +1 -0
- data/spec/fixtures/parser/enum.x +35 -0
- data/spec/fixtures/parser/nesting.x +26 -0
- data/spec/fixtures/parser/optional.x +8 -0
- data/spec/fixtures/parser/struct.x +8 -0
- data/spec/fixtures/parser/test.x +77 -0
- data/spec/fixtures/parser/union.x +10 -0
- data/spec/lib/xdrgen/generator_spec.rb +30 -0
- data/spec/lib/xdrgen/output_file_spec.rb +33 -0
- data/spec/lib/xdrgen/parser_spec.rb +27 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/support/fixtures.rb +27 -0
- data/xdrgen.gemspec +32 -0
- metadata +301 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
grammar XdrEnumGrammar
|
|
2
|
+
|
|
3
|
+
rule enum_def
|
|
4
|
+
"enum" space
|
|
5
|
+
identifier space?
|
|
6
|
+
enum_body space?
|
|
7
|
+
";"
|
|
8
|
+
<Xdrgen::AST::Definitions::Enum>
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
rule enum_body
|
|
13
|
+
"{"
|
|
14
|
+
space?
|
|
15
|
+
first_member_n:enum_member
|
|
16
|
+
additional_members_n:(space? "," space? enum_member )*
|
|
17
|
+
space?
|
|
18
|
+
"}"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
rule enum_type_spec
|
|
22
|
+
"enum" space enum_body
|
|
23
|
+
<Xdrgen::AST::Definitions::NestedEnum>
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
rule enum_member
|
|
27
|
+
identifier
|
|
28
|
+
space?
|
|
29
|
+
value_n:enum_value?
|
|
30
|
+
<Xdrgen::AST::Definitions::EnumMember>
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
rule enum_value
|
|
34
|
+
"="
|
|
35
|
+
space?
|
|
36
|
+
val:(enum_value_constant / enum_value_alias)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
rule enum_value_constant
|
|
40
|
+
constant
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
rule enum_value_alias
|
|
44
|
+
identifier
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
grammar XdrMainGrammar
|
|
2
|
+
include XdrBaseGrammar
|
|
3
|
+
include XdrDeclarationGrammar
|
|
4
|
+
include XdrCommentsGrammar
|
|
5
|
+
include XdrEnumGrammar
|
|
6
|
+
include XdrTypedefGrammar
|
|
7
|
+
include XdrStructGrammar
|
|
8
|
+
include XdrUnionGrammar
|
|
9
|
+
include XdrConstGrammar
|
|
10
|
+
include XdrNamespaceGrammar
|
|
11
|
+
|
|
12
|
+
rule top
|
|
13
|
+
children_n:definition*
|
|
14
|
+
<Xdrgen::AST::Top>
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
rule definition
|
|
18
|
+
(
|
|
19
|
+
typedef_def /
|
|
20
|
+
enum_def /
|
|
21
|
+
struct_def /
|
|
22
|
+
union_def /
|
|
23
|
+
const_def /
|
|
24
|
+
namespace_def /
|
|
25
|
+
ampersand_line /
|
|
26
|
+
space
|
|
27
|
+
)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
grammar XdrStructGrammar
|
|
2
|
+
|
|
3
|
+
rule struct_def
|
|
4
|
+
"struct" space
|
|
5
|
+
identifier space?
|
|
6
|
+
struct_body space?
|
|
7
|
+
";"
|
|
8
|
+
<Xdrgen::AST::Definitions::Struct>
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
rule struct_body
|
|
12
|
+
"{"
|
|
13
|
+
space?
|
|
14
|
+
children_n:(struct_member)+
|
|
15
|
+
"}"
|
|
16
|
+
<Xdrgen::AST::Definitions::StructBody>
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
rule struct_member
|
|
20
|
+
declaration
|
|
21
|
+
space?
|
|
22
|
+
";"
|
|
23
|
+
space?
|
|
24
|
+
<Xdrgen::AST::Definitions::StructMember>
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
rule struct_type_spec
|
|
28
|
+
"struct" space struct_body
|
|
29
|
+
<Xdrgen::AST::Definitions::NestedStruct>
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
grammar XdrUnionGrammar
|
|
2
|
+
|
|
3
|
+
rule union_def
|
|
4
|
+
"union" space
|
|
5
|
+
identifier space
|
|
6
|
+
union_body space?
|
|
7
|
+
";"
|
|
8
|
+
<Xdrgen::AST::Definitions::Union>
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
rule union_body
|
|
13
|
+
"switch"
|
|
14
|
+
space?
|
|
15
|
+
"(" discriminant:declaration ")"
|
|
16
|
+
space?
|
|
17
|
+
"{"
|
|
18
|
+
space?
|
|
19
|
+
arms_n:(arm_spec)+
|
|
20
|
+
default_case_n:(default_case_spec)?
|
|
21
|
+
space?
|
|
22
|
+
"}"
|
|
23
|
+
<Xdrgen::AST::Definitions::UnionBody>
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
rule union_type_spec
|
|
27
|
+
"union" space union_body
|
|
28
|
+
<Xdrgen::AST::Definitions::NestedUnion>
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
rule arm_spec
|
|
32
|
+
cases_n:case_spec+
|
|
33
|
+
space?
|
|
34
|
+
declaration
|
|
35
|
+
space?
|
|
36
|
+
";"
|
|
37
|
+
space?
|
|
38
|
+
<Xdrgen::AST::Definitions::UnionArm>
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
rule case_spec
|
|
43
|
+
"case"
|
|
44
|
+
space?
|
|
45
|
+
value
|
|
46
|
+
space?
|
|
47
|
+
":"
|
|
48
|
+
space?
|
|
49
|
+
<Xdrgen::AST::Definitions::UnionArmCase>
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
rule default_case_spec
|
|
54
|
+
"default" space? ":"
|
|
55
|
+
space?
|
|
56
|
+
declaration
|
|
57
|
+
space?
|
|
58
|
+
";"
|
|
59
|
+
<Xdrgen::AST::Definitions::UnionDefaultArm>
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
module Xdrgen
|
|
4
|
+
class Output
|
|
5
|
+
|
|
6
|
+
attr_reader :source_paths
|
|
7
|
+
attr_reader :output_dir
|
|
8
|
+
|
|
9
|
+
def initialize(source_paths, output_dir)
|
|
10
|
+
@source_paths = source_paths
|
|
11
|
+
@output_dir = output_dir
|
|
12
|
+
@files = {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def open(child_path)
|
|
16
|
+
if @files.has_key?(child_path)
|
|
17
|
+
raise Xdrgen::DuplicateFileError, "Cannot open #{child_path} twice"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
path = File.join @output_dir, child_path
|
|
21
|
+
result = @files[child_path] = OutputFile.new(path)
|
|
22
|
+
|
|
23
|
+
yield result if block_given?
|
|
24
|
+
|
|
25
|
+
result
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def write(child_path, content)
|
|
29
|
+
open(child_path){|c| c.puts content}
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def close
|
|
33
|
+
@files.values.each(&:close)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
module Xdrgen
|
|
3
|
+
class OutputFile
|
|
4
|
+
SPACES_PER_INDENT = 2
|
|
5
|
+
|
|
6
|
+
def initialize(path)
|
|
7
|
+
@path = path
|
|
8
|
+
@current_indent = 0
|
|
9
|
+
|
|
10
|
+
FileUtils.mkdir_p File.dirname(@path)
|
|
11
|
+
@io = File.open(@path, 'w')
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def close
|
|
15
|
+
@io.close
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def puts(s="")
|
|
19
|
+
write_break_if_needed
|
|
20
|
+
@io.puts indented(s)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def indent(step=1)
|
|
24
|
+
@current_indent += step
|
|
25
|
+
yield
|
|
26
|
+
ensure
|
|
27
|
+
@current_indent -= step
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def break
|
|
31
|
+
@break_needed = true
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def unbreak
|
|
35
|
+
@break_needed = false
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def balance_after(balance_regex, include_space=false)
|
|
39
|
+
@old_io = @io
|
|
40
|
+
@io = StringIO.new
|
|
41
|
+
yield
|
|
42
|
+
raw = @io.string
|
|
43
|
+
@old_io.puts balance_string(raw, balance_regex, include_space)
|
|
44
|
+
ensure
|
|
45
|
+
@io = @old_io
|
|
46
|
+
@old_io = nil
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
def indented(s)
|
|
51
|
+
s.indent(@current_indent * SPACES_PER_INDENT)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def write_break_if_needed
|
|
55
|
+
return unless @break_needed
|
|
56
|
+
@io.puts ""
|
|
57
|
+
ensure
|
|
58
|
+
@break_needed = false
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def balance_string(raw, balance_regex, include_space)
|
|
62
|
+
lines = raw.split("\n")
|
|
63
|
+
splits = lines.map{|l| split_line_at(l, balance_regex)}
|
|
64
|
+
|
|
65
|
+
max_split_length = splits.map{|s| s.first.length }.compact.max || -1
|
|
66
|
+
max_split_length += 1 if include_space
|
|
67
|
+
|
|
68
|
+
splits.map do |first, rest|
|
|
69
|
+
next first if rest.blank?
|
|
70
|
+
|
|
71
|
+
(first || "").ljust(max_split_length) + rest
|
|
72
|
+
end.join("\n")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def split_line_at(line, regex)
|
|
76
|
+
match = regex.match(line)
|
|
77
|
+
|
|
78
|
+
if match.blank?
|
|
79
|
+
[line.rstrip, nil]
|
|
80
|
+
else
|
|
81
|
+
split_point = match.end(0)
|
|
82
|
+
[line[0...split_point], line[split_point..-1]]
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'treetop'
|
|
2
|
+
|
|
3
|
+
module Xdrgen
|
|
4
|
+
class Parser
|
|
5
|
+
delegate :failure_line, to: :@grammar
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
@grammar = XdrMainGrammarParser.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def parse(data)
|
|
12
|
+
@grammar.parse(data).tap do |tree|
|
|
13
|
+
if(tree.nil?)
|
|
14
|
+
raise Xdrgen::ParseError, "Couldn't parse, failed at: #{@grammar.failure_line}:#{@grammar.failure_column}\n#{@grammar.failure_reason}"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
grammars = %w(
|
|
24
|
+
base
|
|
25
|
+
declaration
|
|
26
|
+
enum
|
|
27
|
+
const
|
|
28
|
+
struct
|
|
29
|
+
union
|
|
30
|
+
typedef
|
|
31
|
+
namespace
|
|
32
|
+
comments
|
|
33
|
+
main
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# load the grammar files
|
|
38
|
+
grammars.each do |g|
|
|
39
|
+
Treetop.load("#{__dir__}/grammar/#{g}.treetop")
|
|
40
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
|
|
2
|
+
enum AccountFlags
|
|
3
|
+
{ // masks for each flag
|
|
4
|
+
AUTH_REQUIRED_FLAG = 0x1
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
/* AccountEntry
|
|
8
|
+
|
|
9
|
+
Main entry representing a user in Stellar. All transactions are performed
|
|
10
|
+
using an account.
|
|
11
|
+
|
|
12
|
+
Other ledger entries created require an account.
|
|
13
|
+
|
|
14
|
+
*/
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
enum MessageType
|
|
2
|
+
{
|
|
3
|
+
ERROR_MSG,
|
|
4
|
+
HELLO,
|
|
5
|
+
DONT_HAVE,
|
|
6
|
+
|
|
7
|
+
GET_PEERS, // gets a list of peers this guy knows about
|
|
8
|
+
PEERS,
|
|
9
|
+
|
|
10
|
+
GET_TX_SET, // gets a particular txset by hash
|
|
11
|
+
TX_SET,
|
|
12
|
+
|
|
13
|
+
GET_VALIDATIONS, // gets validations for a given ledger hash
|
|
14
|
+
VALIDATIONS,
|
|
15
|
+
|
|
16
|
+
TRANSACTION, //pass on a tx you have heard about
|
|
17
|
+
JSON_TRANSACTION,
|
|
18
|
+
|
|
19
|
+
// FBA
|
|
20
|
+
GET_FBA_QUORUMSET,
|
|
21
|
+
FBA_QUORUMSET,
|
|
22
|
+
FBA_MESSAGE
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
enum Color {
|
|
26
|
+
RED=0,
|
|
27
|
+
GREEN=1,
|
|
28
|
+
BLUE=2
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
enum Color2 {
|
|
33
|
+
RED2=RED,
|
|
34
|
+
GREEN2=1,
|
|
35
|
+
BLUE2=2
|
|
36
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
enum UnionKey {
|
|
2
|
+
ONE = 1,
|
|
3
|
+
TWO = 2,
|
|
4
|
+
OFFER = 3
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
typedef int Foo;
|
|
8
|
+
|
|
9
|
+
union MyUnion switch (UnionKey type)
|
|
10
|
+
{
|
|
11
|
+
case ONE:
|
|
12
|
+
struct {
|
|
13
|
+
int someInt;
|
|
14
|
+
} one;
|
|
15
|
+
|
|
16
|
+
case TWO:
|
|
17
|
+
struct {
|
|
18
|
+
int someInt;
|
|
19
|
+
Foo foo;
|
|
20
|
+
} two;
|
|
21
|
+
|
|
22
|
+
case OFFER:
|
|
23
|
+
void;
|
|
24
|
+
};
|