xdrgen 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
};
|