antelope 0.3.2 → 0.4.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.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +25 -25
  3. data/.rspec +3 -3
  4. data/.travis.yml +10 -10
  5. data/.yardopts +7 -7
  6. data/CONTRIBUTING.md +50 -38
  7. data/GENERATORS.md +180 -124
  8. data/Gemfile +7 -7
  9. data/LICENSE.txt +22 -22
  10. data/README.md +240 -104
  11. data/Rakefile +2 -2
  12. data/TODO.md +58 -58
  13. data/antelope.gemspec +29 -28
  14. data/bin/antelope +7 -7
  15. data/examples/deterministic.ace +35 -35
  16. data/examples/example.ace +52 -51
  17. data/examples/example.ace.err +192 -192
  18. data/examples/example.ace.inf +432 -432
  19. data/examples/example.ate +70 -70
  20. data/examples/example.ate.err +192 -192
  21. data/examples/example.ate.inf +432 -432
  22. data/examples/liquidscript.ace +233 -233
  23. data/examples/simple.ace +22 -22
  24. data/lib/antelope/ace/compiler.rb +334 -334
  25. data/lib/antelope/ace/errors.rb +30 -30
  26. data/lib/antelope/ace/scanner/argument.rb +57 -57
  27. data/lib/antelope/ace/scanner/first.rb +89 -89
  28. data/lib/antelope/ace/scanner/second.rb +178 -178
  29. data/lib/antelope/ace/scanner/third.rb +27 -27
  30. data/lib/antelope/ace/scanner.rb +144 -144
  31. data/lib/antelope/ace.rb +47 -47
  32. data/lib/antelope/cli.rb +60 -60
  33. data/lib/antelope/errors.rb +25 -25
  34. data/lib/antelope/generation/constructor/first.rb +86 -86
  35. data/lib/antelope/generation/constructor/follow.rb +105 -105
  36. data/lib/antelope/generation/constructor/nullable.rb +64 -64
  37. data/lib/antelope/generation/constructor.rb +127 -127
  38. data/lib/antelope/generation/errors.rb +17 -17
  39. data/lib/antelope/generation/null.rb +13 -13
  40. data/lib/antelope/generation/recognizer/rule.rb +216 -216
  41. data/lib/antelope/generation/recognizer/state.rb +129 -129
  42. data/lib/antelope/generation/recognizer.rb +177 -177
  43. data/lib/antelope/generation/tableizer.rb +176 -176
  44. data/lib/antelope/generation.rb +15 -15
  45. data/lib/antelope/generator/base/coerce.rb +115 -0
  46. data/lib/antelope/generator/base/extra.rb +50 -0
  47. data/lib/antelope/generator/base.rb +134 -264
  48. data/lib/antelope/generator/c.rb +11 -11
  49. data/lib/antelope/generator/c_header.rb +105 -105
  50. data/lib/antelope/generator/c_source.rb +39 -39
  51. data/lib/antelope/generator/error.rb +34 -34
  52. data/lib/antelope/generator/group.rb +60 -57
  53. data/lib/antelope/generator/html.rb +51 -51
  54. data/lib/antelope/generator/info.rb +47 -47
  55. data/lib/antelope/generator/null.rb +18 -18
  56. data/lib/antelope/generator/output.rb +17 -17
  57. data/lib/antelope/generator/ruby.rb +112 -79
  58. data/lib/antelope/generator/templates/c_header.ant +36 -36
  59. data/lib/antelope/generator/templates/c_source.ant +202 -202
  60. data/lib/antelope/generator/templates/error.erb +40 -0
  61. data/lib/antelope/generator/templates/html/antelope.css +53 -1
  62. data/lib/antelope/generator/templates/html/antelope.html +82 -1
  63. data/lib/antelope/generator/templates/html/antelope.js +9 -1
  64. data/lib/antelope/generator/templates/html/css.ant +53 -53
  65. data/lib/antelope/generator/templates/html/html.ant +82 -82
  66. data/lib/antelope/generator/templates/html/js.ant +9 -9
  67. data/lib/antelope/generator/templates/info.erb +61 -0
  68. data/lib/antelope/generator/templates/{ruby.ant → ruby.erb} +171 -178
  69. data/lib/antelope/generator.rb +62 -66
  70. data/lib/antelope/grammar/generation.rb +76 -76
  71. data/lib/antelope/grammar/loading.rb +84 -84
  72. data/lib/antelope/grammar/precedence.rb +59 -59
  73. data/lib/antelope/grammar/precedences.rb +64 -64
  74. data/lib/antelope/grammar/production.rb +56 -56
  75. data/lib/antelope/grammar/productions.rb +154 -154
  76. data/lib/antelope/grammar/symbols.rb +64 -64
  77. data/lib/antelope/grammar/token/epsilon.rb +23 -23
  78. data/lib/antelope/grammar/token/error.rb +24 -24
  79. data/lib/antelope/grammar/token/nonterminal.rb +15 -15
  80. data/lib/antelope/grammar/token/terminal.rb +15 -15
  81. data/lib/antelope/grammar/token.rb +231 -231
  82. data/lib/antelope/grammar.rb +68 -68
  83. data/lib/antelope/version.rb +6 -6
  84. data/lib/antelope.rb +18 -19
  85. data/optimizations.txt +42 -42
  86. data/spec/antelope/ace/compiler_spec.rb +60 -60
  87. data/spec/antelope/ace/scanner_spec.rb +27 -27
  88. data/spec/antelope/generation/constructor_spec.rb +131 -131
  89. data/spec/fixtures/simple.ace +22 -22
  90. data/spec/spec_helper.rb +39 -39
  91. data/spec/support/benchmark_helper.rb +5 -5
  92. data/spec/support/grammar_helper.rb +14 -14
  93. data/subl/Ace (Ruby).JSON-tmLanguage +94 -94
  94. data/subl/Ace (Ruby).tmLanguage +153 -153
  95. metadata +22 -11
  96. data/lib/antelope/generator/templates/error.ant +0 -34
  97. data/lib/antelope/generator/templates/info.ant +0 -53
  98. data/lib/antelope/template/compiler.rb +0 -78
  99. data/lib/antelope/template/errors.rb +0 -9
  100. data/lib/antelope/template/scanner.rb +0 -109
  101. data/lib/antelope/template.rb +0 -64
  102. data/spec/antelope/template_spec.rb +0 -50
