xdrgen 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +4 -0
  5. data/Guardfile +12 -0
  6. data/LICENSE.txt +202 -0
  7. data/README.md +79 -0
  8. data/Rakefile +6 -0
  9. data/bin/xdrgen +5 -0
  10. data/lib/xdrgen.rb +24 -0
  11. data/lib/xdrgen/ast.rb +81 -0
  12. data/lib/xdrgen/ast/concerns/contained.rb +32 -0
  13. data/lib/xdrgen/ast/concerns/has_children.rb +9 -0
  14. data/lib/xdrgen/ast/concerns/has_definitions.rb +90 -0
  15. data/lib/xdrgen/ast/concerns/named.rb +16 -0
  16. data/lib/xdrgen/ast/concerns/namespace.rb +7 -0
  17. data/lib/xdrgen/ast/concerns/nested_definition.rb +16 -0
  18. data/lib/xdrgen/ast/constant.rb +7 -0
  19. data/lib/xdrgen/ast/decimal_constant.rb +7 -0
  20. data/lib/xdrgen/ast/declarations/array.rb +15 -0
  21. data/lib/xdrgen/ast/declarations/base.rb +28 -0
  22. data/lib/xdrgen/ast/declarations/opaque.rb +11 -0
  23. data/lib/xdrgen/ast/declarations/optional.rb +5 -0
  24. data/lib/xdrgen/ast/declarations/simple.rb +7 -0
  25. data/lib/xdrgen/ast/declarations/string.rb +7 -0
  26. data/lib/xdrgen/ast/declarations/void.rb +7 -0
  27. data/lib/xdrgen/ast/definitions/base.rb +9 -0
  28. data/lib/xdrgen/ast/definitions/const.rb +12 -0
  29. data/lib/xdrgen/ast/definitions/enum.rb +17 -0
  30. data/lib/xdrgen/ast/definitions/enum_member.rb +44 -0
  31. data/lib/xdrgen/ast/definitions/namespace.rb +9 -0
  32. data/lib/xdrgen/ast/definitions/nested_enum.rb +7 -0
  33. data/lib/xdrgen/ast/definitions/nested_struct.rb +7 -0
  34. data/lib/xdrgen/ast/definitions/nested_union.rb +7 -0
  35. data/lib/xdrgen/ast/definitions/struct.rb +18 -0
  36. data/lib/xdrgen/ast/definitions/struct_body.rb +11 -0
  37. data/lib/xdrgen/ast/definitions/struct_member.rb +12 -0
  38. data/lib/xdrgen/ast/definitions/typedef.rb +19 -0
  39. data/lib/xdrgen/ast/definitions/union.rb +55 -0
  40. data/lib/xdrgen/ast/definitions/union_arm.rb +33 -0
  41. data/lib/xdrgen/ast/definitions/union_arm_case.rb +11 -0
  42. data/lib/xdrgen/ast/definitions/union_body.rb +22 -0
  43. data/lib/xdrgen/ast/definitions/union_default_arm.rb +19 -0
  44. data/lib/xdrgen/ast/fixed_size.rb +23 -0
  45. data/lib/xdrgen/ast/hexadecimal_constant.rb +7 -0
  46. data/lib/xdrgen/ast/identifier.rb +5 -0
  47. data/lib/xdrgen/ast/octal_constant.rb +7 -0
  48. data/lib/xdrgen/ast/top.rb +5 -0
  49. data/lib/xdrgen/ast/typespecs/base.rb +27 -0
  50. data/lib/xdrgen/ast/typespecs/bool.rb +5 -0
  51. data/lib/xdrgen/ast/typespecs/double.rb +5 -0
  52. data/lib/xdrgen/ast/typespecs/float.rb +5 -0
  53. data/lib/xdrgen/ast/typespecs/hyper.rb +6 -0
  54. data/lib/xdrgen/ast/typespecs/int.rb +6 -0
  55. data/lib/xdrgen/ast/typespecs/opaque.rb +10 -0
  56. data/lib/xdrgen/ast/typespecs/quadruple.rb +5 -0
  57. data/lib/xdrgen/ast/typespecs/simple.rb +14 -0
  58. data/lib/xdrgen/ast/typespecs/string.rb +9 -0
  59. data/lib/xdrgen/ast/typespecs/unsigned_hyper.rb +5 -0
  60. data/lib/xdrgen/ast/typespecs/unsigned_int.rb +5 -0
  61. data/lib/xdrgen/ast/var_size.rb +26 -0
  62. data/lib/xdrgen/ast/whitespace.rb +5 -0
  63. data/lib/xdrgen/cli.rb +31 -0
  64. data/lib/xdrgen/compilation.rb +31 -0
  65. data/lib/xdrgen/generators.rb +16 -0
  66. data/lib/xdrgen/generators/base.rb +11 -0
  67. data/lib/xdrgen/generators/elixir.rb +260 -0
  68. data/lib/xdrgen/generators/go.rb +578 -0
  69. data/lib/xdrgen/generators/java.rb +810 -0
  70. data/lib/xdrgen/generators/java/XdrDataInputStream.erb +122 -0
  71. data/lib/xdrgen/generators/java/XdrDataOutputStream.erb +96 -0
  72. data/lib/xdrgen/generators/java/XdrElement.erb +10 -0
  73. data/lib/xdrgen/generators/java/XdrString.erb +58 -0
  74. data/lib/xdrgen/generators/javascript.rb +248 -0
  75. data/lib/xdrgen/generators/ruby.rb +283 -0
  76. data/lib/xdrgen/grammar/base.treetop +71 -0
  77. data/lib/xdrgen/grammar/comments.treetop +15 -0
  78. data/lib/xdrgen/grammar/const.treetop +8 -0
  79. data/lib/xdrgen/grammar/declaration.treetop +99 -0
  80. data/lib/xdrgen/grammar/enum.treetop +46 -0
  81. data/lib/xdrgen/grammar/main.treetop +30 -0
  82. data/lib/xdrgen/grammar/namespace.treetop +12 -0
  83. data/lib/xdrgen/grammar/struct.treetop +32 -0
  84. data/lib/xdrgen/grammar/typedef.treetop +12 -0
  85. data/lib/xdrgen/grammar/union.treetop +63 -0
  86. data/lib/xdrgen/output.rb +37 -0
  87. data/lib/xdrgen/output_file.rb +87 -0
  88. data/lib/xdrgen/parser.rb +40 -0
  89. data/lib/xdrgen/version.rb +3 -0
  90. data/spec/fixtures/generator/block_comments.x +14 -0
  91. data/spec/fixtures/generator/const.x +4 -0
  92. data/spec/fixtures/generator/enum.x +36 -0
  93. data/spec/fixtures/generator/nesting.x +24 -0
  94. data/spec/fixtures/generator/optional.x +8 -0
  95. data/spec/fixtures/generator/struct.x +10 -0
  96. data/spec/fixtures/generator/test.x +77 -0
  97. data/spec/fixtures/generator/union.x +28 -0
  98. data/spec/fixtures/parser/block_comments.x +14 -0
  99. data/spec/fixtures/parser/const.x +1 -0
  100. data/spec/fixtures/parser/enum.x +35 -0
  101. data/spec/fixtures/parser/nesting.x +26 -0
  102. data/spec/fixtures/parser/optional.x +8 -0
  103. data/spec/fixtures/parser/struct.x +8 -0
  104. data/spec/fixtures/parser/test.x +77 -0
  105. data/spec/fixtures/parser/union.x +10 -0
  106. data/spec/lib/xdrgen/generator_spec.rb +30 -0
  107. data/spec/lib/xdrgen/output_file_spec.rb +33 -0
  108. data/spec/lib/xdrgen/parser_spec.rb +27 -0
  109. data/spec/spec_helper.rb +13 -0
  110. data/spec/support/fixtures.rb +27 -0
  111. data/xdrgen.gemspec +32 -0
  112. 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,12 @@
1
+ grammar XdrNamespaceGrammar
2
+
3
+ rule namespace_def
4
+ "namespace" space
5
+ identifier space?
6
+ "{"
7
+ children_n:definition*
8
+ "}"
9
+ <Xdrgen::AST::Definitions::Namespace>
10
+ end
11
+
12
+ 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,12 @@
1
+ grammar XdrTypedefGrammar
2
+
3
+ rule typedef_def
4
+ "typedef"
5
+ space
6
+ declaration
7
+ space?
8
+ ";"
9
+ <Xdrgen::AST::Definitions::Typedef>
10
+ end
11
+
12
+ 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,3 @@
1
+ module Xdrgen
2
+ VERSION = "0.0.1"
3
+ 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,4 @@
1
+ const FOO = 1;
2
+
3
+ typedef int TestArray[FOO];
4
+ typedef int TestArray2<FOO>;
@@ -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
+ };