kosmas58-cucumber 0.1.16.6 → 0.1.99.21

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 (248) hide show
  1. data/History.txt +126 -2
  2. data/License.txt +1 -1
  3. data/Manifest.txt +0 -270
  4. data/Rakefile +1 -1
  5. data/bin/cucumber +2 -2
  6. data/config/hoe.rb +7 -2
  7. data/examples/cs/features/step_definitons/calculator_steps.rb +1 -1
  8. data/examples/i18n/README.textile +1 -1
  9. data/examples/i18n/Rakefile +3 -3
  10. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -6
  11. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +1 -1
  12. data/examples/i18n/de/features/addition.feature +6 -6
  13. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +2 -2
  14. data/examples/i18n/en/features/addition.feature +6 -6
  15. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +2 -2
  16. data/examples/i18n/es/features/adicion.feature +11 -12
  17. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +7 -10
  18. data/examples/i18n/es/lib/calculador.rb +4 -1
  19. data/examples/i18n/et/features/liitmine.feature +7 -6
  20. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +1 -1
  21. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +1 -1
  22. data/examples/i18n/fi/features/yhteenlasku.feature +2 -2
  23. data/examples/i18n/fr/features/addition.feature +2 -2
  24. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +1 -1
  25. data/examples/i18n/id/features/addition.feature +6 -6
  26. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +2 -2
  27. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +1 -1
  28. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +2 -3
  29. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
  30. data/examples/i18n/lt/features/addition.feature +7 -6
  31. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +2 -2
  32. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +7 -7
  33. data/examples/i18n/no/features/summering.feature +1 -0
  34. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +1 -1
  35. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +1 -1
  36. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +1 -1
  37. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +2 -2
  38. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  39. data/examples/jbehave/README.textile +17 -0
  40. data/examples/jbehave/features/support/env.rb +7 -0
  41. data/examples/jbehave/features/trading.feature +24 -0
  42. data/examples/jbehave/pom.xml +48 -0
  43. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/converters/TraderConverter.java +32 -0
  44. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Stock.java +42 -0
  45. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Trader.java +29 -0
  46. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/persistence/TraderPersister.java +22 -0
  47. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +65 -0
  48. data/examples/self_test/README.textile +4 -1
  49. data/examples/{calculator_ruby_features → self_test}/Rakefile +3 -3
  50. data/examples/self_test/features/background/failing_background.feature +10 -0
  51. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  52. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  53. data/examples/self_test/features/background/passing_background.feature +10 -0
  54. data/examples/self_test/features/background/pending_background.feature +10 -0
  55. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  56. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  57. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  58. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  59. data/examples/self_test/features/outline_sample.feature +11 -5
  60. data/examples/self_test/features/sample.feature +8 -3
  61. data/examples/self_test/features/step_definitions/sample_steps.rb +53 -4
  62. data/examples/self_test/features/support/env.rb +1 -0
  63. data/examples/self_test/features/support/tag_count_formatter.rb +25 -0
  64. data/examples/tickets/features/172.feature +28 -0
  65. data/examples/tickets/features/177/1.feature +29 -0
  66. data/examples/tickets/features/177/2.feature +21 -0
  67. data/examples/tickets/features/177/3.feature +18 -0
  68. data/examples/tickets/features/180.feature +7 -0
  69. data/examples/tickets/features/scenario_outline.feature +6 -1
  70. data/examples/tickets/features/step_definitons/tickets_steps.rb +27 -3
  71. data/examples/tickets/features/tickets.feature +4 -0
  72. data/features/background.feature +223 -0
  73. data/features/cucumber_cli.feature +218 -98
  74. data/features/cucumber_cli_outlines.feature +54 -37
  75. data/features/custom_formatter.feature +11 -0
  76. data/features/report_called_undefined_steps.feature +32 -0
  77. data/features/step_definitions/cucumber_steps.rb +7 -3
  78. data/features/step_definitions/extra_steps.rb +1 -1
  79. data/features/support/env.rb +2 -1
  80. data/gem_tasks/flog.rake +1 -1
  81. data/gem_tasks/gemspec.rake +2 -2
  82. data/gem_tasks/jar.rake +67 -0
  83. data/lib/autotest/cucumber_mixin.rb +17 -23
  84. data/lib/cucumber.rb +63 -11
  85. data/lib/cucumber/ast.rb +29 -0
  86. data/lib/cucumber/ast/background.rb +88 -0
  87. data/lib/cucumber/ast/comment.rb +26 -0
  88. data/lib/cucumber/ast/examples.rb +26 -0
  89. data/lib/cucumber/ast/feature.rb +66 -0
  90. data/lib/cucumber/ast/features.rb +39 -0
  91. data/lib/cucumber/ast/filter.rb +22 -0
  92. data/lib/cucumber/ast/outline_table.rb +49 -0
  93. data/lib/cucumber/ast/py_string.rb +52 -0
  94. data/lib/cucumber/ast/scenario.rb +103 -0
  95. data/lib/cucumber/ast/scenario_outline.rb +92 -0
  96. data/lib/cucumber/ast/step.rb +161 -0
  97. data/lib/cucumber/ast/steps.rb +13 -0
  98. data/lib/cucumber/ast/table.rb +218 -0
  99. data/lib/cucumber/ast/tags.rb +40 -0
  100. data/lib/cucumber/ast/visitor.rb +109 -0
  101. data/lib/cucumber/broadcaster.rb +1 -6
  102. data/lib/cucumber/cli/configuration.rb +339 -0
  103. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  104. data/lib/cucumber/cli/main.rb +100 -0
  105. data/lib/cucumber/core_ext/exception.rb +41 -8
  106. data/lib/cucumber/core_ext/instance_exec.rb +54 -0
  107. data/lib/cucumber/core_ext/proc.rb +29 -65
  108. data/lib/cucumber/core_ext/string.rb +19 -0
  109. data/lib/cucumber/formatter.rb +1 -0
  110. data/lib/cucumber/{formatters → formatter}/ansicolor.rb +14 -16
  111. data/lib/cucumber/formatter/color_io.rb +17 -0
  112. data/lib/cucumber/formatter/console.rb +119 -0
  113. data/lib/cucumber/formatter/cucumber.css +55 -0
  114. data/lib/cucumber/formatter/cucumber.sass +49 -0
  115. data/lib/cucumber/formatter/html.rb +121 -0
  116. data/lib/cucumber/formatter/pretty.rb +167 -0
  117. data/lib/cucumber/formatter/profile.rb +77 -0
  118. data/lib/cucumber/formatter/progress.rb +68 -0
  119. data/lib/cucumber/formatter/rerun.rb +35 -0
  120. data/lib/cucumber/formatter/unicode.rb +35 -0
  121. data/lib/cucumber/formatters/unicode.rb +2 -35
  122. data/lib/cucumber/jbehave.rb +102 -0
  123. data/lib/cucumber/languages.yml +128 -75
  124. data/lib/cucumber/parser.rb +43 -0
  125. data/lib/cucumber/parser/basic.rb +0 -0
  126. data/lib/cucumber/parser/feature.rb +1490 -0
  127. data/lib/cucumber/parser/feature.tt +188 -0
  128. data/lib/cucumber/parser/i18n.tt +31 -0
  129. data/lib/cucumber/parser/table.rb +402 -0
  130. data/lib/cucumber/parser/table.tt +59 -0
  131. data/lib/cucumber/parser/treetop_ext.rb +75 -0
  132. data/lib/cucumber/platform.rb +3 -17
  133. data/lib/cucumber/rails/rspec.rb +5 -2
  134. data/lib/cucumber/step_definition.rb +87 -0
  135. data/lib/cucumber/step_mother.rb +151 -66
  136. data/lib/cucumber/version.rb +2 -2
  137. data/rails_generators/cucumber/USAGE +3 -2
  138. data/rails_generators/cucumber/cucumber_generator.rb +33 -23
  139. data/rails_generators/cucumber/templates/cucumber +2 -1
  140. data/rails_generators/cucumber/templates/cucumber.rake +6 -1
  141. data/rails_generators/cucumber/templates/env.rb +1 -1
  142. data/rails_generators/feature/USAGE +3 -0
  143. data/rails_generators/feature/feature_generator.rb +30 -6
  144. data/spec/cucumber/ast/background_spec.rb +58 -0
  145. data/spec/cucumber/ast/feature_factory.rb +54 -0
  146. data/spec/cucumber/ast/feature_spec.rb +60 -0
  147. data/spec/cucumber/ast/py_string_spec.rb +40 -0
  148. data/spec/cucumber/ast/scenario_outline_spec.rb +64 -0
  149. data/spec/cucumber/ast/scenario_spec.rb +82 -0
  150. data/spec/cucumber/ast/step_spec.rb +45 -0
  151. data/spec/cucumber/ast/table_spec.rb +81 -0
  152. data/spec/cucumber/ast/tags_spec.rb +23 -0
  153. data/spec/cucumber/broadcaster_spec.rb +4 -17
  154. data/spec/cucumber/cli/configuration_spec.rb +239 -0
  155. data/spec/cucumber/cli/main_spec.rb +164 -0
  156. data/spec/cucumber/core_ext/proc_spec.rb +27 -35
  157. data/spec/cucumber/core_ext/string_spec.rb +8 -0
  158. data/spec/cucumber/{formatters → formatter}/ansicolor_spec.rb +2 -2
  159. data/spec/cucumber/formatter/html/cucumber.css +37 -0
  160. data/spec/cucumber/formatter/html/cucumber.js +13 -0
  161. data/spec/cucumber/formatter/html/index.html +45 -0
  162. data/spec/cucumber/formatter/html/jquery-1.3.min.js +19 -0
  163. data/spec/cucumber/formatter/html/jquery.uitableedit.js +100 -0
  164. data/spec/cucumber/formatters/profile_formatter_spec.rb +17 -16
  165. data/spec/cucumber/parser/feature_parser_spec.rb +281 -0
  166. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  167. data/spec/cucumber/step_definition_spec.rb +62 -0
  168. data/spec/cucumber/step_mother_spec.rb +50 -51
  169. data/spec/cucumber/treetop_parser/empty_feature.feature +1 -1
  170. data/spec/cucumber/treetop_parser/scenario_outline.feature +1 -1
  171. data/spec/cucumber/treetop_parser/spaces.feature +3 -1
  172. data/spec/cucumber/treetop_parser/with_comments.feature +1 -1
  173. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  174. data/spec/cucumber/world/pending_spec.rb +13 -12
  175. data/spec/spec_helper.rb +1 -1
  176. metadata +107 -79
  177. data/examples/calculator_ruby_features/features/addition.rb +0 -39
  178. data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +0 -43
  179. data/gem_tasks/treetop.rake +0 -41
  180. data/lib/cucumber/cli.rb +0 -355
  181. data/lib/cucumber/executor.rb +0 -205
  182. data/lib/cucumber/formatters.rb +0 -1
  183. data/lib/cucumber/formatters/autotest_formatter.rb +0 -23
  184. data/lib/cucumber/formatters/cucumber.css +0 -132
  185. data/lib/cucumber/formatters/cucumber.js +0 -11
  186. data/lib/cucumber/formatters/html_formatter.rb +0 -152
  187. data/lib/cucumber/formatters/jquery.js +0 -32
  188. data/lib/cucumber/formatters/pretty_formatter.rb +0 -285
  189. data/lib/cucumber/formatters/profile_formatter.rb +0 -92
  190. data/lib/cucumber/formatters/progress_formatter.rb +0 -61
  191. data/lib/cucumber/model.rb +0 -1
  192. data/lib/cucumber/model/table.rb +0 -32
  193. data/lib/cucumber/step_methods.rb +0 -49
  194. data/lib/cucumber/tree.rb +0 -16
  195. data/lib/cucumber/tree/feature.rb +0 -105
  196. data/lib/cucumber/tree/features.rb +0 -21
  197. data/lib/cucumber/tree/given_scenario.rb +0 -13
  198. data/lib/cucumber/tree/scenario.rb +0 -240
  199. data/lib/cucumber/tree/step.rb +0 -173
  200. data/lib/cucumber/tree/table.rb +0 -26
  201. data/lib/cucumber/tree/top_down_visitor.rb +0 -23
  202. data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -254
  203. data/lib/cucumber/treetop_parser/feature_ar.rb +0 -1951
  204. data/lib/cucumber/treetop_parser/feature_cy.rb +0 -1951
  205. data/lib/cucumber/treetop_parser/feature_da.rb +0 -1951
  206. data/lib/cucumber/treetop_parser/feature_de.rb +0 -1951
  207. data/lib/cucumber/treetop_parser/feature_en-lol.rb +0 -1951
  208. data/lib/cucumber/treetop_parser/feature_en-tx.rb +0 -1951
  209. data/lib/cucumber/treetop_parser/feature_en.rb +0 -1951
  210. data/lib/cucumber/treetop_parser/feature_es.rb +0 -1951
  211. data/lib/cucumber/treetop_parser/feature_et.rb +0 -1951
  212. data/lib/cucumber/treetop_parser/feature_fi.rb +0 -1951
  213. data/lib/cucumber/treetop_parser/feature_fr.rb +0 -1951
  214. data/lib/cucumber/treetop_parser/feature_id.rb +0 -1951
  215. data/lib/cucumber/treetop_parser/feature_it.rb +0 -1951
  216. data/lib/cucumber/treetop_parser/feature_ja.rb +0 -1951
  217. data/lib/cucumber/treetop_parser/feature_ko.rb +0 -1951
  218. data/lib/cucumber/treetop_parser/feature_lt.rb +0 -1951
  219. data/lib/cucumber/treetop_parser/feature_nl.rb +0 -1951
  220. data/lib/cucumber/treetop_parser/feature_no.rb +0 -1951
  221. data/lib/cucumber/treetop_parser/feature_parser.rb +0 -36
  222. data/lib/cucumber/treetop_parser/feature_pl.rb +0 -1951
  223. data/lib/cucumber/treetop_parser/feature_pt.rb +0 -1951
  224. data/lib/cucumber/treetop_parser/feature_ro.rb +0 -1951
  225. data/lib/cucumber/treetop_parser/feature_ro2.rb +0 -1951
  226. data/lib/cucumber/treetop_parser/feature_ru.rb +0 -1951
  227. data/lib/cucumber/treetop_parser/feature_se.rb +0 -1951
  228. data/lib/cucumber/treetop_parser/feature_zh-CN.rb +0 -1951
  229. data/lib/cucumber/world.rb +0 -1
  230. data/lib/cucumber/world/pending.rb +0 -22
  231. data/setup.rb +0 -1585
  232. data/spec/cucumber/cli_spec.rb +0 -521
  233. data/spec/cucumber/executor_spec.rb +0 -382
  234. data/spec/cucumber/formatters/autotest_formatter_spec.rb +0 -26
  235. data/spec/cucumber/formatters/features.html +0 -269
  236. data/spec/cucumber/formatters/html_formatter_spec.rb +0 -110
  237. data/spec/cucumber/formatters/pretty_formatter_spec.rb +0 -410
  238. data/spec/cucumber/formatters/progress_formatter_spec.rb +0 -81
  239. data/spec/cucumber/model/table_spec.rb +0 -32
  240. data/spec/cucumber/tree/feature_spec.rb +0 -122
  241. data/spec/cucumber/tree/row_scenario_outline_spec.rb +0 -73
  242. data/spec/cucumber/tree/row_scenario_spec.rb +0 -55
  243. data/spec/cucumber/tree/row_step_outline_spec.rb +0 -38
  244. data/spec/cucumber/tree/scenario_outline_spec.rb +0 -50
  245. data/spec/cucumber/tree/scenario_spec.rb +0 -134
  246. data/spec/cucumber/tree/step_outline_spec.rb +0 -17
  247. data/spec/cucumber/tree/step_spec.rb +0 -59
  248. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -120