@@ -1,231 +1,231 @@
1
- # encoding: utf-8
2
-
3
- require 'antelope/grammar/token/nonterminal'
4
- require 'antelope/grammar/token/terminal'
5
- require 'antelope/grammar/token/epsilon'
6
- require 'antelope/grammar/token/error'
7
-
8
- module Antelope
9
- class Grammar
10
- # Defines a token type for productions/rules.
11
- #
12
- # @abstract This class should be inherited to define a real token.
13
- # A base class does not match any token; however, any token can
14
- # match the base class.
15
- class Token
16
- # The name of the token.
17
- #
18
- # @return [Symbol]
19
- attr_reader :name
20
-
21
- # The from state that this token is transitioned from. This is
22
- # the _source_. This is used in the constructor in order to
23
- # handle lookahead sets.
24
- #
25
- # @return [Recognizer::State]
26
- attr_reader :from
27
-
28
- # The to state that this token is transitioned to. This is the
29
- # _destination_. This is used in the constructor in order to
30
- # handle lookahead sets.
31
- #
32
- # @return [Recognizer::State]
33
- attr_reader :to
34
-
35
- # The type of the token. This is given by a caret argument to
36
- # the grammar. This is primarily used for generators.
37
- #
38
- # @return [String]
39
- attr_reader :type
40
-
41
- attr_accessor :id
42
-
43
- # Initialize.
44
- #
45
- # @param name [Symbol] the name of the token.
46
- # @param type [String?] the type of the token. For definitions,
47
- # this is the given type of the token (for typed language
48
- # output).
49
- # @param id [String?] the id of the token in the production.
50
- # For some languages, this allows references to the token via
51
- # the id.
52
- # @param value [String?] the value of the token. This is only
53
- # used in output representation to the developer.
54
- def initialize(name, type = nil, id = nil, value = nil)
55
- @name = name
56
- @value = value
57
- @type = type
58
- @id = id
59
- @from = nil
60
- @to = nil
61
- end
62
-
63
- include Comparable
64
-
65
- # Whether or not the token is a terminal.
66
- #
67
- # @abstract
68
- # @return [Boolean]
69
- def terminal?
70
- false
71
- end
72
-
73
- # Whether or not the token is a nonterminal.
74
- #
75
- # @abstract
76
- # @return [Boolean]
77
- def nonterminal?
78
- false
79
- end
80
-
81
- # Whether or not the token is an epsilon token.
82
- #
83
- # @abstract
84
- # @return [Boolean]
85
- def epsilon?
86
- false
87
- end
88
-
89
- # Whether or not the token is an error token.
90
- #
91
- # @abstract
92
- # @return [Boolean]
93
- def error?
94
- false
95
- end
96
-
97
- # Sets the from state of the token and invalidates the cache.
98
- #
99
- # @param state [Recognizer::State]
100
- # @return [void]
101
- def from=(state)
102
- invalidate_cache!
103
- @from = state
104
- end
105
-
106
- # Sets the to state of the token and invalidates the cache.
107
- #
108
- # @param state [Recognizer::State]
109
- # @return [void]
110
- def to=(state)
111
- invalidate_cache!
112
- @to = state
113
- end
114
-
115
- # Sets the type of the token and invalidates the cache.
116
- #
117
- # @param type [String]
118
- # @return [void]
119
- def type=(type)
120
- invalidate_cache!
121
- @type = type
122
- end
123
-
124
- # Gives a string representation of the token. The output is
125
- # formatted like so: `<data>["(" [<from_id>][:<to_id>] ")"]`,
126
- # where `<data>` is either the value (if it's non-nil) or the
127
- # name, `<from_id>` is the from state id, and `<to_id>` is the
128
- # to state id. The last part of the format is optional; if
129
- # neither the from state or to state is non-nil, it's non-
130
- # existant.
131
- #
132
- # @return [String] the string representation.
133
- # @see #from
134
- # @see #to
135
- # @see #name
136
- def to_s
137
- buf = if @value
138
- @value.inspect
139
- else
140
- @name.to_s
141
- end
142
-
143
- if from || to
144
- buf << '('
145
- buf << "#{from.id}" if from
146
- buf << ":#{to.id}" if to
147
- buf << ')'
148
- end
149
-
150
- buf
151
- end
152
-
153
- # Returns a nice inspect.
154
- #
155
- # @return [String]
156
- def inspect
157
- "#<#{self.class} from=#{from.id if from} to=#{to.id if to} " \
158
- "name=#{name.inspect} value=#{@value.inspect}>"
159
- end
160
-
161
- # Compares this class to any other object. If the other object
162
- # is a token, it converts both this class and the other object
163
- # to an array and compares the array. Otherwise, it delegates
164
- # the comparison.
165
- #
166
- # @param other [Object] the other object to compare.
167
- # @return [Numeric]
168
- def <=>(other)
169
- if other.is_a? Token
170
- to_a <=> other.to_a
171
- else
172
- super
173
- end
174
- end
175
-
176
- alias_method :eql?, :==
177
-
178
- # Compares this class and another object, fuzzily. If the other
179
- # object is a token, it removes the transitions (to and from)
180
- # on both objects and compares them like that. Otherwise, it
181
- # delegates the comparison.
182
- #
183
- # @param other [Object] the other object to compare.
184
- # @return [Boolean] if they are equal.
185
- def ===(other)
186
- if other.is_a? Token
187
- without_transitions == other.without_transitions
188
- else
189
- super
190
- end
191
- end
192
-
193
- # Creates a new token without to or from states.
194
- #
195
- # @return [Token]
196
- def without_transitions
197
- self.class.new(name, @type, @id, @value)
198
- end
199
-
200
- # Invalidates the cache.
201
- #
202
- # @return [void]
203
- def invalidate_cache!
204
- @_hash = nil
205
- @_array = nil
206
- end
207
-
208
- # Generates a hash for this class.
209
- #
210
- # @note This is not intended for use. It is only defined to be
211
- # compatible with Hashs (and by extension, Sets).
212
- # @private
213
- # @return [Object]
214
- def hash
215
- @_hash ||= to_a.hash
216
- end
217
-
218
- alias_method :eql?, :==
219
-
220
- # Creates an array representation of this class.
221
- #
222
- # @note This is not intended for use. It is only defined to
223
- # make equality checking easier, and to create a hash.
224
- # @private
225
- # @return [Array<(Recognizer::State, Recognizer::State, Class, Symbol, String?)>]
226
- def to_a
227
- @_array ||= [to, from, self.class, name, @value]
228
- end
229
- end
230
- end
231
- end
1
+ # encoding: utf-8
2
+
3
+ require 'antelope/grammar/token/nonterminal'
4
+ require 'antelope/grammar/token/terminal'
5
+ require 'antelope/grammar/token/epsilon'
6
+ require 'antelope/grammar/token/error'
7
+
8
+ module Antelope
9
+ class Grammar
10
+ # Defines a token type for productions/rules.
11
+ #
12
+ # @abstract This class should be inherited to define a real token.
13
+ # A base class does not match any token; however, any token can
14
+ # match the base class.
15
+ class Token
16
+ # The name of the token.
17
+ #
18
+ # @return [Symbol]
19
+ attr_reader :name
20
+
21
+ # The from state that this token is transitioned from. This is
22
+ # the _source_. This is used in the constructor in order to
23
+ # handle lookahead sets.
24
+ #
25
+ # @return [Recognizer::State]
26
+ attr_reader :from
27
+
28
+ # The to state that this token is transitioned to. This is the
29
+ # _destination_. This is used in the constructor in order to
30
+ # handle lookahead sets.
31
+ #
32
+ # @return [Recognizer::State]
33
+ attr_reader :to
34
+
35
+ # The type of the token. This is given by a caret argument to
36
+ # the grammar. This is primarily used for generators.
37
+ #
38
+ # @return [String]
39
+ attr_reader :type
40
+
41
+ attr_accessor :id
42
+
43
+ # Initialize.
44
+ #
45
+ # @param name [Symbol] the name of the token.
46
+ # @param type [String?] the type of the token. For definitions,
47
+ # this is the given type of the token (for typed language
48
+ # output).
49
+ # @param id [String?] the id of the token in the production.
50
+ # For some languages, this allows references to the token via
51
+ # the id.
52
+ # @param value [String?] the value of the token. This is only
53
+ # used in output representation to the developer.
54
+ def initialize(name, type = nil, id = nil, value = nil)
55
+ @name = name
56
+ @value = value
57
+ @type = type
58
+ @id = id
59
+ @from = nil
60
+ @to = nil
61
+ end
62
+
63
+ include Comparable
64
+
65
+ # Whether or not the token is a terminal.
66
+ #
67
+ # @abstract
68
+ # @return [Boolean]
69
+ def terminal?
70
+ false
71
+ end
72
+
73
+ # Whether or not the token is a nonterminal.
74
+ #
75
+ # @abstract
76
+ # @return [Boolean]
77
+ def nonterminal?
78
+ false
79
+ end
80
+
81
+ # Whether or not the token is an epsilon token.
82
+ #
83
+ # @abstract
84
+ # @return [Boolean]
85
+ def epsilon?
86
+ false
87
+ end
88
+
89
+ # Whether or not the token is an error token.
90
+ #
91
+ # @abstract
92
+ # @return [Boolean]
93
+ def error?
94
+ false
95
+ end
96
+
97
+ # Sets the from state of the token and invalidates the cache.
98
+ #
99
+ # @param state [Recognizer::State]
100
+ # @return [void]
101
+ def from=(state)
102
+ invalidate_cache!
103
+ @from = state
104
+ end
105
+
106
+ # Sets the to state of the token and invalidates the cache.
107
+ #
108
+ # @param state [Recognizer::State]
109
+ # @return [void]
110
+ def to=(state)
111
+ invalidate_cache!
112
+ @to = state
113
+ end
114
+
115
+ # Sets the type of the token and invalidates the cache.
116
+ #
117
+ # @param type [String]
118
+ # @return [void]
119
+ def type=(type)
120
+ invalidate_cache!
121
+ @type = type
122
+ end
123
+
124
+ # Gives a string representation of the token. The output is
125
+ # formatted like so: `<data>["(" [<from_id>][:<to_id>] ")"]`,
126
+ # where `<data>` is either the value (if it's non-nil) or the
127
+ # name, `<from_id>` is the from state id, and `<to_id>` is the
128
+ # to state id. The last part of the format is optional; if
129
+ # neither the from state or to state is non-nil, it's non-
130
+ # existant.
131
+ #
132
+ # @return [String] the string representation.
133
+ # @see #from
134
+ # @see #to
135
+ # @see #name
136
+ def to_s
137
+ buf = if @value
138
+ @value.inspect
139
+ else
140
+ @name.to_s
141
+ end
142
+
143
+ if from || to
144
+ buf << '('
145
+ buf << "#{from.id}" if from
146
+ buf << ":#{to.id}" if to
147
+ buf << ')'
148
+ end
149
+
150
+ buf
151
+ end
152
+
153
+ # Returns a nice inspect.
154
+ #
155
+ # @return [String]
156
+ def inspect
157
+ "#<#{self.class} from=#{from.id if from} to=#{to.id if to} " \
158
+ "name=#{name.inspect} value=#{@value.inspect}>"
159
+ end
160
+
161
+ # Compares this class to any other object. If the other object
162
+ # is a token, it converts both this class and the other object
163
+ # to an array and compares the array. Otherwise, it delegates
164
+ # the comparison.
165
+ #
166
+ # @param other [Object] the other object to compare.
167
+ # @return [Numeric]
168
+ def <=>(other)
169
+ if other.is_a? Token
170
+ to_a <=> other.to_a
171
+ else
172
+ super
173
+ end
174
+ end
175
+
176
+ alias_method :eql?, :==
177
+
178
+ # Compares this class and another object, fuzzily. If the other
179
+ # object is a token, it removes the transitions (to and from)
180
+ # on both objects and compares them like that. Otherwise, it
181
+ # delegates the comparison.
182
+ #
183
+ # @param other [Object] the other object to compare.
184
+ # @return [Boolean] if they are equal.
185
+ def ===(other)
186
+ if other.is_a? Token
187
+ without_transitions == other.without_transitions
188
+ else
189
+ super
190
+ end
191
+ end
192
+
193
+ # Creates a new token without to or from states.
194
+ #
195
+ # @return [Token]
196
+ def without_transitions
197
+ self.class.new(name, @type, @id, @value)
198
+ end
199
+
200
+ # Invalidates the cache.
201
+ #
202
+ # @return [void]
203
+ def invalidate_cache!
204
+ @_hash = nil
205
+ @_array = nil
206
+ end
207
+
208
+ # Generates a hash for this class.
209
+ #
210
+ # @note This is not intended for use. It is only defined to be
211
+ # compatible with Hashs (and by extension, Sets).
212
+ # @private
213
+ # @return [Object]
214
+ def hash
215
+ @_hash ||= to_a.hash
216
+ end
217
+
218
+ alias_method :eql?, :==
219
+
220
+ # Creates an array representation of this class.
221
+ #
222
+ # @note This is not intended for use. It is only defined to
223
+ # make equality checking easier, and to create a hash.
224
+ # @private
225
+ # @return [Array<(Recognizer::State, Recognizer::State, Class, Symbol, String?)>]
226
+ def to_a
227
+ @_array ||= [to, from, self.class, name, @value]
228
+ end
229
+ end
230
+ end
231
+ end
@@ -1,68 +1,68 @@
1
- # encoding: utf-8
2
-
3
- require 'hashie'
4
- require 'antelope/grammar/symbols'
5
- require 'antelope/grammar/productions'
6
- require 'antelope/grammar/production'
7
- require 'antelope/grammar/precedences'
8
- require 'antelope/grammar/precedence'
9
- require 'antelope/grammar/loading'
10
- require 'antelope/grammar/generation'
11
- require 'antelope/grammar/token'
12
-
13
- module Antelope
14
- # Defines a grammar from an Ace file. This handles setting up
15
- # productions, loading from files, symbols, precedence, and
16
- # generation.
17
- class Grammar
18
- include Symbols
19
- include Productions
20
- include Precedences
21
- include Loading
22
- include Grammar::Generation
23
-
24
- # Used by a generation class; this is all the generated states
25
- # of the grammar.
26
- #
27
- # @return [Set<Generation::Recognizer::State>]
28
- # @see Generation::Recognizer
29
- attr_accessor :states
30
-
31
- # The name of the grammar. This is normally assumed from a file
32
- # name.
33
- #
34
- # @return [String]
35
- attr_accessor :name
36
-
37
- # The output directory for the grammar. This is normally the
38
- # same directory as the Ace file.
39
- #
40
- # @return [Pathname]
41
- attr_accessor :output
42
-
43
- # The compiler for the Ace file.
44
- #
45
- # @return [Compiler]
46
- attr_reader :compiler
47
-
48
- # Initialize.
49
- #
50
- # @param name [String]
51
- # @param output [String] the output directory. Automagically
52
- # turned into a Pathname.
53
- # @param compiler [Compiler]
54
- def initialize(name, output, compiler)
55
- @name = name
56
- @output = Pathname.new(output)
57
- @compiler = compiler
58
- end
59
-
60
- # Extra options from the compiler. This can be used by
61
- # generators for output information.
62
- #
63
- # @return [Hash]
64
- def options
65
- compiler.options[:extra]
66
- end
67
- end
68
- end
1
+ # encoding: utf-8
2
+
3
+ require 'hashie'
4
+ require 'antelope/grammar/symbols'
5
+ require 'antelope/grammar/productions'
6
+ require 'antelope/grammar/production'
7
+ require 'antelope/grammar/precedences'
8
+ require 'antelope/grammar/precedence'
9
+ require 'antelope/grammar/loading'
10
+ require 'antelope/grammar/generation'
11
+ require 'antelope/grammar/token'
12
+
13
+ module Antelope
14
+ # Defines a grammar from an Ace file. This handles setting up
15
+ # productions, loading from files, symbols, precedence, and
16
+ # generation.
17
+ class Grammar
18
+ include Symbols
19
+ include Productions
20
+ include Precedences
21
+ include Loading
22
+ include Grammar::Generation
23
+
24
+ # Used by a generation class; this is all the generated states
25
+ # of the grammar.
26
+ #
27
+ # @return [Set<Generation::Recognizer::State>]
28
+ # @see Generation::Recognizer
29
+ attr_accessor :states
30
+
31
+ # The name of the grammar. This is normally assumed from a file
32
+ # name.
33
+ #
34
+ # @return [String]
35
+ attr_accessor :name
36
+
37
+ # The output directory for the grammar. This is normally the
38
+ # same directory as the Ace file.
39
+ #
40
+ # @return [Pathname]
41
+ attr_accessor :output
42
+
43
+ # The compiler for the Ace file.
44
+ #
45
+ # @return [Compiler]
46
+ attr_reader :compiler
47
+
48
+ # Initialize.
49
+ #
50
+ # @param name [String]
51
+ # @param output [String] the output directory. Automagically
52
+ # turned into a Pathname.
53
+ # @param compiler [Compiler]
54
+ def initialize(name, output, compiler)
55
+ @name = name
56
+ @output = Pathname.new(output)
57
+ @compiler = compiler
58
+ end
59
+
60
+ # Extra options from the compiler. This can be used by
61
+ # generators for output information.
62
+ #
63
+ # @return [Hash]
64
+ def options
65
+ compiler.options[:extra]
66
+ end
67
+ end
68
+ end
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
-
3
- module Antelope
4
- # The current running version of antelope.
5
- VERSION = '0.3.2'.freeze
6
- end
1
+ # encoding: utf-8
2
+
3
+ module Antelope
4
+ # The current running version of antelope.
5
+ VERSION = '0.4.0'.freeze
6
+ end
data/lib/antelope.rb CHANGED
@@ -1,19 +1,18 @@
1
- # encoding: utf-8
2
-
3
- require 'antelope/errors'
4
- require 'antelope/generation'
5
- require 'antelope/generator'
6
- require 'antelope/version'
7
- require 'antelope/grammar'
8
- require 'antelope/ace'
9
- require 'antelope/dsl'
10
- require 'antelope/template'
11
-
12
- # Antelope, the compiler compiler.
13
- module Antelope
14
- def self.define(name, options = {}, &block)
15
- @grammar = [name, options, block]
16
- end
17
-
18
- class << self; attr_reader :grammar; end
19
- end
1
+ # encoding: utf-8
2
+
3
+ require 'antelope/errors'
4
+ require 'antelope/generation'
5
+ require 'antelope/generator'
6
+ require 'antelope/version'
7
+ require 'antelope/grammar'
8
+ require 'antelope/ace'
9
+ require 'antelope/dsl'
10
+
11
+ # Antelope, the compiler compiler.
12
+ module Antelope
13
+ def self.define(name, options = {}, &block)
14
+ @grammar = [name, options, block]
15
+ end
16
+
17
+ class << self; attr_reader :grammar; end
18
+ end