@@ -0,0 +1,43 @@
1
+ require 'erb'
2
+ require 'cucumber/platform'
3
+ require 'cucumber/ast'
4
+ require 'cucumber/parser/treetop_ext'
5
+ require 'cucumber/parser/table'
6
+
7
+ module Cucumber
8
+ # Classes in this module parse feature files and translate the parse tree
9
+ # (concrete syntax tree) into an abstract syntax tree (AST) using
10
+ # <a href="http://martinfowler.com/dslwip/EmbeddedTranslation.html">Embedded translation</a>.
11
+ #
12
+ # The AST is built by the various <tt>#build</tt> methods in the parse tree.
13
+ #
14
+ # The AST classes are defined in the Cucumber::Ast module.
15
+ module Parser
16
+ translator = Module.new do
17
+ def keywordz(key)
18
+ 'Scenario'
19
+ end
20
+ end
21
+
22
+ def self.load_parser(keywords)
23
+ Loader.new(keywords)
24
+ end
25
+
26
+ class Loader
27
+ def initialize(keywords)
28
+ @keywords = keywords
29
+ i18n_tt = File.expand_path(File.dirname(__FILE__) + '/parser/i18n.tt')
30
+ template = File.open(i18n_tt, Cucumber.file_mode('r')).read
31
+ erb = ERB.new(template)
32
+ grammar = erb.result(binding)
33
+ Treetop.load_from_string(grammar)
34
+ require 'cucumber/parser/feature'
35
+ end
36
+
37
+ def keywords(key)
38
+ values = @keywords[key].split('|')
39
+ values.map{|value| "'#{value}'"}.join(" / ")
40
+ end
41
+ end
42
+ end
43
+ end
File without changes
@@ -0,0 +1,1490 @@
1
+ module Cucumber
2
+ module Parser
3
+ # TIP: When you hack on the grammar, just delete feature.rb in this directory.
4
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
5
+ # github gems).
6
+ #
7
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
8
+ # the rb file with tt feature.tt
9
+ module Feature
10
+ include Treetop::Runtime
11
+
12
+ def root
13
+ @root || :feature
14
+ end
15
+
16
+ include I18n
17
+
18
+ include Table
19
+
20
+ module Feature0
21
+ end
22
+
23
+ module Feature1
24
+ def white
25
+ elements[0]
26
+ end
27
+
28
+ def comment
29
+ elements[1]
30
+ end
31
+
32
+ def white
33
+ elements[2]
34
+ end
35
+
36
+ def tags
37
+ elements[3]
38
+ end
39
+
40
+ def white
41
+ elements[4]
42
+ end
43
+
44
+ def header
45
+ elements[5]
46
+ end
47
+
48
+ def background
49
+ elements[6]
50
+ end
51
+
52
+ def feature_elements
53
+ elements[7]
54
+ end
55
+
56
+ end
57
+
58
+ module Feature2
59
+ def build
60
+ if background.respond_to?(:build)
61
+ Ast::Feature.new(comment.build, tags.build, header.text_value, feature_elements.build, background.build)
62
+ else
63
+ Ast::Feature.new(comment.build, tags.build, header.text_value, feature_elements.build)
64
+ end
65
+ end
66
+ end
67
+
68
+ def _nt_feature
69
+ start_index = index
70
+ if node_cache[:feature].has_key?(index)
71
+ cached = node_cache[:feature][index]
72
+ @index = cached.interval.end if cached
73
+ return cached
74
+ end
75
+
76
+ i0, s0 = index, []
77
+ r1 = _nt_white
78
+ s0 << r1
79
+ if r1
80
+ r2 = _nt_comment
81
+ s0 << r2
82
+ if r2
83
+ r3 = _nt_white
84
+ s0 << r3
85
+ if r3
86
+ r4 = _nt_tags
87
+ s0 << r4
88
+ if r4
89
+ r5 = _nt_white
90
+ s0 << r5
91
+ if r5
92
+ s6, i6 = [], index
93
+ loop do
94
+ i7, s7 = index, []
95
+ i8 = index
96
+ i9 = index
97
+ r10 = _nt_scenario_outline
98
+ if r10
99
+ r9 = r10
100
+ else
101
+ r11 = _nt_scenario
102
+ if r11
103
+ r9 = r11
104
+ else
105
+ r12 = _nt_background
106
+ if r12
107
+ r9 = r12
108
+ else
109
+ self.index = i9
110
+ r9 = nil
111
+ end
112
+ end
113
+ end
114
+ if r9
115
+ r8 = nil
116
+ else
117
+ self.index = i8
118
+ r8 = SyntaxNode.new(input, index...index)
119
+ end
120
+ s7 << r8
121
+ if r8
122
+ if index < input_length
123
+ r13 = (SyntaxNode).new(input, index...(index + 1))
124
+ @index += 1
125
+ else
126
+ terminal_parse_failure("any character")
127
+ r13 = nil
128
+ end
129
+ s7 << r13
130
+ end
131
+ if s7.last
132
+ r7 = (SyntaxNode).new(input, i7...index, s7)
133
+ r7.extend(Feature0)
134
+ else
135
+ self.index = i7
136
+ r7 = nil
137
+ end
138
+ if r7
139
+ s6 << r7
140
+ else
141
+ break
142
+ end
143
+ end
144
+ r6 = SyntaxNode.new(input, i6...index, s6)
145
+ s0 << r6
146
+ if r6
147
+ r15 = _nt_background
148
+ if r15
149
+ r14 = r15
150
+ else
151
+ r14 = SyntaxNode.new(input, index...index)
152
+ end
153
+ s0 << r14
154
+ if r14
155
+ r16 = _nt_feature_elements
156
+ s0 << r16
157
+ if r16
158
+ r18 = _nt_comment
159
+ if r18
160
+ r17 = r18
161
+ else
162
+ r17 = SyntaxNode.new(input, index...index)
163
+ end
164
+ s0 << r17
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
173
+ if s0.last
174
+ r0 = (SyntaxNode).new(input, i0...index, s0)
175
+ r0.extend(Feature1)
176
+ r0.extend(Feature2)
177
+ else
178
+ self.index = i0
179
+ r0 = nil
180
+ end
181
+
182
+ node_cache[:feature][start_index] = r0
183
+
184
+ return r0
185
+ end
186
+
187
+ module Tags0
188
+ def tag
189
+ elements[0]
190
+ end
191
+
192
+ end
193
+
194
+ module Tags1
195
+ def white
196
+ elements[0]
197
+ end
198
+
199
+ def ts
200
+ elements[1]
201
+ end
202
+ end
203
+
204
+ module Tags2
205
+ def build
206
+ tag_names = ts.elements.map{|e| e.tag.tag_name.text_value}
207
+ Ast::Tags.new(ts.line, tag_names)
208
+ end
209
+ end
210
+
211
+ def _nt_tags
212
+ start_index = index
213
+ if node_cache[:tags].has_key?(index)
214
+ cached = node_cache[:tags][index]
215
+ @index = cached.interval.end if cached
216
+ return cached
217
+ end
218
+
219
+ i0, s0 = index, []
220
+ r1 = _nt_white
221
+ s0 << r1
222
+ if r1
223
+ s2, i2 = [], index
224
+ loop do
225
+ i3, s3 = index, []
226
+ r4 = _nt_tag
227
+ s3 << r4
228
+ if r4
229
+ s5, i5 = [], index
230
+ loop do
231
+ i6 = index
232
+ r7 = _nt_space
233
+ if r7
234
+ r6 = r7
235
+ else
236
+ r8 = _nt_eol
237
+ if r8
238
+ r6 = r8
239
+ else
240
+ self.index = i6
241
+ r6 = nil
242
+ end
243
+ end
244
+ if r6
245
+ s5 << r6
246
+ else
247
+ break
248
+ end
249
+ end
250
+ if s5.empty?
251
+ self.index = i5
252
+ r5 = nil
253
+ else
254
+ r5 = SyntaxNode.new(input, i5...index, s5)
255
+ end
256
+ s3 << r5
257
+ end
258
+ if s3.last
259
+ r3 = (SyntaxNode).new(input, i3...index, s3)
260
+ r3.extend(Tags0)
261
+ else
262
+ self.index = i3
263
+ r3 = nil
264
+ end
265
+ if r3
266
+ s2 << r3
267
+ else
268
+ break
269
+ end
270
+ end
271
+ r2 = SyntaxNode.new(input, i2...index, s2)
272
+ s0 << r2
273
+ end
274
+ if s0.last
275
+ r0 = (SyntaxNode).new(input, i0...index, s0)
276
+ r0.extend(Tags1)
277
+ r0.extend(Tags2)
278
+ else
279
+ self.index = i0
280
+ r0 = nil
281
+ end
282
+
283
+ node_cache[:tags][start_index] = r0
284
+
285
+ return r0
286
+ end
287
+
288
+ module Tag0
289
+ def tag_name
290
+ elements[1]
291
+ end
292
+ end
293
+
294
+ def _nt_tag
295
+ start_index = index
296
+ if node_cache[:tag].has_key?(index)
297
+ cached = node_cache[:tag][index]
298
+ @index = cached.interval.end if cached
299
+ return cached
300
+ end
301
+
302
+ i0, s0 = index, []
303
+ if input.index('@', index) == index
304
+ r1 = (SyntaxNode).new(input, index...(index + 1))
305
+ @index += 1
306
+ else
307
+ terminal_parse_failure('@')
308
+ r1 = nil
309
+ end
310
+ s0 << r1
311
+ if r1
312
+ s2, i2 = [], index
313
+ loop do
314
+ if input.index(Regexp.new('[a-z0-9]'), index) == index
315
+ r3 = (SyntaxNode).new(input, index...(index + 1))
316
+ @index += 1
317
+ else
318
+ r3 = nil
319
+ end
320
+ if r3
321
+ s2 << r3
322
+ else
323
+ break
324
+ end
325
+ end
326
+ if s2.empty?
327
+ self.index = i2
328
+ r2 = nil
329
+ else
330
+ r2 = SyntaxNode.new(input, i2...index, s2)
331
+ end
332
+ s0 << r2
333
+ end
334
+ if s0.last
335
+ r0 = (SyntaxNode).new(input, i0...index, s0)
336
+ r0.extend(Tag0)
337
+ else
338
+ self.index = i0
339
+ r0 = nil
340
+ end
341
+
342
+ node_cache[:tag][start_index] = r0
343
+
344
+ return r0
345
+ end
346
+
347
+ module Comment0
348
+ def comment_line
349
+ elements[0]
350
+ end
351
+
352
+ def white
353
+ elements[1]
354
+ end
355
+ end
356
+
357
+ module Comment1
358
+ def build
359
+ Ast::Comment.new(text_value)
360
+ end
361
+ end
362
+
363
+ def _nt_comment
364
+ start_index = index
365
+ if node_cache[:comment].has_key?(index)
366
+ cached = node_cache[:comment][index]
367
+ @index = cached.interval.end if cached
368
+ return cached
369
+ end
370
+
371
+ s0, i0 = [], index
372
+ loop do
373
+ i1, s1 = index, []
374
+ r2 = _nt_comment_line
375
+ s1 << r2
376
+ if r2
377
+ r3 = _nt_white
378
+ s1 << r3
379
+ end
380
+ if s1.last
381
+ r1 = (SyntaxNode).new(input, i1...index, s1)
382
+ r1.extend(Comment0)
383
+ else
384
+ self.index = i1
385
+ r1 = nil
386
+ end
387
+ if r1
388
+ s0 << r1
389
+ else
390
+ break
391
+ end
392
+ end
393
+ r0 = SyntaxNode.new(input, i0...index, s0)
394
+ r0.extend(Comment1)
395
+
396
+ node_cache[:comment][start_index] = r0
397
+
398
+ return r0
399
+ end
400
+
401
+ module CommentLine0
402
+ def line_to_eol
403
+ elements[1]
404
+ end
405
+ end
406
+
407
+ def _nt_comment_line
408
+ start_index = index
409
+ if node_cache[:comment_line].has_key?(index)
410
+ cached = node_cache[:comment_line][index]
411
+ @index = cached.interval.end if cached
412
+ return cached
413
+ end
414
+
415
+ i0, s0 = index, []
416
+ if input.index('#', index) == index
417
+ r1 = (SyntaxNode).new(input, index...(index + 1))
418
+ @index += 1
419
+ else
420
+ terminal_parse_failure('#')
421
+ r1 = nil
422
+ end
423
+ s0 << r1
424
+ if r1
425
+ r2 = _nt_line_to_eol
426
+ s0 << r2
427
+ end
428
+ if s0.last
429
+ r0 = (SyntaxNode).new(input, i0...index, s0)
430
+ r0.extend(CommentLine0)
431
+ else
432
+ self.index = i0
433
+ r0 = nil
434
+ end
435
+
436
+ node_cache[:comment_line][start_index] = r0
437
+
438
+ return r0
439
+ end
440
+
441
+ module Background0
442
+ def comment
443
+ elements[0]
444
+ end
445
+
446
+ def white
447
+ elements[1]
448
+ end
449
+
450
+ def background_keyword
451
+ elements[2]
452
+ end
453
+
454
+ def steps
455
+ elements[5]
456
+ end
457
+ end
458
+
459
+ module Background1
460
+ def build
461
+ Ast::Background.new(
462
+ comment.build,
463
+ background_keyword.line,
464
+ background_keyword.text_value,
465
+ steps.build
466
+ )
467
+ end
468
+ end
469
+
470
+ def _nt_background
471
+ start_index = index
472
+ if node_cache[:background].has_key?(index)
473
+ cached = node_cache[:background][index]
474
+ @index = cached.interval.end if cached
475
+ return cached
476
+ end
477
+
478
+ i0, s0 = index, []
479
+ r1 = _nt_comment
480
+ s0 << r1
481
+ if r1
482
+ r2 = _nt_white
483
+ s0 << r2
484
+ if r2
485
+ r3 = _nt_background_keyword
486
+ s0 << r3
487
+ if r3
488
+ s4, i4 = [], index
489
+ loop do
490
+ r5 = _nt_space
491
+ if r5
492
+ s4 << r5
493
+ else
494
+ break
495
+ end
496
+ end
497
+ r4 = SyntaxNode.new(input, i4...index, s4)
498
+ s0 << r4
499
+ if r4
500
+ i6 = index
501
+ s7, i7 = [], index
502
+ loop do
503
+ r8 = _nt_eol
504
+ if r8
505
+ s7 << r8
506
+ else
507
+ break
508
+ end
509
+ end
510
+ if s7.empty?
511
+ self.index = i7
512
+ r7 = nil
513
+ else
514
+ r7 = SyntaxNode.new(input, i7...index, s7)
515
+ end
516
+ if r7
517
+ r6 = r7
518
+ else
519
+ r9 = _nt_eof
520
+ if r9
521
+ r6 = r9
522
+ else
523
+ self.index = i6
524
+ r6 = nil
525
+ end
526
+ end
527
+ s0 << r6
528
+ if r6
529
+ r10 = _nt_steps
530
+ s0 << r10
531
+ end
532
+ end
533
+ end
534
+ end
535
+ end
536
+ if s0.last
537
+ r0 = (SyntaxNode).new(input, i0...index, s0)
538
+ r0.extend(Background0)
539
+ r0.extend(Background1)
540
+ else
541
+ self.index = i0
542
+ r0 = nil
543
+ end
544
+
545
+ node_cache[:background][start_index] = r0
546
+
547
+ return r0
548
+ end
549
+
550
+ module FeatureElements0
551
+ def build
552
+ elements.map{|s| s.build}
553
+ end
554
+ end
555
+
556
+ def _nt_feature_elements
557
+ start_index = index
558
+ if node_cache[:feature_elements].has_key?(index)
559
+ cached = node_cache[:feature_elements][index]
560
+ @index = cached.interval.end if cached
561
+ return cached
562
+ end
563
+
564
+ s0, i0 = [], index
565
+ loop do
566
+ i1 = index
567
+ r2 = _nt_scenario
568
+ if r2
569
+ r1 = r2
570
+ else
571
+ r3 = _nt_scenario_outline
572
+ if r3
573
+ r1 = r3
574
+ else
575
+ self.index = i1
576
+ r1 = nil
577
+ end
578
+ end
579
+ if r1
580
+ s0 << r1
581
+ else
582
+ break
583
+ end
584
+ end
585
+ r0 = SyntaxNode.new(input, i0...index, s0)
586
+ r0.extend(FeatureElements0)
587
+
588
+ node_cache[:feature_elements][start_index] = r0
589
+
590
+ return r0
591
+ end
592
+
593
+ module Scenario0
594
+ def comment
595
+ elements[0]
596
+ end
597
+
598
+ def tags
599
+ elements[1]
600
+ end
601
+
602
+ def white
603
+ elements[2]
604
+ end
605
+
606
+ def scenario_keyword
607
+ elements[3]
608
+ end
609
+
610
+ def name
611
+ elements[5]
612
+ end
613
+
614
+ def steps
615
+ elements[7]
616
+ end
617
+
618
+ def white
619
+ elements[8]
620
+ end
621
+ end
622
+
623
+ module Scenario1
624
+ def build
625
+ Ast::Scenario.new(
626
+ comment.build,
627
+ tags.build,
628
+ scenario_keyword.line,
629
+ scenario_keyword.text_value,
630
+ name.text_value,
631
+ steps.build
632
+ )
633
+ end
634
+ end
635
+
636
+ def _nt_scenario
637
+ start_index = index
638
+ if node_cache[:scenario].has_key?(index)
639
+ cached = node_cache[:scenario][index]
640
+ @index = cached.interval.end if cached
641
+ return cached
642
+ end
643
+
644
+ i0, s0 = index, []
645
+ r1 = _nt_comment
646
+ s0 << r1
647
+ if r1
648
+ r2 = _nt_tags
649
+ s0 << r2
650
+ if r2
651
+ r3 = _nt_white
652
+ s0 << r3
653
+ if r3
654
+ r4 = _nt_scenario_keyword
655
+ s0 << r4
656
+ if r4
657
+ s5, i5 = [], index
658
+ loop do
659
+ r6 = _nt_space
660
+ if r6
661
+ s5 << r6
662
+ else
663
+ break
664
+ end
665
+ end
666
+ r5 = SyntaxNode.new(input, i5...index, s5)
667
+ s0 << r5
668
+ if r5
669
+ r7 = _nt_line_to_eol
670
+ s0 << r7
671
+ if r7
672
+ i8 = index
673
+ r9 = _nt_white
674
+ if r9
675
+ r8 = r9
676
+ else
677
+ r10 = _nt_eof
678
+ if r10
679
+ r8 = r10
680
+ else
681
+ self.index = i8
682
+ r8 = nil
683
+ end
684
+ end
685
+ s0 << r8
686
+ if r8
687
+ r11 = _nt_steps
688
+ s0 << r11
689
+ if r11
690
+ r12 = _nt_white
691
+ s0 << r12
692
+ end
693
+ end
694
+ end
695
+ end
696
+ end
697
+ end
698
+ end
699
+ end
700
+ if s0.last
701
+ r0 = (SyntaxNode).new(input, i0...index, s0)
702
+ r0.extend(Scenario0)
703
+ r0.extend(Scenario1)
704
+ else
705
+ self.index = i0
706
+ r0 = nil
707
+ end
708
+
709
+ node_cache[:scenario][start_index] = r0
710
+
711
+ return r0
712
+ end
713
+
714
+ module ScenarioOutline0
715
+ def comment
716
+ elements[0]
717
+ end
718
+
719
+ def tags
720
+ elements[1]
721
+ end
722
+
723
+ def white
724
+ elements[2]
725
+ end
726
+
727
+ def scenario_outline_keyword
728
+ elements[3]
729
+ end
730
+
731
+ def name
732
+ elements[5]
733
+ end
734
+
735
+ def white
736
+ elements[6]
737
+ end
738
+
739
+ def steps
740
+ elements[7]
741
+ end
742
+
743
+ def examples_sections
744
+ elements[8]
745
+ end
746
+
747
+ def white
748
+ elements[9]
749
+ end
750
+ end
751
+
752
+ module ScenarioOutline1
753
+ def build
754
+ Ast::ScenarioOutline.new(
755
+ comment.build,
756
+ tags.build,
757
+ scenario_outline_keyword.line,
758
+ scenario_outline_keyword.text_value,
759
+ name.text_value,
760
+ steps.build,
761
+ examples_sections.build
762
+ )
763
+ end
764
+ end
765
+
766
+ def _nt_scenario_outline
767
+ start_index = index
768
+ if node_cache[:scenario_outline].has_key?(index)
769
+ cached = node_cache[:scenario_outline][index]
770
+ @index = cached.interval.end if cached
771
+ return cached
772
+ end
773
+
774
+ i0, s0 = index, []
775
+ r1 = _nt_comment
776
+ s0 << r1
777
+ if r1
778
+ r2 = _nt_tags
779
+ s0 << r2
780
+ if r2
781
+ r3 = _nt_white
782
+ s0 << r3
783
+ if r3
784
+ r4 = _nt_scenario_outline_keyword
785
+ s0 << r4
786
+ if r4
787
+ s5, i5 = [], index
788
+ loop do
789
+ r6 = _nt_space
790
+ if r6
791
+ s5 << r6
792
+ else
793
+ break
794
+ end
795
+ end
796
+ r5 = SyntaxNode.new(input, i5...index, s5)
797
+ s0 << r5
798
+ if r5
799
+ r7 = _nt_line_to_eol
800
+ s0 << r7
801
+ if r7
802
+ r8 = _nt_white
803
+ s0 << r8
804
+ if r8
805
+ r9 = _nt_steps
806
+ s0 << r9
807
+ if r9
808
+ r10 = _nt_examples_sections
809
+ s0 << r10
810
+ if r10
811
+ r11 = _nt_white
812
+ s0 << r11
813
+ end
814
+ end
815
+ end
816
+ end
817
+ end
818
+ end
819
+ end
820
+ end
821
+ end
822
+ if s0.last
823
+ r0 = (SyntaxNode).new(input, i0...index, s0)
824
+ r0.extend(ScenarioOutline0)
825
+ r0.extend(ScenarioOutline1)
826
+ else
827
+ self.index = i0
828
+ r0 = nil
829
+ end
830
+
831
+ node_cache[:scenario_outline][start_index] = r0
832
+
833
+ return r0
834
+ end
835
+
836
+ module Steps0
837
+ def build
838
+ elements.map{|e| e.build}
839
+ end
840
+ end
841
+
842
+ def _nt_steps
843
+ start_index = index
844
+ if node_cache[:steps].has_key?(index)
845
+ cached = node_cache[:steps][index]
846
+ @index = cached.interval.end if cached
847
+ return cached
848
+ end
849
+
850
+ s0, i0 = [], index
851
+ loop do
852
+ r1 = _nt_step
853
+ if r1
854
+ s0 << r1
855
+ else
856
+ break
857
+ end
858
+ end
859
+ r0 = SyntaxNode.new(input, i0...index, s0)
860
+ r0.extend(Steps0)
861
+
862
+ node_cache[:steps][start_index] = r0
863
+
864
+ return r0
865
+ end
866
+
867
+ module Step0
868
+ def comment
869
+ elements[0]
870
+ end
871
+
872
+ def step_keyword
873
+ elements[2]
874
+ end
875
+
876
+ def name
877
+ elements[4]
878
+ end
879
+
880
+ def multi
881
+ elements[6]
882
+ end
883
+
884
+ def white
885
+ elements[7]
886
+ end
887
+ end
888
+
889
+ module Step1
890
+ def build
891
+ if multi.respond_to?(:build)
892
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip, multi.build)
893
+ else
894
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip)
895
+ end
896
+ end
897
+ end
898
+
899
+ def _nt_step
900
+ start_index = index
901
+ if node_cache[:step].has_key?(index)
902
+ cached = node_cache[:step][index]
903
+ @index = cached.interval.end if cached
904
+ return cached
905
+ end
906
+
907
+ i0, s0 = index, []
908
+ r1 = _nt_comment
909
+ s0 << r1
910
+ if r1
911
+ s2, i2 = [], index
912
+ loop do
913
+ r3 = _nt_space
914
+ if r3
915
+ s2 << r3
916
+ else
917
+ break
918
+ end
919
+ end
920
+ r2 = SyntaxNode.new(input, i2...index, s2)
921
+ s0 << r2
922
+ if r2
923
+ r4 = _nt_step_keyword
924
+ s0 << r4
925
+ if r4
926
+ s5, i5 = [], index
927
+ loop do
928
+ r6 = _nt_space
929
+ if r6
930
+ s5 << r6
931
+ else
932
+ break
933
+ end
934
+ end
935
+ r5 = SyntaxNode.new(input, i5...index, s5)
936
+ s0 << r5
937
+ if r5
938
+ r7 = _nt_line_to_eol
939
+ s0 << r7
940
+ if r7
941
+ i8 = index
942
+ s9, i9 = [], index
943
+ loop do
944
+ r10 = _nt_eol
945
+ if r10
946
+ s9 << r10
947
+ else
948
+ break
949
+ end
950
+ end
951
+ if s9.empty?
952
+ self.index = i9
953
+ r9 = nil
954
+ else
955
+ r9 = SyntaxNode.new(input, i9...index, s9)
956
+ end
957
+ if r9
958
+ r8 = r9
959
+ else
960
+ r11 = _nt_eof
961
+ if r11
962
+ r8 = r11
963
+ else
964
+ self.index = i8
965
+ r8 = nil
966
+ end
967
+ end
968
+ s0 << r8
969
+ if r8
970
+ r13 = _nt_multiline_arg
971
+ if r13
972
+ r12 = r13
973
+ else
974
+ r12 = SyntaxNode.new(input, index...index)
975
+ end
976
+ s0 << r12
977
+ if r12
978
+ r14 = _nt_white
979
+ s0 << r14
980
+ end
981
+ end
982
+ end
983
+ end
984
+ end
985
+ end
986
+ end
987
+ if s0.last
988
+ r0 = (SyntaxNode).new(input, i0...index, s0)
989
+ r0.extend(Step0)
990
+ r0.extend(Step1)
991
+ else
992
+ self.index = i0
993
+ r0 = nil
994
+ end
995
+
996
+ node_cache[:step][start_index] = r0
997
+
998
+ return r0
999
+ end
1000
+
1001
+ module ExamplesSections0
1002
+ def build
1003
+ elements.map{|e| e.build}
1004
+ end
1005
+ end
1006
+
1007
+ def _nt_examples_sections
1008
+ start_index = index
1009
+ if node_cache[:examples_sections].has_key?(index)
1010
+ cached = node_cache[:examples_sections][index]
1011
+ @index = cached.interval.end if cached
1012
+ return cached
1013
+ end
1014
+
1015
+ s0, i0 = [], index
1016
+ loop do
1017
+ r1 = _nt_examples
1018
+ if r1
1019
+ s0 << r1
1020
+ else
1021
+ break
1022
+ end
1023
+ end
1024
+ r0 = SyntaxNode.new(input, i0...index, s0)
1025
+ r0.extend(ExamplesSections0)
1026
+
1027
+ node_cache[:examples_sections][start_index] = r0
1028
+
1029
+ return r0
1030
+ end
1031
+
1032
+ module Examples0
1033
+ def examples_keyword
1034
+ elements[1]
1035
+ end
1036
+
1037
+ def name
1038
+ elements[3]
1039
+ end
1040
+
1041
+ def eol
1042
+ elements[4]
1043
+ end
1044
+
1045
+ def table
1046
+ elements[5]
1047
+ end
1048
+
1049
+ def white
1050
+ elements[6]
1051
+ end
1052
+ end
1053
+
1054
+ module Examples1
1055
+ def build
1056
+ [examples_keyword.line, examples_keyword.text_value, name.text_value, table.raw]
1057
+ end
1058
+ end
1059
+
1060
+ def _nt_examples
1061
+ start_index = index
1062
+ if node_cache[:examples].has_key?(index)
1063
+ cached = node_cache[:examples][index]
1064
+ @index = cached.interval.end if cached
1065
+ return cached
1066
+ end
1067
+
1068
+ i0, s0 = index, []
1069
+ s1, i1 = [], index
1070
+ loop do
1071
+ r2 = _nt_space
1072
+ if r2
1073
+ s1 << r2
1074
+ else
1075
+ break
1076
+ end
1077
+ end
1078
+ r1 = SyntaxNode.new(input, i1...index, s1)
1079
+ s0 << r1
1080
+ if r1
1081
+ r3 = _nt_examples_keyword
1082
+ s0 << r3
1083
+ if r3
1084
+ s4, i4 = [], index
1085
+ loop do
1086
+ r5 = _nt_space
1087
+ if r5
1088
+ s4 << r5
1089
+ else
1090
+ break
1091
+ end
1092
+ end
1093
+ r4 = SyntaxNode.new(input, i4...index, s4)
1094
+ s0 << r4
1095
+ if r4
1096
+ r7 = _nt_line_to_eol
1097
+ if r7
1098
+ r6 = r7
1099
+ else
1100
+ r6 = SyntaxNode.new(input, index...index)
1101
+ end
1102
+ s0 << r6
1103
+ if r6
1104
+ r8 = _nt_eol
1105
+ s0 << r8
1106
+ if r8
1107
+ r9 = _nt_table
1108
+ s0 << r9
1109
+ if r9
1110
+ r10 = _nt_white
1111
+ s0 << r10
1112
+ end
1113
+ end
1114
+ end
1115
+ end
1116
+ end
1117
+ end
1118
+ if s0.last
1119
+ r0 = (SyntaxNode).new(input, i0...index, s0)
1120
+ r0.extend(Examples0)
1121
+ r0.extend(Examples1)
1122
+ else
1123
+ self.index = i0
1124
+ r0 = nil
1125
+ end
1126
+
1127
+ node_cache[:examples][start_index] = r0
1128
+
1129
+ return r0
1130
+ end
1131
+
1132
+ def _nt_multiline_arg
1133
+ start_index = index
1134
+ if node_cache[:multiline_arg].has_key?(index)
1135
+ cached = node_cache[:multiline_arg][index]
1136
+ @index = cached.interval.end if cached
1137
+ return cached
1138
+ end
1139
+
1140
+ i0 = index
1141
+ r1 = _nt_table
1142
+ if r1
1143
+ r0 = r1
1144
+ else
1145
+ r2 = _nt_py_string
1146
+ if r2
1147
+ r0 = r2
1148
+ else
1149
+ self.index = i0
1150
+ r0 = nil
1151
+ end
1152
+ end
1153
+
1154
+ node_cache[:multiline_arg][start_index] = r0
1155
+
1156
+ return r0
1157
+ end
1158
+
1159
+ module LineToEol0
1160
+ end
1161
+
1162
+ def _nt_line_to_eol
1163
+ start_index = index
1164
+ if node_cache[:line_to_eol].has_key?(index)
1165
+ cached = node_cache[:line_to_eol][index]
1166
+ @index = cached.interval.end if cached
1167
+ return cached
1168
+ end
1169
+
1170
+ s0, i0 = [], index
1171
+ loop do
1172
+ i1, s1 = index, []
1173
+ i2 = index
1174
+ r3 = _nt_eol
1175
+ if r3
1176
+ r2 = nil
1177
+ else
1178
+ self.index = i2
1179
+ r2 = SyntaxNode.new(input, index...index)
1180
+ end
1181
+ s1 << r2
1182
+ if r2
1183
+ if index < input_length
1184
+ r4 = (SyntaxNode).new(input, index...(index + 1))
1185
+ @index += 1
1186
+ else
1187
+ terminal_parse_failure("any character")
1188
+ r4 = nil
1189
+ end
1190
+ s1 << r4
1191
+ end
1192
+ if s1.last
1193
+ r1 = (SyntaxNode).new(input, i1...index, s1)
1194
+ r1.extend(LineToEol0)
1195
+ else
1196
+ self.index = i1
1197
+ r1 = nil
1198
+ end
1199
+ if r1
1200
+ s0 << r1
1201
+ else
1202
+ break
1203
+ end
1204
+ end
1205
+ r0 = SyntaxNode.new(input, i0...index, s0)
1206
+
1207
+ node_cache[:line_to_eol][start_index] = r0
1208
+
1209
+ return r0
1210
+ end
1211
+
1212
+ module PyString0
1213
+ end
1214
+
1215
+ module PyString1
1216
+ def open_py_string
1217
+ elements[0]
1218
+ end
1219
+
1220
+ def s
1221
+ elements[1]
1222
+ end
1223
+
1224
+ def close_py_string
1225
+ elements[2]
1226
+ end
1227
+ end
1228
+
1229
+ module PyString2
1230
+ def build
1231
+ Ast::PyString.new(open_py_string.line, close_py_string.line, s.text_value, open_py_string.indentation)
1232
+ end
1233
+ end
1234
+
1235
+ def _nt_py_string
1236
+ start_index = index
1237
+ if node_cache[:py_string].has_key?(index)
1238
+ cached = node_cache[:py_string][index]
1239
+ @index = cached.interval.end if cached
1240
+ return cached
1241
+ end
1242
+
1243
+ i0, s0 = index, []
1244
+ r1 = _nt_open_py_string
1245
+ s0 << r1
1246
+ if r1
1247
+ s2, i2 = [], index
1248
+ loop do
1249
+ i3, s3 = index, []
1250
+ i4 = index
1251
+ r5 = _nt_close_py_string
1252
+ if r5
1253
+ r4 = nil
1254
+ else
1255
+ self.index = i4
1256
+ r4 = SyntaxNode.new(input, index...index)
1257
+ end
1258
+ s3 << r4
1259
+ if r4
1260
+ if index < input_length
1261
+ r6 = (SyntaxNode).new(input, index...(index + 1))
1262
+ @index += 1
1263
+ else
1264
+ terminal_parse_failure("any character")
1265
+ r6 = nil
1266
+ end
1267
+ s3 << r6
1268
+ end
1269
+ if s3.last
1270
+ r3 = (SyntaxNode).new(input, i3...index, s3)
1271
+ r3.extend(PyString0)
1272
+ else
1273
+ self.index = i3
1274
+ r3 = nil
1275
+ end
1276
+ if r3
1277
+ s2 << r3
1278
+ else
1279
+ break
1280
+ end
1281
+ end
1282
+ r2 = SyntaxNode.new(input, i2...index, s2)
1283
+ s0 << r2
1284
+ if r2
1285
+ r7 = _nt_close_py_string
1286
+ s0 << r7
1287
+ end
1288
+ end
1289
+ if s0.last
1290
+ r0 = (SyntaxNode).new(input, i0...index, s0)
1291
+ r0.extend(PyString1)
1292
+ r0.extend(PyString2)
1293
+ else
1294
+ self.index = i0
1295
+ r0 = nil
1296
+ end
1297
+
1298
+ node_cache[:py_string][start_index] = r0
1299
+
1300
+ return r0
1301
+ end
1302
+
1303
+ module OpenPyString0
1304
+ def white
1305
+ elements[0]
1306
+ end
1307
+
1308
+ def eol
1309
+ elements[3]
1310
+ end
1311
+ end
1312
+
1313
+ module OpenPyString1
1314
+ def indentation
1315
+ white.text_value.length
1316
+ end
1317
+
1318
+ def line
1319
+ white.line
1320
+ end
1321
+ end
1322
+
1323
+ def _nt_open_py_string
1324
+ start_index = index
1325
+ if node_cache[:open_py_string].has_key?(index)
1326
+ cached = node_cache[:open_py_string][index]
1327
+ @index = cached.interval.end if cached
1328
+ return cached
1329
+ end
1330
+
1331
+ i0, s0 = index, []
1332
+ r1 = _nt_white
1333
+ s0 << r1
1334
+ if r1
1335
+ if input.index('"""', index) == index
1336
+ r2 = (SyntaxNode).new(input, index...(index + 3))
1337
+ @index += 3
1338
+ else
1339
+ terminal_parse_failure('"""')
1340
+ r2 = nil
1341
+ end
1342
+ s0 << r2
1343
+ if r2
1344
+ s3, i3 = [], index
1345
+ loop do
1346
+ r4 = _nt_space
1347
+ if r4
1348
+ s3 << r4
1349
+ else
1350
+ break
1351
+ end
1352
+ end
1353
+ r3 = SyntaxNode.new(input, i3...index, s3)
1354
+ s0 << r3
1355
+ if r3
1356
+ r5 = _nt_eol
1357
+ s0 << r5
1358
+ end
1359
+ end
1360
+ end
1361
+ if s0.last
1362
+ r0 = (SyntaxNode).new(input, i0...index, s0)
1363
+ r0.extend(OpenPyString0)
1364
+ r0.extend(OpenPyString1)
1365
+ else
1366
+ self.index = i0
1367
+ r0 = nil
1368
+ end
1369
+
1370
+ node_cache[:open_py_string][start_index] = r0
1371
+
1372
+ return r0
1373
+ end
1374
+
1375
+ module ClosePyString0
1376
+ def eol
1377
+ elements[0]
1378
+ end
1379
+
1380
+ def quotes
1381
+ elements[2]
1382
+ end
1383
+
1384
+ def white
1385
+ elements[3]
1386
+ end
1387
+ end
1388
+
1389
+ module ClosePyString1
1390
+ def line
1391
+ quotes.line
1392
+ end
1393
+ end
1394
+
1395
+ def _nt_close_py_string
1396
+ start_index = index
1397
+ if node_cache[:close_py_string].has_key?(index)
1398
+ cached = node_cache[:close_py_string][index]
1399
+ @index = cached.interval.end if cached
1400
+ return cached
1401
+ end
1402
+
1403
+ i0, s0 = index, []
1404
+ r1 = _nt_eol
1405
+ s0 << r1
1406
+ if r1
1407
+ s2, i2 = [], index
1408
+ loop do
1409
+ r3 = _nt_space
1410
+ if r3
1411
+ s2 << r3
1412
+ else
1413
+ break
1414
+ end
1415
+ end
1416
+ r2 = SyntaxNode.new(input, i2...index, s2)
1417
+ s0 << r2
1418
+ if r2
1419
+ if input.index('"""', index) == index
1420
+ r4 = (SyntaxNode).new(input, index...(index + 3))
1421
+ @index += 3
1422
+ else
1423
+ terminal_parse_failure('"""')
1424
+ r4 = nil
1425
+ end
1426
+ s0 << r4
1427
+ if r4
1428
+ r5 = _nt_white
1429
+ s0 << r5
1430
+ end
1431
+ end
1432
+ end
1433
+ if s0.last
1434
+ r0 = (SyntaxNode).new(input, i0...index, s0)
1435
+ r0.extend(ClosePyString0)
1436
+ r0.extend(ClosePyString1)
1437
+ else
1438
+ self.index = i0
1439
+ r0 = nil
1440
+ end
1441
+
1442
+ node_cache[:close_py_string][start_index] = r0
1443
+
1444
+ return r0
1445
+ end
1446
+
1447
+ def _nt_white
1448
+ start_index = index
1449
+ if node_cache[:white].has_key?(index)
1450
+ cached = node_cache[:white][index]
1451
+ @index = cached.interval.end if cached
1452
+ return cached
1453
+ end
1454
+
1455
+ s0, i0 = [], index
1456
+ loop do
1457
+ i1 = index
1458
+ r2 = _nt_space
1459
+ if r2
1460
+ r1 = r2
1461
+ else
1462
+ r3 = _nt_eol
1463
+ if r3
1464
+ r1 = r3
1465
+ else
1466
+ self.index = i1
1467
+ r1 = nil
1468
+ end
1469
+ end
1470
+ if r1
1471
+ s0 << r1
1472
+ else
1473
+ break
1474
+ end
1475
+ end
1476
+ r0 = SyntaxNode.new(input, i0...index, s0)
1477
+
1478
+ node_cache[:white][start_index] = r0
1479
+
1480
+ return r0
1481
+ end
1482
+
1483
+ end
1484
+
1485
+ class FeatureParser < Treetop::Runtime::CompiledParser
1486
+ include Feature
1487
+ end
1488
+
1489
+ end
1490
+ end