<NME> fit_scenario.feature
<BEF> ADDFILE
<MSG> Merge branch 'master' of git://github.com/JoeSniff/cucumber

<DFF> @@ -0,0 +1,7 @@
+Some title  
+
+  Scenario: second  
+    Given 'bind me please'
+  
+  |c|
+  |I can have spaces|
\ No newline at end of file

{'commit': 'diff --git a/examples/selenium/Rakefile b/examples/selenium/Rakefile\nnew file mode 100644\nindex 00000000..ddc42dc9\n--- /dev/null\n+++ b/examples/selenium/Rakefile\n@@ -0,0 +1,6 @@\n+$:.unshift(File.dirname(__FILE__) + \'/../../lib\')\n+require \'cucumber/rake/task\'\n+\n+Cucumber::Rake::Task.new do |t|\n+  t.cucumber_opts = "--format pretty"\n+end\n\\ No newline at end of file\ndiff --git a/examples/selenium/features/search.feature b/examples/selenium/features/search.feature\nnew file mode 100644\nindex 00000000..2d55a302\n--- /dev/null\n+++ b/examples/selenium/features/search.feature\n@@ -0,0 +1,9 @@\n+Feature: Search\n+  In order to learn more\n+  As an information seeker\n+  I want to find more information\n+\n+  Scenario: Find what I\'m looking for\n+    Given I am on the Google search page\n+    When I search for "rspec"\n+    Then I should see a link to "RSpec-1.1.4: Overview":http://rspec.info/\ndiff --git a/examples/selenium/features/steps/stories_steps.rb b/examples/selenium/features/steps/stories_steps.rb\nnew file mode 100644\nindex 00000000..246509e4\n--- /dev/null\n+++ b/examples/selenium/features/steps/stories_steps.rb\n@@ -0,0 +1,41 @@\n+require \'spec\'\n+require \'selenium\'\n+\n+class GoogleSearch\n+  def initialize(browser)\n+    @browser = browser\n+  end\n+  \n+  def goto\n+    @browser.open \'http://www.google.com/\'\n+  end\n+  \n+  def search(text)\n+    @browser.type(\'q\',text)   \n+    @browser.click \'btnG\'\n+    @browser.wait_for_page_to_load\n+  end\n+end\n+\n+Before do\n+  @browser = Selenium::SeleniumDriver.new("localhost", 4444, "*chrome", "http://localhost", 15000)\n+  @browser.start\n+end\n+\n+After do\n+  @browser.stop\n+end\n+\n+Given \'I am on the Google search page\' do\n+  @page = GoogleSearch.new(@browser)\n+  @page.goto\n+end\n+\n+When /I search for "(.*)"/ do |query|\n+  @page.search(query)\n+end\n+\n+Then /I should see a link to "(.*)":(.*)/ do |text, expected_url|\n+  observed_url = @browser.get_attribute("link=#{text}@href")\n+  observed_url.should == expected_url\n+end\ndiff --git a/lib/cucumber/treetop_parser/feature.treetop.erb b/lib/cucumber/treetop_parser/feature.treetop.erb\nindex c2308945..cac59705 100644\n--- a/lib/cucumber/treetop_parser/feature.treetop.erb\n+++ b/lib/cucumber/treetop_parser/feature.treetop.erb\n@@ -85,7 +85,7 @@ grammar Feature\n     whitespace* separator cells:(whitespace* cell_value whitespace* separator)+\n     {\n       def values\n-        cells.elements.map { |cell| cell.cell_value.text_value }\n+        cells.elements.map { |cell| cell.cell_value.text_value.strip }\n       end\n       \n       def line\n@@ -95,7 +95,7 @@ grammar Feature\n   end\n \n   rule cell_value\n-    (!(separator / newline / whitespace) .)*\n+    (!(separator / newline) .)*\n   end\n \n   rule separator\ndiff --git a/lib/cucumber/treetop_parser/feature_en.rb b/lib/cucumber/treetop_parser/feature_en.rb\nindex dadeff30..36eeefe0 100644\n--- a/lib/cucumber/treetop_parser/feature_en.rb\n+++ b/lib/cucumber/treetop_parser/feature_en.rb\n@@ -1,1185 +1,1180 @@\n-module Cucumber\r\n-module TreetopParser\r\n-\r\n-module Feature\r\n-  include Treetop::Runtime\r\n-\r\n-  def root\r\n-    @root || :root\r\n-  end\r\n-\r\n-  module Root0\r\n-    def header\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def scenarios\r\n-      elements[2]\r\n-    end\r\n-  end\r\n-\r\n-  module Root1\r\n-    \r\n-    def feature\r\n-      f = Tree::Feature.new(header.text_value.strip)\r\n-      scenarios.populate(f)\r\n-      f\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_root\r\n-    start_index = index\r\n-    if node_cache[:root].has_key?(index)\r\n-      cached = node_cache[:root][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_header\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        r3 = _nt_whitespace\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      s0 << r2\r\n-      if r2\r\n-        r4 = _nt_scenarios\r\n-        s0 << r4\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Root0)\r\n-      r0.extend(Root1)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:root][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Header0\r\n-  end\r\n-\r\n-  def _nt_header\r\n-    start_index = index\r\n-    if node_cache[:header].has_key?(index)\r\n-      cached = node_cache[:header][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1, s1 = index, []\r\n-      i2 = index\r\n-      r3 = _nt_step_scenario\r\n-      if r3\r\n-        r2 = nil\r\n-      else\r\n-        self.index = i2\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s1 << r2\r\n-      if r2\r\n-        if index < input_length\r\n-          r4 = (SyntaxNode).new(input, index...(index + 1))\r\n-          @index += 1\r\n-        else\r\n-          terminal_parse_failure("any character")\r\n-          r4 = nil\r\n-        end\r\n-        s1 << r4\r\n-      end\r\n-      if s1.last\r\n-        r1 = (SyntaxNode).new(input, i1...index, s1)\r\n-        r1.extend(Header0)\r\n-      else\r\n-        self.index = i1\r\n-        r1 = nil\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:header][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Scenarios0\r\n-    def step_scenario\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def more\r\n-      elements[1]\r\n-    end\r\n-  end\r\n-\r\n-  module Scenarios1\r\n-    def populate(feature)\r\n-      step_scenario.populate(feature)\r\n-      more.elements.each { |m| m.populate(feature) }\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_scenarios\r\n-    start_index = index\r\n-    if node_cache[:scenarios].has_key?(index)\r\n-      cached = node_cache[:scenarios][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_step_scenario\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        i3 = index\r\n-        r4 = _nt_table\r\n-        if r4\r\n-          r3 = r4\r\n-        else\r\n-          r5 = _nt_step_scenario\r\n-          if r5\r\n-            r3 = r5\r\n-          else\r\n-            self.index = i3\r\n-            r3 = nil\r\n-          end\r\n-        end\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      s0 << r2\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Scenarios0)\r\n-      r0.extend(Scenarios1)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:scenarios][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module StepScenario0\r\n-  end\r\n-\r\n-  module StepScenario1\r\n-    def scenario_keyword\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-\r\n-    def steps\r\n-      elements[6]\r\n-    end\r\n-  end\r\n-\r\n-  module StepScenario2\r\n-    def populate(feature)\r\n-      sc = feature.add_scenario(name.text_value.strip)\r\n-      steps.elements.each{|s| s.populate(sc)}\r\n-      Feature.last_scenario = sc\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_step_scenario\r\n-    start_index = index\r\n-    if node_cache[:step_scenario].has_key?(index)\r\n-      cached = node_cache[:step_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_scenario_keyword\r\n-    s0 << r1\r\n-    if r1\r\n-      if input.index(":", index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure(":")\r\n-        r2 = nil\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s3, i3 = [], index\r\n-        loop do\r\n-          r4 = _nt_whitespace\r\n-          if r4\r\n-            s3 << r4\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s3.empty?\r\n-          self.index = i3\r\n-          r3 = nil\r\n-        else\r\n-          r3 = SyntaxNode.new(input, i3...index, s3)\r\n-        end\r\n-        s0 << r3\r\n-        if r3\r\n-          s5, i5 = [], index\r\n-          loop do\r\n-            i6, s6 = index, []\r\n-            i7 = index\r\n-            r8 = _nt_newline\r\n-            if r8\r\n-              r7 = nil\r\n-            else\r\n-              self.index = i7\r\n-              r7 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s6 << r7\r\n-            if r7\r\n-              if index < input_length\r\n-                r9 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r9 = nil\r\n-              end\r\n-              s6 << r9\r\n-            end\r\n-            if s6.last\r\n-              r6 = (SyntaxNode).new(input, i6...index, s6)\r\n-              r6.extend(StepScenario0)\r\n-            else\r\n-              self.index = i6\r\n-              r6 = nil\r\n-            end\r\n-            if r6\r\n-              s5 << r6\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s5.empty?\r\n-            self.index = i5\r\n-            r5 = nil\r\n-          else\r\n-            r5 = SyntaxNode.new(input, i5...index, s5)\r\n-          end\r\n-          s0 << r5\r\n-          if r5\r\n-            s10, i10 = [], index\r\n-            loop do\r\n-              r11 = _nt_newline\r\n-              if r11\r\n-                s10 << r11\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r10 = SyntaxNode.new(input, i10...index, s10)\r\n-            s0 << r10\r\n-            if r10\r\n-              r12 = _nt_blanks\r\n-              s0 << r12\r\n-              if r12\r\n-                s13, i13 = [], index\r\n-                loop do\r\n-                  r14 = _nt_step_or_given_scenario\r\n-                  if r14\r\n-                    s13 << r14\r\n-                  else\r\n-                    break\r\n-                  end\r\n-                end\r\n-                if s13.empty?\r\n-                  self.index = i13\r\n-                  r13 = nil\r\n-                else\r\n-                  r13 = SyntaxNode.new(input, i13...index, s13)\r\n-                end\r\n-                s0 << r13\r\n-              end\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(StepScenario1)\r\n-      r0.extend(StepScenario2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:step_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_step_or_given_scenario\r\n-    start_index = index\r\n-    if node_cache[:step_or_given_scenario].has_key?(index)\r\n-      cached = node_cache[:step_or_given_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    r1 = _nt_step\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      r2 = _nt_given_scenario\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        self.index = i0\r\n-        r0 = nil\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:step_or_given_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Step0\r\n-  end\r\n-\r\n-  module Step1\r\n-    def step_keyword\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-  end\r\n-\r\n-  module Step2\r\n-    def populate(scenario)\r\n-      line = input.line_of(interval.first)\r\n-      scenario.add_step(step_keyword.text_value, name.text_value.strip, line)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_step\r\n-    start_index = index\r\n-    if node_cache[:step].has_key?(index)\r\n-      cached = node_cache[:step][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    s1, i1 = [], index\r\n-    loop do\r\n-      r2 = _nt_whitespace\r\n-      if r2\r\n-        s1 << r2\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r1 = SyntaxNode.new(input, i1...index, s1)\r\n-    s0 << r1\r\n-    if r1\r\n-      r3 = _nt_step_keyword\r\n-      s0 << r3\r\n-      if r3\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          r5 = _nt_whitespace\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-        if r4\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            i7, s7 = index, []\r\n-            i8 = index\r\n-            r9 = _nt_newline\r\n-            if r9\r\n-              r8 = nil\r\n-            else\r\n-              self.index = i8\r\n-              r8 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s7 << r8\r\n-            if r8\r\n-              if index < input_length\r\n-                r10 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r10 = nil\r\n-              end\r\n-              s7 << r10\r\n-            end\r\n-            if s7.last\r\n-              r7 = (SyntaxNode).new(input, i7...index, s7)\r\n-              r7.extend(Step0)\r\n-            else\r\n-              self.index = i7\r\n-              r7 = nil\r\n-            end\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s6.empty?\r\n-            self.index = i6\r\n-            r6 = nil\r\n-          else\r\n-            r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          end\r\n-          s0 << r6\r\n-          if r6\r\n-            s11, i11 = [], index\r\n-            loop do\r\n-              r12 = _nt_newline\r\n-              if r12\r\n-                s11 << r12\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r11 = SyntaxNode.new(input, i11...index, s11)\r\n-            s0 << r11\r\n-            if r11\r\n-              r13 = _nt_blanks\r\n-              s0 << r13\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Step1)\r\n-      r0.extend(Step2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:step][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module GivenScenario0\r\n-  end\r\n-\r\n-  module GivenScenario1\r\n-    def given_scenario_keyword\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-  end\r\n-\r\n-  module GivenScenario2\r\n-    def populate(scenario)\r\n-      line = input.line_of(interval.first)\r\n-      scenario.add_given_scenario(name.text_value.strip, line)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_given_scenario\r\n-    start_index = index\r\n-    if node_cache[:given_scenario].has_key?(index)\r\n-      cached = node_cache[:given_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_given_scenario_keyword\r\n-    s0 << r1\r\n-    if r1\r\n-      if input.index(":", index) == index\r\n-        r3 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure(":")\r\n-        r3 = nil\r\n-      end\r\n-      if r3\r\n-        r2 = r3\r\n-      else\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          r5 = _nt_whitespace\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-        if r4\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            i7, s7 = index, []\r\n-            i8 = index\r\n-            r9 = _nt_newline\r\n-            if r9\r\n-              r8 = nil\r\n-            else\r\n-              self.index = i8\r\n-              r8 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s7 << r8\r\n-            if r8\r\n-              if index < input_length\r\n-                r10 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r10 = nil\r\n-              end\r\n-              s7 << r10\r\n-            end\r\n-            if s7.last\r\n-              r7 = (SyntaxNode).new(input, i7...index, s7)\r\n-              r7.extend(GivenScenario0)\r\n-            else\r\n-              self.index = i7\r\n-              r7 = nil\r\n-            end\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s6.empty?\r\n-            self.index = i6\r\n-            r6 = nil\r\n-          else\r\n-            r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          end\r\n-          s0 << r6\r\n-          if r6\r\n-            s11, i11 = [], index\r\n-            loop do\r\n-              r12 = _nt_newline\r\n-              if r12\r\n-                s11 << r12\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r11 = SyntaxNode.new(input, i11...index, s11)\r\n-            s0 << r11\r\n-            if r11\r\n-              r13 = _nt_blanks\r\n-              s0 << r13\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(GivenScenario1)\r\n-      r0.extend(GivenScenario2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:given_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_step_keyword\r\n-    start_index = index\r\n-    if node_cache[:step_keyword].has_key?(index)\r\n-      cached = node_cache[:step_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    if input.index(\'Given\', index) == index\r\n-      r1 = (SyntaxNode).new(input, index...(index + 5))\r\n-      @index += 5\r\n-    else\r\n-      terminal_parse_failure(\'Given\')\r\n-      r1 = nil\r\n-    end\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      if input.index(\'When\', index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 4))\r\n-        @index += 4\r\n-      else\r\n-        terminal_parse_failure(\'When\')\r\n-        r2 = nil\r\n-      end\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        if input.index(\'Then\', index) == index\r\n-          r3 = (SyntaxNode).new(input, index...(index + 4))\r\n-          @index += 4\r\n-        else\r\n-          terminal_parse_failure(\'Then\')\r\n-          r3 = nil\r\n-        end\r\n-        if r3\r\n-          r0 = r3\r\n-        else\r\n-          if input.index(\'And\', index) == index\r\n-            r4 = (SyntaxNode).new(input, index...(index + 3))\r\n-            @index += 3\r\n-          else\r\n-            terminal_parse_failure(\'And\')\r\n-            r4 = nil\r\n-          end\r\n-          if r4\r\n-            r0 = r4\r\n-          else\r\n-            self.index = i0\r\n-            r0 = nil\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:step_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_scenario_keyword\r\n-    start_index = index\r\n-    if node_cache[:scenario_keyword].has_key?(index)\r\n-      cached = node_cache[:scenario_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'Scenario\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 8))\r\n-      @index += 8\r\n-    else\r\n-      terminal_parse_failure(\'Scenario\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:scenario_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_given_scenario_keyword\r\n-    start_index = index\r\n-    if node_cache[:given_scenario_keyword].has_key?(index)\r\n-      cached = node_cache[:given_scenario_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'GivenScenario\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 13))\r\n-      @index += 13\r\n-    else\r\n-      terminal_parse_failure(\'GivenScenario\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:given_scenario_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Table0\r\n-    def newline\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def table_line\r\n-      elements[1]\r\n-    end\r\n-  end\r\n-\r\n-  module Table1\r\n-    def table_line\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def more\r\n-      elements[1]\r\n-    end\r\n-\r\n-  end\r\n-\r\n-  module Table2\r\n-    def populate(feature)\r\n-      Feature.last_scenario.table_header = table_line.values\r\n-      more.elements.each do |e|\r\n-        feature.add_row_scenario(Feature.last_scenario, e.table_line.values, e.table_line.line)\r\n-      end\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_table\r\n-    start_index = index\r\n-    if node_cache[:table].has_key?(index)\r\n-      cached = node_cache[:table][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_table_line\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        i3, s3 = index, []\r\n-        r4 = _nt_newline\r\n-        s3 << r4\r\n-        if r4\r\n-          r5 = _nt_table_line\r\n-          s3 << r5\r\n-        end\r\n-        if s3.last\r\n-          r3 = (SyntaxNode).new(input, i3...index, s3)\r\n-          r3.extend(Table0)\r\n-        else\r\n-          self.index = i3\r\n-          r3 = nil\r\n-        end\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      if s2.empty?\r\n-        self.index = i2\r\n-        r2 = nil\r\n-      else\r\n-        r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s6, i6 = [], index\r\n-        loop do\r\n-          r7 = _nt_newline\r\n-          if r7\r\n-            s6 << r7\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        r6 = SyntaxNode.new(input, i6...index, s6)\r\n-        s0 << r6\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Table1)\r\n-      r0.extend(Table2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:table][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module TableLine0\r\n-    def cell_value\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def separator\r\n-      elements[3]\r\n-    end\r\n-  end\r\n-\r\n-  module TableLine1\r\n-    def separator\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def cells\r\n-      elements[2]\r\n-    end\r\n-  end\r\n-\r\n-  module TableLine2\r\n-    def values\r\n-      cells.elements.map { |cell| cell.cell_value.text_value }\r\n-    end\r\n-    \r\n-    def line\r\n-      input.line_of(interval.first)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_table_line\r\n-    start_index = index\r\n-    if node_cache[:table_line].has_key?(index)\r\n-      cached = node_cache[:table_line][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    s1, i1 = [], index\r\n-    loop do\r\n-      r2 = _nt_whitespace\r\n-      if r2\r\n-        s1 << r2\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r1 = SyntaxNode.new(input, i1...index, s1)\r\n-    s0 << r1\r\n-    if r1\r\n-      r3 = _nt_separator\r\n-      s0 << r3\r\n-      if r3\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          i5, s5 = index, []\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            r7 = _nt_whitespace\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          s5 << r6\r\n-          if r6\r\n-            r8 = _nt_cell_value\r\n-            s5 << r8\r\n-            if r8\r\n-              s9, i9 = [], index\r\n-              loop do\r\n-                r10 = _nt_whitespace\r\n-                if r10\r\n-                  s9 << r10\r\n-                else\r\n-                  break\r\n-                end\r\n-              end\r\n-              r9 = SyntaxNode.new(input, i9...index, s9)\r\n-              s5 << r9\r\n-              if r9\r\n-                r11 = _nt_separator\r\n-                s5 << r11\r\n-              end\r\n-            end\r\n-          end\r\n-          if s5.last\r\n-            r5 = (SyntaxNode).new(input, i5...index, s5)\r\n-            r5.extend(TableLine0)\r\n-          else\r\n-            self.index = i5\r\n-            r5 = nil\r\n-          end\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(TableLine1)\r\n-      r0.extend(TableLine2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:table_line][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module CellValue0\r\n-  end\r\n-\r\n-  def _nt_cell_value\r\n-    start_index = index\r\n-    if node_cache[:cell_value].has_key?(index)\r\n-      cached = node_cache[:cell_value][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1, s1 = index, []\r\n-      i2 = index\r\n-      i3 = index\r\n-      r4 = _nt_separator\r\n-      if r4\r\n-        r3 = r4\r\n-      else\r\n-        r5 = _nt_newline\r\n-        if r5\r\n-          r3 = r5\r\n-        else\r\n-          r6 = _nt_whitespace\r\n-          if r6\r\n-            r3 = r6\r\n-          else\r\n-            self.index = i3\r\n-            r3 = nil\r\n-          end\r\n-        end\r\n-      end\r\n-      if r3\r\n-        r2 = nil\r\n-      else\r\n-        self.index = i2\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s1 << r2\r\n-      if r2\r\n-        if index < input_length\r\n-          r7 = (SyntaxNode).new(input, index...(index + 1))\r\n-          @index += 1\r\n-        else\r\n-          terminal_parse_failure("any character")\r\n-          r7 = nil\r\n-        end\r\n-        s1 << r7\r\n-      end\r\n-      if s1.last\r\n-        r1 = (SyntaxNode).new(input, i1...index, s1)\r\n-        r1.extend(CellValue0)\r\n-      else\r\n-        self.index = i1\r\n-        r1 = nil\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:cell_value][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_separator\r\n-    start_index = index\r\n-    if node_cache[:separator].has_key?(index)\r\n-      cached = node_cache[:separator][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'|\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 1))\r\n-      @index += 1\r\n-    else\r\n-      terminal_parse_failure(\'|\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:separator][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_blanks\r\n-    start_index = index\r\n-    if node_cache[:blanks].has_key?(index)\r\n-      cached = node_cache[:blanks][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1 = index\r\n-      r2 = _nt_newline\r\n-      if r2\r\n-        r1 = r2\r\n-      else\r\n-        r3 = _nt_whitespace\r\n-        if r3\r\n-          r1 = r3\r\n-        else\r\n-          self.index = i1\r\n-          r1 = nil\r\n-        end\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:blanks][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_newline\r\n-    start_index = index\r\n-    if node_cache[:newline].has_key?(index)\r\n-      cached = node_cache[:newline][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    if input.index("\\r\\n?", index) == index\r\n-      r1 = (SyntaxNode).new(input, index...(index + 3))\r\n-      @index += 3\r\n-    else\r\n-      terminal_parse_failure("\\r\\n?")\r\n-      r1 = nil\r\n-    end\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      if input.index("\\n", index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure("\\n")\r\n-        r2 = nil\r\n-      end\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        self.index = i0\r\n-        r0 = nil\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:newline][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_whitespace\r\n-    start_index = index\r\n-    if node_cache[:whitespace].has_key?(index)\r\n-      cached = node_cache[:whitespace][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(Regexp.new(\'[ \\\\t]\'), index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 1))\r\n-      @index += 1\r\n-    else\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:whitespace][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-end\r\n-\r\n-class FeatureParser < Treetop::Runtime::CompiledParser\r\n-  include Feature\r\n-end\r\n-\r\n-\r\n-end\r\n+module Cucumber\n+module TreetopParser\n+\n+module Feature\n+  include Treetop::Runtime\n+\n+  def root\n+    @root || :root\n+  end\n+\n+  module Root0\n+    def header\n+      elements[0]\n+    end\n+\n+    def scenarios\n+      elements[2]\n+    end\n+  end\n+\n+  module Root1\n+    \n+    def feature\n+      f = Tree::Feature.new(header.text_value.strip)\n+      scenarios.populate(f)\n+      f\n+    end\n+  end\n+\n+  def _nt_root\n+    start_index = index\n+    if node_cache[:root].has_key?(index)\n+      cached = node_cache[:root][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_header\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        r3 = _nt_whitespace\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      r2 = SyntaxNode.new(input, i2...index, s2)\n+      s0 << r2\n+      if r2\n+        r4 = _nt_scenarios\n+        s0 << r4\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Root0)\n+      r0.extend(Root1)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:root][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Header0\n+  end\n+\n+  def _nt_header\n+    start_index = index\n+    if node_cache[:header].has_key?(index)\n+      cached = node_cache[:header][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1, s1 = index, []\n+      i2 = index\n+      r3 = _nt_step_scenario\n+      if r3\n+        r2 = nil\n+      else\n+        self.index = i2\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s1 << r2\n+      if r2\n+        if index < input_length\n+          r4 = (SyntaxNode).new(input, index...(index + 1))\n+          @index += 1\n+        else\n+          terminal_parse_failure("any character")\n+          r4 = nil\n+        end\n+        s1 << r4\n+      end\n+      if s1.last\n+        r1 = (SyntaxNode).new(input, i1...index, s1)\n+        r1.extend(Header0)\n+      else\n+        self.index = i1\n+        r1 = nil\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:header][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Scenarios0\n+    def step_scenario\n+      elements[0]\n+    end\n+\n+    def more\n+      elements[1]\n+    end\n+  end\n+\n+  module Scenarios1\n+    def populate(feature)\n+      step_scenario.populate(feature)\n+      more.elements.each { |m| m.populate(feature) }\n+    end\n+  end\n+\n+  def _nt_scenarios\n+    start_index = index\n+    if node_cache[:scenarios].has_key?(index)\n+      cached = node_cache[:scenarios][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_step_scenario\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        i3 = index\n+        r4 = _nt_table\n+        if r4\n+          r3 = r4\n+        else\n+          r5 = _nt_step_scenario\n+          if r5\n+            r3 = r5\n+          else\n+            self.index = i3\n+            r3 = nil\n+          end\n+        end\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      r2 = SyntaxNode.new(input, i2...index, s2)\n+      s0 << r2\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Scenarios0)\n+      r0.extend(Scenarios1)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:scenarios][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module StepScenario0\n+  end\n+\n+  module StepScenario1\n+    def scenario_keyword\n+      elements[0]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+\n+    def steps\n+      elements[6]\n+    end\n+  end\n+\n+  module StepScenario2\n+    def populate(feature)\n+      sc = feature.add_scenario(name.text_value.strip)\n+      steps.elements.each{|s| s.populate(sc)}\n+      Feature.last_scenario = sc\n+    end\n+  end\n+\n+  def _nt_step_scenario\n+    start_index = index\n+    if node_cache[:step_scenario].has_key?(index)\n+      cached = node_cache[:step_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_scenario_keyword\n+    s0 << r1\n+    if r1\n+      if input.index(":", index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure(":")\n+        r2 = nil\n+      end\n+      s0 << r2\n+      if r2\n+        s3, i3 = [], index\n+        loop do\n+          r4 = _nt_whitespace\n+          if r4\n+            s3 << r4\n+          else\n+            break\n+          end\n+        end\n+        if s3.empty?\n+          self.index = i3\n+          r3 = nil\n+        else\n+          r3 = SyntaxNode.new(input, i3...index, s3)\n+        end\n+        s0 << r3\n+        if r3\n+          s5, i5 = [], index\n+          loop do\n+            i6, s6 = index, []\n+            i7 = index\n+            r8 = _nt_newline\n+            if r8\n+              r7 = nil\n+            else\n+              self.index = i7\n+              r7 = SyntaxNode.new(input, index...index)\n+            end\n+            s6 << r7\n+            if r7\n+              if index < input_length\n+                r9 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r9 = nil\n+              end\n+              s6 << r9\n+            end\n+            if s6.last\n+              r6 = (SyntaxNode).new(input, i6...index, s6)\n+              r6.extend(StepScenario0)\n+            else\n+              self.index = i6\n+              r6 = nil\n+            end\n+            if r6\n+              s5 << r6\n+            else\n+              break\n+            end\n+          end\n+          if s5.empty?\n+            self.index = i5\n+            r5 = nil\n+          else\n+            r5 = SyntaxNode.new(input, i5...index, s5)\n+          end\n+          s0 << r5\n+          if r5\n+            s10, i10 = [], index\n+            loop do\n+              r11 = _nt_newline\n+              if r11\n+                s10 << r11\n+              else\n+                break\n+              end\n+            end\n+            r10 = SyntaxNode.new(input, i10...index, s10)\n+            s0 << r10\n+            if r10\n+              r12 = _nt_blanks\n+              s0 << r12\n+              if r12\n+                s13, i13 = [], index\n+                loop do\n+                  r14 = _nt_step_or_given_scenario\n+                  if r14\n+                    s13 << r14\n+                  else\n+                    break\n+                  end\n+                end\n+                if s13.empty?\n+                  self.index = i13\n+                  r13 = nil\n+                else\n+                  r13 = SyntaxNode.new(input, i13...index, s13)\n+                end\n+                s0 << r13\n+              end\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(StepScenario1)\n+      r0.extend(StepScenario2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:step_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_step_or_given_scenario\n+    start_index = index\n+    if node_cache[:step_or_given_scenario].has_key?(index)\n+      cached = node_cache[:step_or_given_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    r1 = _nt_step\n+    if r1\n+      r0 = r1\n+    else\n+      r2 = _nt_given_scenario\n+      if r2\n+        r0 = r2\n+      else\n+        self.index = i0\n+        r0 = nil\n+      end\n+    end\n+\n+    node_cache[:step_or_given_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Step0\n+  end\n+\n+  module Step1\n+    def step_keyword\n+      elements[1]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+  end\n+\n+  module Step2\n+    def populate(scenario)\n+      line = input.line_of(interval.first)\n+      scenario.add_step(step_keyword.text_value, name.text_value.strip, line)\n+    end\n+  end\n+\n+  def _nt_step\n+    start_index = index\n+    if node_cache[:step].has_key?(index)\n+      cached = node_cache[:step][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    s1, i1 = [], index\n+    loop do\n+      r2 = _nt_whitespace\n+      if r2\n+        s1 << r2\n+      else\n+        break\n+      end\n+    end\n+    r1 = SyntaxNode.new(input, i1...index, s1)\n+    s0 << r1\n+    if r1\n+      r3 = _nt_step_keyword\n+      s0 << r3\n+      if r3\n+        s4, i4 = [], index\n+        loop do\n+          r5 = _nt_whitespace\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+        if r4\n+          s6, i6 = [], index\n+          loop do\n+            i7, s7 = index, []\n+            i8 = index\n+            r9 = _nt_newline\n+            if r9\n+              r8 = nil\n+            else\n+              self.index = i8\n+              r8 = SyntaxNode.new(input, index...index)\n+            end\n+            s7 << r8\n+            if r8\n+              if index < input_length\n+                r10 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r10 = nil\n+              end\n+              s7 << r10\n+            end\n+            if s7.last\n+              r7 = (SyntaxNode).new(input, i7...index, s7)\n+              r7.extend(Step0)\n+            else\n+              self.index = i7\n+              r7 = nil\n+            end\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          if s6.empty?\n+            self.index = i6\n+            r6 = nil\n+          else\n+            r6 = SyntaxNode.new(input, i6...index, s6)\n+          end\n+          s0 << r6\n+          if r6\n+            s11, i11 = [], index\n+            loop do\n+              r12 = _nt_newline\n+              if r12\n+                s11 << r12\n+              else\n+                break\n+              end\n+            end\n+            r11 = SyntaxNode.new(input, i11...index, s11)\n+            s0 << r11\n+            if r11\n+              r13 = _nt_blanks\n+              s0 << r13\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Step1)\n+      r0.extend(Step2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:step][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module GivenScenario0\n+  end\n+\n+  module GivenScenario1\n+    def given_scenario_keyword\n+      elements[0]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+  end\n+\n+  module GivenScenario2\n+    def populate(scenario)\n+      line = input.line_of(interval.first)\n+      scenario.add_given_scenario(name.text_value.strip, line)\n+    end\n+  end\n+\n+  def _nt_given_scenario\n+    start_index = index\n+    if node_cache[:given_scenario].has_key?(index)\n+      cached = node_cache[:given_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_given_scenario_keyword\n+    s0 << r1\n+    if r1\n+      if input.index(":", index) == index\n+        r3 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure(":")\n+        r3 = nil\n+      end\n+      if r3\n+        r2 = r3\n+      else\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s0 << r2\n+      if r2\n+        s4, i4 = [], index\n+        loop do\n+          r5 = _nt_whitespace\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+        if r4\n+          s6, i6 = [], index\n+          loop do\n+            i7, s7 = index, []\n+            i8 = index\n+            r9 = _nt_newline\n+            if r9\n+              r8 = nil\n+            else\n+              self.index = i8\n+              r8 = SyntaxNode.new(input, index...index)\n+            end\n+            s7 << r8\n+            if r8\n+              if index < input_length\n+                r10 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r10 = nil\n+              end\n+              s7 << r10\n+            end\n+            if s7.last\n+              r7 = (SyntaxNode).new(input, i7...index, s7)\n+              r7.extend(GivenScenario0)\n+            else\n+              self.index = i7\n+              r7 = nil\n+            end\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          if s6.empty?\n+            self.index = i6\n+            r6 = nil\n+          else\n+            r6 = SyntaxNode.new(input, i6...index, s6)\n+          end\n+          s0 << r6\n+          if r6\n+            s11, i11 = [], index\n+            loop do\n+              r12 = _nt_newline\n+              if r12\n+                s11 << r12\n+              else\n+                break\n+              end\n+            end\n+            r11 = SyntaxNode.new(input, i11...index, s11)\n+            s0 << r11\n+            if r11\n+              r13 = _nt_blanks\n+              s0 << r13\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(GivenScenario1)\n+      r0.extend(GivenScenario2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:given_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_step_keyword\n+    start_index = index\n+    if node_cache[:step_keyword].has_key?(index)\n+      cached = node_cache[:step_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    if input.index(\'Given\', index) == index\n+      r1 = (SyntaxNode).new(input, index...(index + 5))\n+      @index += 5\n+    else\n+      terminal_parse_failure(\'Given\')\n+      r1 = nil\n+    end\n+    if r1\n+      r0 = r1\n+    else\n+      if input.index(\'When\', index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 4))\n+        @index += 4\n+      else\n+        terminal_parse_failure(\'When\')\n+        r2 = nil\n+      end\n+      if r2\n+        r0 = r2\n+      else\n+        if input.index(\'Then\', index) == index\n+          r3 = (SyntaxNode).new(input, index...(index + 4))\n+          @index += 4\n+        else\n+          terminal_parse_failure(\'Then\')\n+          r3 = nil\n+        end\n+        if r3\n+          r0 = r3\n+        else\n+          if input.index(\'And\', index) == index\n+            r4 = (SyntaxNode).new(input, index...(index + 3))\n+            @index += 3\n+          else\n+            terminal_parse_failure(\'And\')\n+            r4 = nil\n+          end\n+          if r4\n+            r0 = r4\n+          else\n+            self.index = i0\n+            r0 = nil\n+          end\n+        end\n+      end\n+    end\n+\n+    node_cache[:step_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_scenario_keyword\n+    start_index = index\n+    if node_cache[:scenario_keyword].has_key?(index)\n+      cached = node_cache[:scenario_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'Scenario\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 8))\n+      @index += 8\n+    else\n+      terminal_parse_failure(\'Scenario\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:scenario_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_given_scenario_keyword\n+    start_index = index\n+    if node_cache[:given_scenario_keyword].has_key?(index)\n+      cached = node_cache[:given_scenario_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'GivenScenario\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 13))\n+      @index += 13\n+    else\n+      terminal_parse_failure(\'GivenScenario\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:given_scenario_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Table0\n+    def newline\n+      elements[0]\n+    end\n+\n+    def table_line\n+      elements[1]\n+    end\n+  end\n+\n+  module Table1\n+    def table_line\n+      elements[0]\n+    end\n+\n+    def more\n+      elements[1]\n+    end\n+\n+  end\n+\n+  module Table2\n+    def populate(feature)\n+      Feature.last_scenario.table_header = table_line.values\n+      more.elements.each do |e|\n+        feature.add_row_scenario(Feature.last_scenario, e.table_line.values, e.table_line.line)\n+      end\n+    end\n+  end\n+\n+  def _nt_table\n+    start_index = index\n+    if node_cache[:table].has_key?(index)\n+      cached = node_cache[:table][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_table_line\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        i3, s3 = index, []\n+        r4 = _nt_newline\n+        s3 << r4\n+        if r4\n+          r5 = _nt_table_line\n+          s3 << r5\n+        end\n+        if s3.last\n+          r3 = (SyntaxNode).new(input, i3...index, s3)\n+          r3.extend(Table0)\n+        else\n+          self.index = i3\n+          r3 = nil\n+        end\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      if s2.empty?\n+        self.index = i2\n+        r2 = nil\n+      else\n+        r2 = SyntaxNode.new(input, i2...index, s2)\n+      end\n+      s0 << r2\n+      if r2\n+        s6, i6 = [], index\n+        loop do\n+          r7 = _nt_newline\n+          if r7\n+            s6 << r7\n+          else\n+            break\n+          end\n+        end\n+        r6 = SyntaxNode.new(input, i6...index, s6)\n+        s0 << r6\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Table1)\n+      r0.extend(Table2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:table][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module TableLine0\n+    def cell_value\n+      elements[1]\n+    end\n+\n+    def separator\n+      elements[3]\n+    end\n+  end\n+\n+  module TableLine1\n+    def separator\n+      elements[1]\n+    end\n+\n+    def cells\n+      elements[2]\n+    end\n+  end\n+\n+  module TableLine2\n+    def values\n+      cells.elements.map { |cell| cell.cell_value.text_value.strip }\n+    end\n+    \n+    def line\n+      input.line_of(interval.first)\n+    end\n+  end\n+\n+  def _nt_table_line\n+    start_index = index\n+    if node_cache[:table_line].has_key?(index)\n+      cached = node_cache[:table_line][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    s1, i1 = [], index\n+    loop do\n+      r2 = _nt_whitespace\n+      if r2\n+        s1 << r2\n+      else\n+        break\n+      end\n+    end\n+    r1 = SyntaxNode.new(input, i1...index, s1)\n+    s0 << r1\n+    if r1\n+      r3 = _nt_separator\n+      s0 << r3\n+      if r3\n+        s4, i4 = [], index\n+        loop do\n+          i5, s5 = index, []\n+          s6, i6 = [], index\n+          loop do\n+            r7 = _nt_whitespace\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          r6 = SyntaxNode.new(input, i6...index, s6)\n+          s5 << r6\n+          if r6\n+            r8 = _nt_cell_value\n+            s5 << r8\n+            if r8\n+              s9, i9 = [], index\n+              loop do\n+                r10 = _nt_whitespace\n+                if r10\n+                  s9 << r10\n+                else\n+                  break\n+                end\n+              end\n+              r9 = SyntaxNode.new(input, i9...index, s9)\n+              s5 << r9\n+              if r9\n+                r11 = _nt_separator\n+                s5 << r11\n+              end\n+            end\n+          end\n+          if s5.last\n+            r5 = (SyntaxNode).new(input, i5...index, s5)\n+            r5.extend(TableLine0)\n+          else\n+            self.index = i5\n+            r5 = nil\n+          end\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(TableLine1)\n+      r0.extend(TableLine2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:table_line][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module CellValue0\n+  end\n+\n+  def _nt_cell_value\n+    start_index = index\n+    if node_cache[:cell_value].has_key?(index)\n+      cached = node_cache[:cell_value][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1, s1 = index, []\n+      i2 = index\n+      i3 = index\n+      r4 = _nt_separator\n+      if r4\n+        r3 = r4\n+      else\n+        r5 = _nt_newline\n+        if r5\n+          r3 = r5\n+        else\n+          self.index = i3\n+          r3 = nil\n+        end\n+      end\n+      if r3\n+        r2 = nil\n+      else\n+        self.index = i2\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s1 << r2\n+      if r2\n+        if index < input_length\n+          r6 = (SyntaxNode).new(input, index...(index + 1))\n+          @index += 1\n+        else\n+          terminal_parse_failure("any character")\n+          r6 = nil\n+        end\n+        s1 << r6\n+      end\n+      if s1.last\n+        r1 = (SyntaxNode).new(input, i1...index, s1)\n+        r1.extend(CellValue0)\n+      else\n+        self.index = i1\n+        r1 = nil\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:cell_value][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_separator\n+    start_index = index\n+    if node_cache[:separator].has_key?(index)\n+      cached = node_cache[:separator][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'|\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 1))\n+      @index += 1\n+    else\n+      terminal_parse_failure(\'|\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:separator][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_blanks\n+    start_index = index\n+    if node_cache[:blanks].has_key?(index)\n+      cached = node_cache[:blanks][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1 = index\n+      r2 = _nt_newline\n+      if r2\n+        r1 = r2\n+      else\n+        r3 = _nt_whitespace\n+        if r3\n+          r1 = r3\n+        else\n+          self.index = i1\n+          r1 = nil\n+        end\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:blanks][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_newline\n+    start_index = index\n+    if node_cache[:newline].has_key?(index)\n+      cached = node_cache[:newline][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    if input.index("\\r\\n?", index) == index\n+      r1 = (SyntaxNode).new(input, index...(index + 3))\n+      @index += 3\n+    else\n+      terminal_parse_failure("\\r\\n?")\n+      r1 = nil\n+    end\n+    if r1\n+      r0 = r1\n+    else\n+      if input.index("\\n", index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure("\\n")\n+        r2 = nil\n+      end\n+      if r2\n+        r0 = r2\n+      else\n+        self.index = i0\n+        r0 = nil\n+      end\n+    end\n+\n+    node_cache[:newline][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_whitespace\n+    start_index = index\n+    if node_cache[:whitespace].has_key?(index)\n+      cached = node_cache[:whitespace][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(Regexp.new(\'[ \\\\t]\'), index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 1))\n+      @index += 1\n+    else\n+      r0 = nil\n+    end\n+\n+    node_cache[:whitespace][start_index] = r0\n+\n+    return r0\n+  end\n+\n+end\n+\n+class FeatureParser < Treetop::Runtime::CompiledParser\n+  include Feature\n+end\n+\n+\n+end\n end\n\\ No newline at end of file\ndiff --git a/lib/cucumber/treetop_parser/feature_fr.rb b/lib/cucumber/treetop_parser/feature_fr.rb\nindex 7b0ea26b..63f724d3 100644\n--- a/lib/cucumber/treetop_parser/feature_fr.rb\n+++ b/lib/cucumber/treetop_parser/feature_fr.rb\n@@ -1,1185 +1,1180 @@\n-module Cucumber\r\n-module TreetopParser\r\n-\r\n-module Feature\r\n-  include Treetop::Runtime\r\n-\r\n-  def root\r\n-    @root || :root\r\n-  end\r\n-\r\n-  module Root0\r\n-    def header\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def scenarios\r\n-      elements[2]\r\n-    end\r\n-  end\r\n-\r\n-  module Root1\r\n-    \r\n-    def feature\r\n-      f = Tree::Feature.new(header.text_value.strip)\r\n-      scenarios.populate(f)\r\n-      f\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_root\r\n-    start_index = index\r\n-    if node_cache[:root].has_key?(index)\r\n-      cached = node_cache[:root][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_header\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        r3 = _nt_whitespace\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      s0 << r2\r\n-      if r2\r\n-        r4 = _nt_scenarios\r\n-        s0 << r4\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Root0)\r\n-      r0.extend(Root1)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:root][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Header0\r\n-  end\r\n-\r\n-  def _nt_header\r\n-    start_index = index\r\n-    if node_cache[:header].has_key?(index)\r\n-      cached = node_cache[:header][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1, s1 = index, []\r\n-      i2 = index\r\n-      r3 = _nt_step_scenario\r\n-      if r3\r\n-        r2 = nil\r\n-      else\r\n-        self.index = i2\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s1 << r2\r\n-      if r2\r\n-        if index < input_length\r\n-          r4 = (SyntaxNode).new(input, index...(index + 1))\r\n-          @index += 1\r\n-        else\r\n-          terminal_parse_failure("any character")\r\n-          r4 = nil\r\n-        end\r\n-        s1 << r4\r\n-      end\r\n-      if s1.last\r\n-        r1 = (SyntaxNode).new(input, i1...index, s1)\r\n-        r1.extend(Header0)\r\n-      else\r\n-        self.index = i1\r\n-        r1 = nil\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:header][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Scenarios0\r\n-    def step_scenario\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def more\r\n-      elements[1]\r\n-    end\r\n-  end\r\n-\r\n-  module Scenarios1\r\n-    def populate(feature)\r\n-      step_scenario.populate(feature)\r\n-      more.elements.each { |m| m.populate(feature) }\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_scenarios\r\n-    start_index = index\r\n-    if node_cache[:scenarios].has_key?(index)\r\n-      cached = node_cache[:scenarios][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_step_scenario\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        i3 = index\r\n-        r4 = _nt_table\r\n-        if r4\r\n-          r3 = r4\r\n-        else\r\n-          r5 = _nt_step_scenario\r\n-          if r5\r\n-            r3 = r5\r\n-          else\r\n-            self.index = i3\r\n-            r3 = nil\r\n-          end\r\n-        end\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      s0 << r2\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Scenarios0)\r\n-      r0.extend(Scenarios1)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:scenarios][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module StepScenario0\r\n-  end\r\n-\r\n-  module StepScenario1\r\n-    def scenario_keyword\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-\r\n-    def steps\r\n-      elements[6]\r\n-    end\r\n-  end\r\n-\r\n-  module StepScenario2\r\n-    def populate(feature)\r\n-      sc = feature.add_scenario(name.text_value.strip)\r\n-      steps.elements.each{|s| s.populate(sc)}\r\n-      Feature.last_scenario = sc\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_step_scenario\r\n-    start_index = index\r\n-    if node_cache[:step_scenario].has_key?(index)\r\n-      cached = node_cache[:step_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_scenario_keyword\r\n-    s0 << r1\r\n-    if r1\r\n-      if input.index(":", index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure(":")\r\n-        r2 = nil\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s3, i3 = [], index\r\n-        loop do\r\n-          r4 = _nt_whitespace\r\n-          if r4\r\n-            s3 << r4\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s3.empty?\r\n-          self.index = i3\r\n-          r3 = nil\r\n-        else\r\n-          r3 = SyntaxNode.new(input, i3...index, s3)\r\n-        end\r\n-        s0 << r3\r\n-        if r3\r\n-          s5, i5 = [], index\r\n-          loop do\r\n-            i6, s6 = index, []\r\n-            i7 = index\r\n-            r8 = _nt_newline\r\n-            if r8\r\n-              r7 = nil\r\n-            else\r\n-              self.index = i7\r\n-              r7 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s6 << r7\r\n-            if r7\r\n-              if index < input_length\r\n-                r9 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r9 = nil\r\n-              end\r\n-              s6 << r9\r\n-            end\r\n-            if s6.last\r\n-              r6 = (SyntaxNode).new(input, i6...index, s6)\r\n-              r6.extend(StepScenario0)\r\n-            else\r\n-              self.index = i6\r\n-              r6 = nil\r\n-            end\r\n-            if r6\r\n-              s5 << r6\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s5.empty?\r\n-            self.index = i5\r\n-            r5 = nil\r\n-          else\r\n-            r5 = SyntaxNode.new(input, i5...index, s5)\r\n-          end\r\n-          s0 << r5\r\n-          if r5\r\n-            s10, i10 = [], index\r\n-            loop do\r\n-              r11 = _nt_newline\r\n-              if r11\r\n-                s10 << r11\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r10 = SyntaxNode.new(input, i10...index, s10)\r\n-            s0 << r10\r\n-            if r10\r\n-              r12 = _nt_blanks\r\n-              s0 << r12\r\n-              if r12\r\n-                s13, i13 = [], index\r\n-                loop do\r\n-                  r14 = _nt_step_or_given_scenario\r\n-                  if r14\r\n-                    s13 << r14\r\n-                  else\r\n-                    break\r\n-                  end\r\n-                end\r\n-                if s13.empty?\r\n-                  self.index = i13\r\n-                  r13 = nil\r\n-                else\r\n-                  r13 = SyntaxNode.new(input, i13...index, s13)\r\n-                end\r\n-                s0 << r13\r\n-              end\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(StepScenario1)\r\n-      r0.extend(StepScenario2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:step_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_step_or_given_scenario\r\n-    start_index = index\r\n-    if node_cache[:step_or_given_scenario].has_key?(index)\r\n-      cached = node_cache[:step_or_given_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    r1 = _nt_step\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      r2 = _nt_given_scenario\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        self.index = i0\r\n-        r0 = nil\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:step_or_given_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Step0\r\n-  end\r\n-\r\n-  module Step1\r\n-    def step_keyword\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-  end\r\n-\r\n-  module Step2\r\n-    def populate(scenario)\r\n-      line = input.line_of(interval.first)\r\n-      scenario.add_step(step_keyword.text_value, name.text_value.strip, line)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_step\r\n-    start_index = index\r\n-    if node_cache[:step].has_key?(index)\r\n-      cached = node_cache[:step][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    s1, i1 = [], index\r\n-    loop do\r\n-      r2 = _nt_whitespace\r\n-      if r2\r\n-        s1 << r2\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r1 = SyntaxNode.new(input, i1...index, s1)\r\n-    s0 << r1\r\n-    if r1\r\n-      r3 = _nt_step_keyword\r\n-      s0 << r3\r\n-      if r3\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          r5 = _nt_whitespace\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-        if r4\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            i7, s7 = index, []\r\n-            i8 = index\r\n-            r9 = _nt_newline\r\n-            if r9\r\n-              r8 = nil\r\n-            else\r\n-              self.index = i8\r\n-              r8 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s7 << r8\r\n-            if r8\r\n-              if index < input_length\r\n-                r10 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r10 = nil\r\n-              end\r\n-              s7 << r10\r\n-            end\r\n-            if s7.last\r\n-              r7 = (SyntaxNode).new(input, i7...index, s7)\r\n-              r7.extend(Step0)\r\n-            else\r\n-              self.index = i7\r\n-              r7 = nil\r\n-            end\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s6.empty?\r\n-            self.index = i6\r\n-            r6 = nil\r\n-          else\r\n-            r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          end\r\n-          s0 << r6\r\n-          if r6\r\n-            s11, i11 = [], index\r\n-            loop do\r\n-              r12 = _nt_newline\r\n-              if r12\r\n-                s11 << r12\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r11 = SyntaxNode.new(input, i11...index, s11)\r\n-            s0 << r11\r\n-            if r11\r\n-              r13 = _nt_blanks\r\n-              s0 << r13\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Step1)\r\n-      r0.extend(Step2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:step][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module GivenScenario0\r\n-  end\r\n-\r\n-  module GivenScenario1\r\n-    def given_scenario_keyword\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-  end\r\n-\r\n-  module GivenScenario2\r\n-    def populate(scenario)\r\n-      line = input.line_of(interval.first)\r\n-      scenario.add_given_scenario(name.text_value.strip, line)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_given_scenario\r\n-    start_index = index\r\n-    if node_cache[:given_scenario].has_key?(index)\r\n-      cached = node_cache[:given_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_given_scenario_keyword\r\n-    s0 << r1\r\n-    if r1\r\n-      if input.index(":", index) == index\r\n-        r3 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure(":")\r\n-        r3 = nil\r\n-      end\r\n-      if r3\r\n-        r2 = r3\r\n-      else\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          r5 = _nt_whitespace\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-        if r4\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            i7, s7 = index, []\r\n-            i8 = index\r\n-            r9 = _nt_newline\r\n-            if r9\r\n-              r8 = nil\r\n-            else\r\n-              self.index = i8\r\n-              r8 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s7 << r8\r\n-            if r8\r\n-              if index < input_length\r\n-                r10 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r10 = nil\r\n-              end\r\n-              s7 << r10\r\n-            end\r\n-            if s7.last\r\n-              r7 = (SyntaxNode).new(input, i7...index, s7)\r\n-              r7.extend(GivenScenario0)\r\n-            else\r\n-              self.index = i7\r\n-              r7 = nil\r\n-            end\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s6.empty?\r\n-            self.index = i6\r\n-            r6 = nil\r\n-          else\r\n-            r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          end\r\n-          s0 << r6\r\n-          if r6\r\n-            s11, i11 = [], index\r\n-            loop do\r\n-              r12 = _nt_newline\r\n-              if r12\r\n-                s11 << r12\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r11 = SyntaxNode.new(input, i11...index, s11)\r\n-            s0 << r11\r\n-            if r11\r\n-              r13 = _nt_blanks\r\n-              s0 << r13\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(GivenScenario1)\r\n-      r0.extend(GivenScenario2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:given_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_step_keyword\r\n-    start_index = index\r\n-    if node_cache[:step_keyword].has_key?(index)\r\n-      cached = node_cache[:step_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    if input.index(\'Soit\', index) == index\r\n-      r1 = (SyntaxNode).new(input, index...(index + 4))\r\n-      @index += 4\r\n-    else\r\n-      terminal_parse_failure(\'Soit\')\r\n-      r1 = nil\r\n-    end\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      if input.index(\'Lorsque\', index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 7))\r\n-        @index += 7\r\n-      else\r\n-        terminal_parse_failure(\'Lorsque\')\r\n-        r2 = nil\r\n-      end\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        if input.index(\'Alors\', index) == index\r\n-          r3 = (SyntaxNode).new(input, index...(index + 5))\r\n-          @index += 5\r\n-        else\r\n-          terminal_parse_failure(\'Alors\')\r\n-          r3 = nil\r\n-        end\r\n-        if r3\r\n-          r0 = r3\r\n-        else\r\n-          if input.index(\'Et\', index) == index\r\n-            r4 = (SyntaxNode).new(input, index...(index + 2))\r\n-            @index += 2\r\n-          else\r\n-            terminal_parse_failure(\'Et\')\r\n-            r4 = nil\r\n-          end\r\n-          if r4\r\n-            r0 = r4\r\n-          else\r\n-            self.index = i0\r\n-            r0 = nil\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:step_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_scenario_keyword\r\n-    start_index = index\r\n-    if node_cache[:scenario_keyword].has_key?(index)\r\n-      cached = node_cache[:scenario_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'Scenario\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 8))\r\n-      @index += 8\r\n-    else\r\n-      terminal_parse_failure(\'Scenario\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:scenario_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_given_scenario_keyword\r\n-    start_index = index\r\n-    if node_cache[:given_scenario_keyword].has_key?(index)\r\n-      cached = node_cache[:given_scenario_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'SoitScenario\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 12))\r\n-      @index += 12\r\n-    else\r\n-      terminal_parse_failure(\'SoitScenario\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:given_scenario_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Table0\r\n-    def newline\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def table_line\r\n-      elements[1]\r\n-    end\r\n-  end\r\n-\r\n-  module Table1\r\n-    def table_line\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def more\r\n-      elements[1]\r\n-    end\r\n-\r\n-  end\r\n-\r\n-  module Table2\r\n-    def populate(feature)\r\n-      Feature.last_scenario.table_header = table_line.values\r\n-      more.elements.each do |e|\r\n-        feature.add_row_scenario(Feature.last_scenario, e.table_line.values, e.table_line.line)\r\n-      end\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_table\r\n-    start_index = index\r\n-    if node_cache[:table].has_key?(index)\r\n-      cached = node_cache[:table][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_table_line\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        i3, s3 = index, []\r\n-        r4 = _nt_newline\r\n-        s3 << r4\r\n-        if r4\r\n-          r5 = _nt_table_line\r\n-          s3 << r5\r\n-        end\r\n-        if s3.last\r\n-          r3 = (SyntaxNode).new(input, i3...index, s3)\r\n-          r3.extend(Table0)\r\n-        else\r\n-          self.index = i3\r\n-          r3 = nil\r\n-        end\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      if s2.empty?\r\n-        self.index = i2\r\n-        r2 = nil\r\n-      else\r\n-        r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s6, i6 = [], index\r\n-        loop do\r\n-          r7 = _nt_newline\r\n-          if r7\r\n-            s6 << r7\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        r6 = SyntaxNode.new(input, i6...index, s6)\r\n-        s0 << r6\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Table1)\r\n-      r0.extend(Table2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:table][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module TableLine0\r\n-    def cell_value\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def separator\r\n-      elements[3]\r\n-    end\r\n-  end\r\n-\r\n-  module TableLine1\r\n-    def separator\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def cells\r\n-      elements[2]\r\n-    end\r\n-  end\r\n-\r\n-  module TableLine2\r\n-    def values\r\n-      cells.elements.map { |cell| cell.cell_value.text_value }\r\n-    end\r\n-    \r\n-    def line\r\n-      input.line_of(interval.first)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_table_line\r\n-    start_index = index\r\n-    if node_cache[:table_line].has_key?(index)\r\n-      cached = node_cache[:table_line][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    s1, i1 = [], index\r\n-    loop do\r\n-      r2 = _nt_whitespace\r\n-      if r2\r\n-        s1 << r2\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r1 = SyntaxNode.new(input, i1...index, s1)\r\n-    s0 << r1\r\n-    if r1\r\n-      r3 = _nt_separator\r\n-      s0 << r3\r\n-      if r3\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          i5, s5 = index, []\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            r7 = _nt_whitespace\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          s5 << r6\r\n-          if r6\r\n-            r8 = _nt_cell_value\r\n-            s5 << r8\r\n-            if r8\r\n-              s9, i9 = [], index\r\n-              loop do\r\n-                r10 = _nt_whitespace\r\n-                if r10\r\n-                  s9 << r10\r\n-                else\r\n-                  break\r\n-                end\r\n-              end\r\n-              r9 = SyntaxNode.new(input, i9...index, s9)\r\n-              s5 << r9\r\n-              if r9\r\n-                r11 = _nt_separator\r\n-                s5 << r11\r\n-              end\r\n-            end\r\n-          end\r\n-          if s5.last\r\n-            r5 = (SyntaxNode).new(input, i5...index, s5)\r\n-            r5.extend(TableLine0)\r\n-          else\r\n-            self.index = i5\r\n-            r5 = nil\r\n-          end\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(TableLine1)\r\n-      r0.extend(TableLine2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:table_line][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module CellValue0\r\n-  end\r\n-\r\n-  def _nt_cell_value\r\n-    start_index = index\r\n-    if node_cache[:cell_value].has_key?(index)\r\n-      cached = node_cache[:cell_value][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1, s1 = index, []\r\n-      i2 = index\r\n-      i3 = index\r\n-      r4 = _nt_separator\r\n-      if r4\r\n-        r3 = r4\r\n-      else\r\n-        r5 = _nt_newline\r\n-        if r5\r\n-          r3 = r5\r\n-        else\r\n-          r6 = _nt_whitespace\r\n-          if r6\r\n-            r3 = r6\r\n-          else\r\n-            self.index = i3\r\n-            r3 = nil\r\n-          end\r\n-        end\r\n-      end\r\n-      if r3\r\n-        r2 = nil\r\n-      else\r\n-        self.index = i2\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s1 << r2\r\n-      if r2\r\n-        if index < input_length\r\n-          r7 = (SyntaxNode).new(input, index...(index + 1))\r\n-          @index += 1\r\n-        else\r\n-          terminal_parse_failure("any character")\r\n-          r7 = nil\r\n-        end\r\n-        s1 << r7\r\n-      end\r\n-      if s1.last\r\n-        r1 = (SyntaxNode).new(input, i1...index, s1)\r\n-        r1.extend(CellValue0)\r\n-      else\r\n-        self.index = i1\r\n-        r1 = nil\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:cell_value][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_separator\r\n-    start_index = index\r\n-    if node_cache[:separator].has_key?(index)\r\n-      cached = node_cache[:separator][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'|\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 1))\r\n-      @index += 1\r\n-    else\r\n-      terminal_parse_failure(\'|\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:separator][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_blanks\r\n-    start_index = index\r\n-    if node_cache[:blanks].has_key?(index)\r\n-      cached = node_cache[:blanks][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1 = index\r\n-      r2 = _nt_newline\r\n-      if r2\r\n-        r1 = r2\r\n-      else\r\n-        r3 = _nt_whitespace\r\n-        if r3\r\n-          r1 = r3\r\n-        else\r\n-          self.index = i1\r\n-          r1 = nil\r\n-        end\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:blanks][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_newline\r\n-    start_index = index\r\n-    if node_cache[:newline].has_key?(index)\r\n-      cached = node_cache[:newline][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    if input.index("\\r\\n?", index) == index\r\n-      r1 = (SyntaxNode).new(input, index...(index + 3))\r\n-      @index += 3\r\n-    else\r\n-      terminal_parse_failure("\\r\\n?")\r\n-      r1 = nil\r\n-    end\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      if input.index("\\n", index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure("\\n")\r\n-        r2 = nil\r\n-      end\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        self.index = i0\r\n-        r0 = nil\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:newline][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_whitespace\r\n-    start_index = index\r\n-    if node_cache[:whitespace].has_key?(index)\r\n-      cached = node_cache[:whitespace][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(Regexp.new(\'[ \\\\t]\'), index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 1))\r\n-      @index += 1\r\n-    else\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:whitespace][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-end\r\n-\r\n-class FeatureParser < Treetop::Runtime::CompiledParser\r\n-  include Feature\r\n-end\r\n-\r\n-\r\n-end\r\n+module Cucumber\n+module TreetopParser\n+\n+module Feature\n+  include Treetop::Runtime\n+\n+  def root\n+    @root || :root\n+  end\n+\n+  module Root0\n+    def header\n+      elements[0]\n+    end\n+\n+    def scenarios\n+      elements[2]\n+    end\n+  end\n+\n+  module Root1\n+    \n+    def feature\n+      f = Tree::Feature.new(header.text_value.strip)\n+      scenarios.populate(f)\n+      f\n+    end\n+  end\n+\n+  def _nt_root\n+    start_index = index\n+    if node_cache[:root].has_key?(index)\n+      cached = node_cache[:root][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_header\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        r3 = _nt_whitespace\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      r2 = SyntaxNode.new(input, i2...index, s2)\n+      s0 << r2\n+      if r2\n+        r4 = _nt_scenarios\n+        s0 << r4\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Root0)\n+      r0.extend(Root1)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:root][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Header0\n+  end\n+\n+  def _nt_header\n+    start_index = index\n+    if node_cache[:header].has_key?(index)\n+      cached = node_cache[:header][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1, s1 = index, []\n+      i2 = index\n+      r3 = _nt_step_scenario\n+      if r3\n+        r2 = nil\n+      else\n+        self.index = i2\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s1 << r2\n+      if r2\n+        if index < input_length\n+          r4 = (SyntaxNode).new(input, index...(index + 1))\n+          @index += 1\n+        else\n+          terminal_parse_failure("any character")\n+          r4 = nil\n+        end\n+        s1 << r4\n+      end\n+      if s1.last\n+        r1 = (SyntaxNode).new(input, i1...index, s1)\n+        r1.extend(Header0)\n+      else\n+        self.index = i1\n+        r1 = nil\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:header][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Scenarios0\n+    def step_scenario\n+      elements[0]\n+    end\n+\n+    def more\n+      elements[1]\n+    end\n+  end\n+\n+  module Scenarios1\n+    def populate(feature)\n+      step_scenario.populate(feature)\n+      more.elements.each { |m| m.populate(feature) }\n+    end\n+  end\n+\n+  def _nt_scenarios\n+    start_index = index\n+    if node_cache[:scenarios].has_key?(index)\n+      cached = node_cache[:scenarios][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_step_scenario\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        i3 = index\n+        r4 = _nt_table\n+        if r4\n+          r3 = r4\n+        else\n+          r5 = _nt_step_scenario\n+          if r5\n+            r3 = r5\n+          else\n+            self.index = i3\n+            r3 = nil\n+          end\n+        end\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      r2 = SyntaxNode.new(input, i2...index, s2)\n+      s0 << r2\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Scenarios0)\n+      r0.extend(Scenarios1)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:scenarios][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module StepScenario0\n+  end\n+\n+  module StepScenario1\n+    def scenario_keyword\n+      elements[0]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+\n+    def steps\n+      elements[6]\n+    end\n+  end\n+\n+  module StepScenario2\n+    def populate(feature)\n+      sc = feature.add_scenario(name.text_value.strip)\n+      steps.elements.each{|s| s.populate(sc)}\n+      Feature.last_scenario = sc\n+    end\n+  end\n+\n+  def _nt_step_scenario\n+    start_index = index\n+    if node_cache[:step_scenario].has_key?(index)\n+      cached = node_cache[:step_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_scenario_keyword\n+    s0 << r1\n+    if r1\n+      if input.index(":", index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure(":")\n+        r2 = nil\n+      end\n+      s0 << r2\n+      if r2\n+        s3, i3 = [], index\n+        loop do\n+          r4 = _nt_whitespace\n+          if r4\n+            s3 << r4\n+          else\n+            break\n+          end\n+        end\n+        if s3.empty?\n+          self.index = i3\n+          r3 = nil\n+        else\n+          r3 = SyntaxNode.new(input, i3...index, s3)\n+        end\n+        s0 << r3\n+        if r3\n+          s5, i5 = [], index\n+          loop do\n+            i6, s6 = index, []\n+            i7 = index\n+            r8 = _nt_newline\n+            if r8\n+              r7 = nil\n+            else\n+              self.index = i7\n+              r7 = SyntaxNode.new(input, index...index)\n+            end\n+            s6 << r7\n+            if r7\n+              if index < input_length\n+                r9 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r9 = nil\n+              end\n+              s6 << r9\n+            end\n+            if s6.last\n+              r6 = (SyntaxNode).new(input, i6...index, s6)\n+              r6.extend(StepScenario0)\n+            else\n+              self.index = i6\n+              r6 = nil\n+            end\n+            if r6\n+              s5 << r6\n+            else\n+              break\n+            end\n+          end\n+          if s5.empty?\n+            self.index = i5\n+            r5 = nil\n+          else\n+            r5 = SyntaxNode.new(input, i5...index, s5)\n+          end\n+          s0 << r5\n+          if r5\n+            s10, i10 = [], index\n+            loop do\n+              r11 = _nt_newline\n+              if r11\n+                s10 << r11\n+              else\n+                break\n+              end\n+            end\n+            r10 = SyntaxNode.new(input, i10...index, s10)\n+            s0 << r10\n+            if r10\n+              r12 = _nt_blanks\n+              s0 << r12\n+              if r12\n+                s13, i13 = [], index\n+                loop do\n+                  r14 = _nt_step_or_given_scenario\n+                  if r14\n+                    s13 << r14\n+                  else\n+                    break\n+                  end\n+                end\n+                if s13.empty?\n+                  self.index = i13\n+                  r13 = nil\n+                else\n+                  r13 = SyntaxNode.new(input, i13...index, s13)\n+                end\n+                s0 << r13\n+              end\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(StepScenario1)\n+      r0.extend(StepScenario2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:step_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_step_or_given_scenario\n+    start_index = index\n+    if node_cache[:step_or_given_scenario].has_key?(index)\n+      cached = node_cache[:step_or_given_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    r1 = _nt_step\n+    if r1\n+      r0 = r1\n+    else\n+      r2 = _nt_given_scenario\n+      if r2\n+        r0 = r2\n+      else\n+        self.index = i0\n+        r0 = nil\n+      end\n+    end\n+\n+    node_cache[:step_or_given_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Step0\n+  end\n+\n+  module Step1\n+    def step_keyword\n+      elements[1]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+  end\n+\n+  module Step2\n+    def populate(scenario)\n+      line = input.line_of(interval.first)\n+      scenario.add_step(step_keyword.text_value, name.text_value.strip, line)\n+    end\n+  end\n+\n+  def _nt_step\n+    start_index = index\n+    if node_cache[:step].has_key?(index)\n+      cached = node_cache[:step][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    s1, i1 = [], index\n+    loop do\n+      r2 = _nt_whitespace\n+      if r2\n+        s1 << r2\n+      else\n+        break\n+      end\n+    end\n+    r1 = SyntaxNode.new(input, i1...index, s1)\n+    s0 << r1\n+    if r1\n+      r3 = _nt_step_keyword\n+      s0 << r3\n+      if r3\n+        s4, i4 = [], index\n+        loop do\n+          r5 = _nt_whitespace\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+        if r4\n+          s6, i6 = [], index\n+          loop do\n+            i7, s7 = index, []\n+            i8 = index\n+            r9 = _nt_newline\n+            if r9\n+              r8 = nil\n+            else\n+              self.index = i8\n+              r8 = SyntaxNode.new(input, index...index)\n+            end\n+            s7 << r8\n+            if r8\n+              if index < input_length\n+                r10 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r10 = nil\n+              end\n+              s7 << r10\n+            end\n+            if s7.last\n+              r7 = (SyntaxNode).new(input, i7...index, s7)\n+              r7.extend(Step0)\n+            else\n+              self.index = i7\n+              r7 = nil\n+            end\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          if s6.empty?\n+            self.index = i6\n+            r6 = nil\n+          else\n+            r6 = SyntaxNode.new(input, i6...index, s6)\n+          end\n+          s0 << r6\n+          if r6\n+            s11, i11 = [], index\n+            loop do\n+              r12 = _nt_newline\n+              if r12\n+                s11 << r12\n+              else\n+                break\n+              end\n+            end\n+            r11 = SyntaxNode.new(input, i11...index, s11)\n+            s0 << r11\n+            if r11\n+              r13 = _nt_blanks\n+              s0 << r13\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Step1)\n+      r0.extend(Step2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:step][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module GivenScenario0\n+  end\n+\n+  module GivenScenario1\n+    def given_scenario_keyword\n+      elements[0]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+  end\n+\n+  module GivenScenario2\n+    def populate(scenario)\n+      line = input.line_of(interval.first)\n+      scenario.add_given_scenario(name.text_value.strip, line)\n+    end\n+  end\n+\n+  def _nt_given_scenario\n+    start_index = index\n+    if node_cache[:given_scenario].has_key?(index)\n+      cached = node_cache[:given_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_given_scenario_keyword\n+    s0 << r1\n+    if r1\n+      if input.index(":", index) == index\n+        r3 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure(":")\n+        r3 = nil\n+      end\n+      if r3\n+        r2 = r3\n+      else\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s0 << r2\n+      if r2\n+        s4, i4 = [], index\n+        loop do\n+          r5 = _nt_whitespace\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+        if r4\n+          s6, i6 = [], index\n+          loop do\n+            i7, s7 = index, []\n+            i8 = index\n+            r9 = _nt_newline\n+            if r9\n+              r8 = nil\n+            else\n+              self.index = i8\n+              r8 = SyntaxNode.new(input, index...index)\n+            end\n+            s7 << r8\n+            if r8\n+              if index < input_length\n+                r10 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r10 = nil\n+              end\n+              s7 << r10\n+            end\n+            if s7.last\n+              r7 = (SyntaxNode).new(input, i7...index, s7)\n+              r7.extend(GivenScenario0)\n+            else\n+              self.index = i7\n+              r7 = nil\n+            end\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          if s6.empty?\n+            self.index = i6\n+            r6 = nil\n+          else\n+            r6 = SyntaxNode.new(input, i6...index, s6)\n+          end\n+          s0 << r6\n+          if r6\n+            s11, i11 = [], index\n+            loop do\n+              r12 = _nt_newline\n+              if r12\n+                s11 << r12\n+              else\n+                break\n+              end\n+            end\n+            r11 = SyntaxNode.new(input, i11...index, s11)\n+            s0 << r11\n+            if r11\n+              r13 = _nt_blanks\n+              s0 << r13\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(GivenScenario1)\n+      r0.extend(GivenScenario2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:given_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_step_keyword\n+    start_index = index\n+    if node_cache[:step_keyword].has_key?(index)\n+      cached = node_cache[:step_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    if input.index(\'Soit\', index) == index\n+      r1 = (SyntaxNode).new(input, index...(index + 4))\n+      @index += 4\n+    else\n+      terminal_parse_failure(\'Soit\')\n+      r1 = nil\n+    end\n+    if r1\n+      r0 = r1\n+    else\n+      if input.index(\'Lorsque\', index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 7))\n+        @index += 7\n+      else\n+        terminal_parse_failure(\'Lorsque\')\n+        r2 = nil\n+      end\n+      if r2\n+        r0 = r2\n+      else\n+        if input.index(\'Alors\', index) == index\n+          r3 = (SyntaxNode).new(input, index...(index + 5))\n+          @index += 5\n+        else\n+          terminal_parse_failure(\'Alors\')\n+          r3 = nil\n+        end\n+        if r3\n+          r0 = r3\n+        else\n+          if input.index(\'Et\', index) == index\n+            r4 = (SyntaxNode).new(input, index...(index + 2))\n+            @index += 2\n+          else\n+            terminal_parse_failure(\'Et\')\n+            r4 = nil\n+          end\n+          if r4\n+            r0 = r4\n+          else\n+            self.index = i0\n+            r0 = nil\n+          end\n+        end\n+      end\n+    end\n+\n+    node_cache[:step_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_scenario_keyword\n+    start_index = index\n+    if node_cache[:scenario_keyword].has_key?(index)\n+      cached = node_cache[:scenario_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'Scenario\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 8))\n+      @index += 8\n+    else\n+      terminal_parse_failure(\'Scenario\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:scenario_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_given_scenario_keyword\n+    start_index = index\n+    if node_cache[:given_scenario_keyword].has_key?(index)\n+      cached = node_cache[:given_scenario_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'SoitScenario\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 12))\n+      @index += 12\n+    else\n+      terminal_parse_failure(\'SoitScenario\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:given_scenario_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Table0\n+    def newline\n+      elements[0]\n+    end\n+\n+    def table_line\n+      elements[1]\n+    end\n+  end\n+\n+  module Table1\n+    def table_line\n+      elements[0]\n+    end\n+\n+    def more\n+      elements[1]\n+    end\n+\n+  end\n+\n+  module Table2\n+    def populate(feature)\n+      Feature.last_scenario.table_header = table_line.values\n+      more.elements.each do |e|\n+        feature.add_row_scenario(Feature.last_scenario, e.table_line.values, e.table_line.line)\n+      end\n+    end\n+  end\n+\n+  def _nt_table\n+    start_index = index\n+    if node_cache[:table].has_key?(index)\n+      cached = node_cache[:table][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_table_line\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        i3, s3 = index, []\n+        r4 = _nt_newline\n+        s3 << r4\n+        if r4\n+          r5 = _nt_table_line\n+          s3 << r5\n+        end\n+        if s3.last\n+          r3 = (SyntaxNode).new(input, i3...index, s3)\n+          r3.extend(Table0)\n+        else\n+          self.index = i3\n+          r3 = nil\n+        end\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      if s2.empty?\n+        self.index = i2\n+        r2 = nil\n+      else\n+        r2 = SyntaxNode.new(input, i2...index, s2)\n+      end\n+      s0 << r2\n+      if r2\n+        s6, i6 = [], index\n+        loop do\n+          r7 = _nt_newline\n+          if r7\n+            s6 << r7\n+          else\n+            break\n+          end\n+        end\n+        r6 = SyntaxNode.new(input, i6...index, s6)\n+        s0 << r6\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Table1)\n+      r0.extend(Table2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:table][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module TableLine0\n+    def cell_value\n+      elements[1]\n+    end\n+\n+    def separator\n+      elements[3]\n+    end\n+  end\n+\n+  module TableLine1\n+    def separator\n+      elements[1]\n+    end\n+\n+    def cells\n+      elements[2]\n+    end\n+  end\n+\n+  module TableLine2\n+    def values\n+      cells.elements.map { |cell| cell.cell_value.text_value.strip }\n+    end\n+    \n+    def line\n+      input.line_of(interval.first)\n+    end\n+  end\n+\n+  def _nt_table_line\n+    start_index = index\n+    if node_cache[:table_line].has_key?(index)\n+      cached = node_cache[:table_line][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    s1, i1 = [], index\n+    loop do\n+      r2 = _nt_whitespace\n+      if r2\n+        s1 << r2\n+      else\n+        break\n+      end\n+    end\n+    r1 = SyntaxNode.new(input, i1...index, s1)\n+    s0 << r1\n+    if r1\n+      r3 = _nt_separator\n+      s0 << r3\n+      if r3\n+        s4, i4 = [], index\n+        loop do\n+          i5, s5 = index, []\n+          s6, i6 = [], index\n+          loop do\n+            r7 = _nt_whitespace\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          r6 = SyntaxNode.new(input, i6...index, s6)\n+          s5 << r6\n+          if r6\n+            r8 = _nt_cell_value\n+            s5 << r8\n+            if r8\n+              s9, i9 = [], index\n+              loop do\n+                r10 = _nt_whitespace\n+                if r10\n+                  s9 << r10\n+                else\n+                  break\n+                end\n+              end\n+              r9 = SyntaxNode.new(input, i9...index, s9)\n+              s5 << r9\n+              if r9\n+                r11 = _nt_separator\n+                s5 << r11\n+              end\n+            end\n+          end\n+          if s5.last\n+            r5 = (SyntaxNode).new(input, i5...index, s5)\n+            r5.extend(TableLine0)\n+          else\n+            self.index = i5\n+            r5 = nil\n+          end\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(TableLine1)\n+      r0.extend(TableLine2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:table_line][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module CellValue0\n+  end\n+\n+  def _nt_cell_value\n+    start_index = index\n+    if node_cache[:cell_value].has_key?(index)\n+      cached = node_cache[:cell_value][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1, s1 = index, []\n+      i2 = index\n+      i3 = index\n+      r4 = _nt_separator\n+      if r4\n+        r3 = r4\n+      else\n+        r5 = _nt_newline\n+        if r5\n+          r3 = r5\n+        else\n+          self.index = i3\n+          r3 = nil\n+        end\n+      end\n+      if r3\n+        r2 = nil\n+      else\n+        self.index = i2\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s1 << r2\n+      if r2\n+        if index < input_length\n+          r6 = (SyntaxNode).new(input, index...(index + 1))\n+          @index += 1\n+        else\n+          terminal_parse_failure("any character")\n+          r6 = nil\n+        end\n+        s1 << r6\n+      end\n+      if s1.last\n+        r1 = (SyntaxNode).new(input, i1...index, s1)\n+        r1.extend(CellValue0)\n+      else\n+        self.index = i1\n+        r1 = nil\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:cell_value][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_separator\n+    start_index = index\n+    if node_cache[:separator].has_key?(index)\n+      cached = node_cache[:separator][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'|\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 1))\n+      @index += 1\n+    else\n+      terminal_parse_failure(\'|\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:separator][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_blanks\n+    start_index = index\n+    if node_cache[:blanks].has_key?(index)\n+      cached = node_cache[:blanks][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1 = index\n+      r2 = _nt_newline\n+      if r2\n+        r1 = r2\n+      else\n+        r3 = _nt_whitespace\n+        if r3\n+          r1 = r3\n+        else\n+          self.index = i1\n+          r1 = nil\n+        end\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:blanks][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_newline\n+    start_index = index\n+    if node_cache[:newline].has_key?(index)\n+      cached = node_cache[:newline][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    if input.index("\\r\\n?", index) == index\n+      r1 = (SyntaxNode).new(input, index...(index + 3))\n+      @index += 3\n+    else\n+      terminal_parse_failure("\\r\\n?")\n+      r1 = nil\n+    end\n+    if r1\n+      r0 = r1\n+    else\n+      if input.index("\\n", index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure("\\n")\n+        r2 = nil\n+      end\n+      if r2\n+        r0 = r2\n+      else\n+        self.index = i0\n+        r0 = nil\n+      end\n+    end\n+\n+    node_cache[:newline][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_whitespace\n+    start_index = index\n+    if node_cache[:whitespace].has_key?(index)\n+      cached = node_cache[:whitespace][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(Regexp.new(\'[ \\\\t]\'), index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 1))\n+      @index += 1\n+    else\n+      r0 = nil\n+    end\n+\n+    node_cache[:whitespace][start_index] = r0\n+\n+    return r0\n+  end\n+\n+end\n+\n+class FeatureParser < Treetop::Runtime::CompiledParser\n+  include Feature\n+end\n+\n+\n+end\n end\n\\ No newline at end of file\ndiff --git a/lib/cucumber/treetop_parser/feature_no.rb b/lib/cucumber/treetop_parser/feature_no.rb\nindex 98403e1f..db808293 100644\n--- a/lib/cucumber/treetop_parser/feature_no.rb\n+++ b/lib/cucumber/treetop_parser/feature_no.rb\n@@ -1,1185 +1,1180 @@\n-module Cucumber\r\n-module TreetopParser\r\n-\r\n-module Feature\r\n-  include Treetop::Runtime\r\n-\r\n-  def root\r\n-    @root || :root\r\n-  end\r\n-\r\n-  module Root0\r\n-    def header\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def scenarios\r\n-      elements[2]\r\n-    end\r\n-  end\r\n-\r\n-  module Root1\r\n-    \r\n-    def feature\r\n-      f = Tree::Feature.new(header.text_value.strip)\r\n-      scenarios.populate(f)\r\n-      f\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_root\r\n-    start_index = index\r\n-    if node_cache[:root].has_key?(index)\r\n-      cached = node_cache[:root][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_header\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        r3 = _nt_whitespace\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      s0 << r2\r\n-      if r2\r\n-        r4 = _nt_scenarios\r\n-        s0 << r4\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Root0)\r\n-      r0.extend(Root1)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:root][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Header0\r\n-  end\r\n-\r\n-  def _nt_header\r\n-    start_index = index\r\n-    if node_cache[:header].has_key?(index)\r\n-      cached = node_cache[:header][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1, s1 = index, []\r\n-      i2 = index\r\n-      r3 = _nt_step_scenario\r\n-      if r3\r\n-        r2 = nil\r\n-      else\r\n-        self.index = i2\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s1 << r2\r\n-      if r2\r\n-        if index < input_length\r\n-          r4 = (SyntaxNode).new(input, index...(index + 1))\r\n-          @index += 1\r\n-        else\r\n-          terminal_parse_failure("any character")\r\n-          r4 = nil\r\n-        end\r\n-        s1 << r4\r\n-      end\r\n-      if s1.last\r\n-        r1 = (SyntaxNode).new(input, i1...index, s1)\r\n-        r1.extend(Header0)\r\n-      else\r\n-        self.index = i1\r\n-        r1 = nil\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:header][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Scenarios0\r\n-    def step_scenario\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def more\r\n-      elements[1]\r\n-    end\r\n-  end\r\n-\r\n-  module Scenarios1\r\n-    def populate(feature)\r\n-      step_scenario.populate(feature)\r\n-      more.elements.each { |m| m.populate(feature) }\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_scenarios\r\n-    start_index = index\r\n-    if node_cache[:scenarios].has_key?(index)\r\n-      cached = node_cache[:scenarios][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_step_scenario\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        i3 = index\r\n-        r4 = _nt_table\r\n-        if r4\r\n-          r3 = r4\r\n-        else\r\n-          r5 = _nt_step_scenario\r\n-          if r5\r\n-            r3 = r5\r\n-          else\r\n-            self.index = i3\r\n-            r3 = nil\r\n-          end\r\n-        end\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      s0 << r2\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Scenarios0)\r\n-      r0.extend(Scenarios1)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:scenarios][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module StepScenario0\r\n-  end\r\n-\r\n-  module StepScenario1\r\n-    def scenario_keyword\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-\r\n-    def steps\r\n-      elements[6]\r\n-    end\r\n-  end\r\n-\r\n-  module StepScenario2\r\n-    def populate(feature)\r\n-      sc = feature.add_scenario(name.text_value.strip)\r\n-      steps.elements.each{|s| s.populate(sc)}\r\n-      Feature.last_scenario = sc\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_step_scenario\r\n-    start_index = index\r\n-    if node_cache[:step_scenario].has_key?(index)\r\n-      cached = node_cache[:step_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_scenario_keyword\r\n-    s0 << r1\r\n-    if r1\r\n-      if input.index(":", index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure(":")\r\n-        r2 = nil\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s3, i3 = [], index\r\n-        loop do\r\n-          r4 = _nt_whitespace\r\n-          if r4\r\n-            s3 << r4\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s3.empty?\r\n-          self.index = i3\r\n-          r3 = nil\r\n-        else\r\n-          r3 = SyntaxNode.new(input, i3...index, s3)\r\n-        end\r\n-        s0 << r3\r\n-        if r3\r\n-          s5, i5 = [], index\r\n-          loop do\r\n-            i6, s6 = index, []\r\n-            i7 = index\r\n-            r8 = _nt_newline\r\n-            if r8\r\n-              r7 = nil\r\n-            else\r\n-              self.index = i7\r\n-              r7 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s6 << r7\r\n-            if r7\r\n-              if index < input_length\r\n-                r9 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r9 = nil\r\n-              end\r\n-              s6 << r9\r\n-            end\r\n-            if s6.last\r\n-              r6 = (SyntaxNode).new(input, i6...index, s6)\r\n-              r6.extend(StepScenario0)\r\n-            else\r\n-              self.index = i6\r\n-              r6 = nil\r\n-            end\r\n-            if r6\r\n-              s5 << r6\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s5.empty?\r\n-            self.index = i5\r\n-            r5 = nil\r\n-          else\r\n-            r5 = SyntaxNode.new(input, i5...index, s5)\r\n-          end\r\n-          s0 << r5\r\n-          if r5\r\n-            s10, i10 = [], index\r\n-            loop do\r\n-              r11 = _nt_newline\r\n-              if r11\r\n-                s10 << r11\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r10 = SyntaxNode.new(input, i10...index, s10)\r\n-            s0 << r10\r\n-            if r10\r\n-              r12 = _nt_blanks\r\n-              s0 << r12\r\n-              if r12\r\n-                s13, i13 = [], index\r\n-                loop do\r\n-                  r14 = _nt_step_or_given_scenario\r\n-                  if r14\r\n-                    s13 << r14\r\n-                  else\r\n-                    break\r\n-                  end\r\n-                end\r\n-                if s13.empty?\r\n-                  self.index = i13\r\n-                  r13 = nil\r\n-                else\r\n-                  r13 = SyntaxNode.new(input, i13...index, s13)\r\n-                end\r\n-                s0 << r13\r\n-              end\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(StepScenario1)\r\n-      r0.extend(StepScenario2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:step_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_step_or_given_scenario\r\n-    start_index = index\r\n-    if node_cache[:step_or_given_scenario].has_key?(index)\r\n-      cached = node_cache[:step_or_given_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    r1 = _nt_step\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      r2 = _nt_given_scenario\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        self.index = i0\r\n-        r0 = nil\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:step_or_given_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Step0\r\n-  end\r\n-\r\n-  module Step1\r\n-    def step_keyword\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-  end\r\n-\r\n-  module Step2\r\n-    def populate(scenario)\r\n-      line = input.line_of(interval.first)\r\n-      scenario.add_step(step_keyword.text_value, name.text_value.strip, line)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_step\r\n-    start_index = index\r\n-    if node_cache[:step].has_key?(index)\r\n-      cached = node_cache[:step][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    s1, i1 = [], index\r\n-    loop do\r\n-      r2 = _nt_whitespace\r\n-      if r2\r\n-        s1 << r2\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r1 = SyntaxNode.new(input, i1...index, s1)\r\n-    s0 << r1\r\n-    if r1\r\n-      r3 = _nt_step_keyword\r\n-      s0 << r3\r\n-      if r3\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          r5 = _nt_whitespace\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-        if r4\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            i7, s7 = index, []\r\n-            i8 = index\r\n-            r9 = _nt_newline\r\n-            if r9\r\n-              r8 = nil\r\n-            else\r\n-              self.index = i8\r\n-              r8 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s7 << r8\r\n-            if r8\r\n-              if index < input_length\r\n-                r10 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r10 = nil\r\n-              end\r\n-              s7 << r10\r\n-            end\r\n-            if s7.last\r\n-              r7 = (SyntaxNode).new(input, i7...index, s7)\r\n-              r7.extend(Step0)\r\n-            else\r\n-              self.index = i7\r\n-              r7 = nil\r\n-            end\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s6.empty?\r\n-            self.index = i6\r\n-            r6 = nil\r\n-          else\r\n-            r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          end\r\n-          s0 << r6\r\n-          if r6\r\n-            s11, i11 = [], index\r\n-            loop do\r\n-              r12 = _nt_newline\r\n-              if r12\r\n-                s11 << r12\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r11 = SyntaxNode.new(input, i11...index, s11)\r\n-            s0 << r11\r\n-            if r11\r\n-              r13 = _nt_blanks\r\n-              s0 << r13\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Step1)\r\n-      r0.extend(Step2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:step][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module GivenScenario0\r\n-  end\r\n-\r\n-  module GivenScenario1\r\n-    def given_scenario_keyword\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-  end\r\n-\r\n-  module GivenScenario2\r\n-    def populate(scenario)\r\n-      line = input.line_of(interval.first)\r\n-      scenario.add_given_scenario(name.text_value.strip, line)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_given_scenario\r\n-    start_index = index\r\n-    if node_cache[:given_scenario].has_key?(index)\r\n-      cached = node_cache[:given_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_given_scenario_keyword\r\n-    s0 << r1\r\n-    if r1\r\n-      if input.index(":", index) == index\r\n-        r3 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure(":")\r\n-        r3 = nil\r\n-      end\r\n-      if r3\r\n-        r2 = r3\r\n-      else\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          r5 = _nt_whitespace\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-        if r4\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            i7, s7 = index, []\r\n-            i8 = index\r\n-            r9 = _nt_newline\r\n-            if r9\r\n-              r8 = nil\r\n-            else\r\n-              self.index = i8\r\n-              r8 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s7 << r8\r\n-            if r8\r\n-              if index < input_length\r\n-                r10 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r10 = nil\r\n-              end\r\n-              s7 << r10\r\n-            end\r\n-            if s7.last\r\n-              r7 = (SyntaxNode).new(input, i7...index, s7)\r\n-              r7.extend(GivenScenario0)\r\n-            else\r\n-              self.index = i7\r\n-              r7 = nil\r\n-            end\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s6.empty?\r\n-            self.index = i6\r\n-            r6 = nil\r\n-          else\r\n-            r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          end\r\n-          s0 << r6\r\n-          if r6\r\n-            s11, i11 = [], index\r\n-            loop do\r\n-              r12 = _nt_newline\r\n-              if r12\r\n-                s11 << r12\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r11 = SyntaxNode.new(input, i11...index, s11)\r\n-            s0 << r11\r\n-            if r11\r\n-              r13 = _nt_blanks\r\n-              s0 << r13\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(GivenScenario1)\r\n-      r0.extend(GivenScenario2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:given_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_step_keyword\r\n-    start_index = index\r\n-    if node_cache[:step_keyword].has_key?(index)\r\n-      cached = node_cache[:step_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    if input.index(\'Gitt\', index) == index\r\n-      r1 = (SyntaxNode).new(input, index...(index + 4))\r\n-      @index += 4\r\n-    else\r\n-      terminal_parse_failure(\'Gitt\')\r\n-      r1 = nil\r\n-    end\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      if input.index(\'Når\', index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 4))\r\n-        @index += 4\r\n-      else\r\n-        terminal_parse_failure(\'Når\')\r\n-        r2 = nil\r\n-      end\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        if input.index(\'Så\', index) == index\r\n-          r3 = (SyntaxNode).new(input, index...(index + 3))\r\n-          @index += 3\r\n-        else\r\n-          terminal_parse_failure(\'Så\')\r\n-          r3 = nil\r\n-        end\r\n-        if r3\r\n-          r0 = r3\r\n-        else\r\n-          if input.index(\'Og\', index) == index\r\n-            r4 = (SyntaxNode).new(input, index...(index + 2))\r\n-            @index += 2\r\n-          else\r\n-            terminal_parse_failure(\'Og\')\r\n-            r4 = nil\r\n-          end\r\n-          if r4\r\n-            r0 = r4\r\n-          else\r\n-            self.index = i0\r\n-            r0 = nil\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:step_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_scenario_keyword\r\n-    start_index = index\r\n-    if node_cache[:scenario_keyword].has_key?(index)\r\n-      cached = node_cache[:scenario_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'Scenario\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 8))\r\n-      @index += 8\r\n-    else\r\n-      terminal_parse_failure(\'Scenario\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:scenario_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_given_scenario_keyword\r\n-    start_index = index\r\n-    if node_cache[:given_scenario_keyword].has_key?(index)\r\n-      cached = node_cache[:given_scenario_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'GittScenario\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 12))\r\n-      @index += 12\r\n-    else\r\n-      terminal_parse_failure(\'GittScenario\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:given_scenario_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Table0\r\n-    def newline\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def table_line\r\n-      elements[1]\r\n-    end\r\n-  end\r\n-\r\n-  module Table1\r\n-    def table_line\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def more\r\n-      elements[1]\r\n-    end\r\n-\r\n-  end\r\n-\r\n-  module Table2\r\n-    def populate(feature)\r\n-      Feature.last_scenario.table_header = table_line.values\r\n-      more.elements.each do |e|\r\n-        feature.add_row_scenario(Feature.last_scenario, e.table_line.values, e.table_line.line)\r\n-      end\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_table\r\n-    start_index = index\r\n-    if node_cache[:table].has_key?(index)\r\n-      cached = node_cache[:table][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_table_line\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        i3, s3 = index, []\r\n-        r4 = _nt_newline\r\n-        s3 << r4\r\n-        if r4\r\n-          r5 = _nt_table_line\r\n-          s3 << r5\r\n-        end\r\n-        if s3.last\r\n-          r3 = (SyntaxNode).new(input, i3...index, s3)\r\n-          r3.extend(Table0)\r\n-        else\r\n-          self.index = i3\r\n-          r3 = nil\r\n-        end\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      if s2.empty?\r\n-        self.index = i2\r\n-        r2 = nil\r\n-      else\r\n-        r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s6, i6 = [], index\r\n-        loop do\r\n-          r7 = _nt_newline\r\n-          if r7\r\n-            s6 << r7\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        r6 = SyntaxNode.new(input, i6...index, s6)\r\n-        s0 << r6\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Table1)\r\n-      r0.extend(Table2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:table][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module TableLine0\r\n-    def cell_value\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def separator\r\n-      elements[3]\r\n-    end\r\n-  end\r\n-\r\n-  module TableLine1\r\n-    def separator\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def cells\r\n-      elements[2]\r\n-    end\r\n-  end\r\n-\r\n-  module TableLine2\r\n-    def values\r\n-      cells.elements.map { |cell| cell.cell_value.text_value }\r\n-    end\r\n-    \r\n-    def line\r\n-      input.line_of(interval.first)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_table_line\r\n-    start_index = index\r\n-    if node_cache[:table_line].has_key?(index)\r\n-      cached = node_cache[:table_line][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    s1, i1 = [], index\r\n-    loop do\r\n-      r2 = _nt_whitespace\r\n-      if r2\r\n-        s1 << r2\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r1 = SyntaxNode.new(input, i1...index, s1)\r\n-    s0 << r1\r\n-    if r1\r\n-      r3 = _nt_separator\r\n-      s0 << r3\r\n-      if r3\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          i5, s5 = index, []\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            r7 = _nt_whitespace\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          s5 << r6\r\n-          if r6\r\n-            r8 = _nt_cell_value\r\n-            s5 << r8\r\n-            if r8\r\n-              s9, i9 = [], index\r\n-              loop do\r\n-                r10 = _nt_whitespace\r\n-                if r10\r\n-                  s9 << r10\r\n-                else\r\n-                  break\r\n-                end\r\n-              end\r\n-              r9 = SyntaxNode.new(input, i9...index, s9)\r\n-              s5 << r9\r\n-              if r9\r\n-                r11 = _nt_separator\r\n-                s5 << r11\r\n-              end\r\n-            end\r\n-          end\r\n-          if s5.last\r\n-            r5 = (SyntaxNode).new(input, i5...index, s5)\r\n-            r5.extend(TableLine0)\r\n-          else\r\n-            self.index = i5\r\n-            r5 = nil\r\n-          end\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(TableLine1)\r\n-      r0.extend(TableLine2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:table_line][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module CellValue0\r\n-  end\r\n-\r\n-  def _nt_cell_value\r\n-    start_index = index\r\n-    if node_cache[:cell_value].has_key?(index)\r\n-      cached = node_cache[:cell_value][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1, s1 = index, []\r\n-      i2 = index\r\n-      i3 = index\r\n-      r4 = _nt_separator\r\n-      if r4\r\n-        r3 = r4\r\n-      else\r\n-        r5 = _nt_newline\r\n-        if r5\r\n-          r3 = r5\r\n-        else\r\n-          r6 = _nt_whitespace\r\n-          if r6\r\n-            r3 = r6\r\n-          else\r\n-            self.index = i3\r\n-            r3 = nil\r\n-          end\r\n-        end\r\n-      end\r\n-      if r3\r\n-        r2 = nil\r\n-      else\r\n-        self.index = i2\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s1 << r2\r\n-      if r2\r\n-        if index < input_length\r\n-          r7 = (SyntaxNode).new(input, index...(index + 1))\r\n-          @index += 1\r\n-        else\r\n-          terminal_parse_failure("any character")\r\n-          r7 = nil\r\n-        end\r\n-        s1 << r7\r\n-      end\r\n-      if s1.last\r\n-        r1 = (SyntaxNode).new(input, i1...index, s1)\r\n-        r1.extend(CellValue0)\r\n-      else\r\n-        self.index = i1\r\n-        r1 = nil\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:cell_value][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_separator\r\n-    start_index = index\r\n-    if node_cache[:separator].has_key?(index)\r\n-      cached = node_cache[:separator][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'|\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 1))\r\n-      @index += 1\r\n-    else\r\n-      terminal_parse_failure(\'|\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:separator][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_blanks\r\n-    start_index = index\r\n-    if node_cache[:blanks].has_key?(index)\r\n-      cached = node_cache[:blanks][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1 = index\r\n-      r2 = _nt_newline\r\n-      if r2\r\n-        r1 = r2\r\n-      else\r\n-        r3 = _nt_whitespace\r\n-        if r3\r\n-          r1 = r3\r\n-        else\r\n-          self.index = i1\r\n-          r1 = nil\r\n-        end\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:blanks][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_newline\r\n-    start_index = index\r\n-    if node_cache[:newline].has_key?(index)\r\n-      cached = node_cache[:newline][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    if input.index("\\r\\n?", index) == index\r\n-      r1 = (SyntaxNode).new(input, index...(index + 3))\r\n-      @index += 3\r\n-    else\r\n-      terminal_parse_failure("\\r\\n?")\r\n-      r1 = nil\r\n-    end\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      if input.index("\\n", index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure("\\n")\r\n-        r2 = nil\r\n-      end\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        self.index = i0\r\n-        r0 = nil\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:newline][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_whitespace\r\n-    start_index = index\r\n-    if node_cache[:whitespace].has_key?(index)\r\n-      cached = node_cache[:whitespace][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(Regexp.new(\'[ \\\\t]\'), index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 1))\r\n-      @index += 1\r\n-    else\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:whitespace][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-end\r\n-\r\n-class FeatureParser < Treetop::Runtime::CompiledParser\r\n-  include Feature\r\n-end\r\n-\r\n-\r\n-end\r\n+module Cucumber\n+module TreetopParser\n+\n+module Feature\n+  include Treetop::Runtime\n+\n+  def root\n+    @root || :root\n+  end\n+\n+  module Root0\n+    def header\n+      elements[0]\n+    end\n+\n+    def scenarios\n+      elements[2]\n+    end\n+  end\n+\n+  module Root1\n+    \n+    def feature\n+      f = Tree::Feature.new(header.text_value.strip)\n+      scenarios.populate(f)\n+      f\n+    end\n+  end\n+\n+  def _nt_root\n+    start_index = index\n+    if node_cache[:root].has_key?(index)\n+      cached = node_cache[:root][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_header\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        r3 = _nt_whitespace\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      r2 = SyntaxNode.new(input, i2...index, s2)\n+      s0 << r2\n+      if r2\n+        r4 = _nt_scenarios\n+        s0 << r4\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Root0)\n+      r0.extend(Root1)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:root][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Header0\n+  end\n+\n+  def _nt_header\n+    start_index = index\n+    if node_cache[:header].has_key?(index)\n+      cached = node_cache[:header][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1, s1 = index, []\n+      i2 = index\n+      r3 = _nt_step_scenario\n+      if r3\n+        r2 = nil\n+      else\n+        self.index = i2\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s1 << r2\n+      if r2\n+        if index < input_length\n+          r4 = (SyntaxNode).new(input, index...(index + 1))\n+          @index += 1\n+        else\n+          terminal_parse_failure("any character")\n+          r4 = nil\n+        end\n+        s1 << r4\n+      end\n+      if s1.last\n+        r1 = (SyntaxNode).new(input, i1...index, s1)\n+        r1.extend(Header0)\n+      else\n+        self.index = i1\n+        r1 = nil\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:header][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Scenarios0\n+    def step_scenario\n+      elements[0]\n+    end\n+\n+    def more\n+      elements[1]\n+    end\n+  end\n+\n+  module Scenarios1\n+    def populate(feature)\n+      step_scenario.populate(feature)\n+      more.elements.each { |m| m.populate(feature) }\n+    end\n+  end\n+\n+  def _nt_scenarios\n+    start_index = index\n+    if node_cache[:scenarios].has_key?(index)\n+      cached = node_cache[:scenarios][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_step_scenario\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        i3 = index\n+        r4 = _nt_table\n+        if r4\n+          r3 = r4\n+        else\n+          r5 = _nt_step_scenario\n+          if r5\n+            r3 = r5\n+          else\n+            self.index = i3\n+            r3 = nil\n+          end\n+        end\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      r2 = SyntaxNode.new(input, i2...index, s2)\n+      s0 << r2\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Scenarios0)\n+      r0.extend(Scenarios1)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:scenarios][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module StepScenario0\n+  end\n+\n+  module StepScenario1\n+    def scenario_keyword\n+      elements[0]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+\n+    def steps\n+      elements[6]\n+    end\n+  end\n+\n+  module StepScenario2\n+    def populate(feature)\n+      sc = feature.add_scenario(name.text_value.strip)\n+      steps.elements.each{|s| s.populate(sc)}\n+      Feature.last_scenario = sc\n+    end\n+  end\n+\n+  def _nt_step_scenario\n+    start_index = index\n+    if node_cache[:step_scenario].has_key?(index)\n+      cached = node_cache[:step_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_scenario_keyword\n+    s0 << r1\n+    if r1\n+      if input.index(":", index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure(":")\n+        r2 = nil\n+      end\n+      s0 << r2\n+      if r2\n+        s3, i3 = [], index\n+        loop do\n+          r4 = _nt_whitespace\n+          if r4\n+            s3 << r4\n+          else\n+            break\n+          end\n+        end\n+        if s3.empty?\n+          self.index = i3\n+          r3 = nil\n+        else\n+          r3 = SyntaxNode.new(input, i3...index, s3)\n+        end\n+        s0 << r3\n+        if r3\n+          s5, i5 = [], index\n+          loop do\n+            i6, s6 = index, []\n+            i7 = index\n+            r8 = _nt_newline\n+            if r8\n+              r7 = nil\n+            else\n+              self.index = i7\n+              r7 = SyntaxNode.new(input, index...index)\n+            end\n+            s6 << r7\n+            if r7\n+              if index < input_length\n+                r9 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r9 = nil\n+              end\n+              s6 << r9\n+            end\n+            if s6.last\n+              r6 = (SyntaxNode).new(input, i6...index, s6)\n+              r6.extend(StepScenario0)\n+            else\n+              self.index = i6\n+              r6 = nil\n+            end\n+            if r6\n+              s5 << r6\n+            else\n+              break\n+            end\n+          end\n+          if s5.empty?\n+            self.index = i5\n+            r5 = nil\n+          else\n+            r5 = SyntaxNode.new(input, i5...index, s5)\n+          end\n+          s0 << r5\n+          if r5\n+            s10, i10 = [], index\n+            loop do\n+              r11 = _nt_newline\n+              if r11\n+                s10 << r11\n+              else\n+                break\n+              end\n+            end\n+            r10 = SyntaxNode.new(input, i10...index, s10)\n+            s0 << r10\n+            if r10\n+              r12 = _nt_blanks\n+              s0 << r12\n+              if r12\n+                s13, i13 = [], index\n+                loop do\n+                  r14 = _nt_step_or_given_scenario\n+                  if r14\n+                    s13 << r14\n+                  else\n+                    break\n+                  end\n+                end\n+                if s13.empty?\n+                  self.index = i13\n+                  r13 = nil\n+                else\n+                  r13 = SyntaxNode.new(input, i13...index, s13)\n+                end\n+                s0 << r13\n+              end\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(StepScenario1)\n+      r0.extend(StepScenario2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:step_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_step_or_given_scenario\n+    start_index = index\n+    if node_cache[:step_or_given_scenario].has_key?(index)\n+      cached = node_cache[:step_or_given_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    r1 = _nt_step\n+    if r1\n+      r0 = r1\n+    else\n+      r2 = _nt_given_scenario\n+      if r2\n+        r0 = r2\n+      else\n+        self.index = i0\n+        r0 = nil\n+      end\n+    end\n+\n+    node_cache[:step_or_given_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Step0\n+  end\n+\n+  module Step1\n+    def step_keyword\n+      elements[1]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+  end\n+\n+  module Step2\n+    def populate(scenario)\n+      line = input.line_of(interval.first)\n+      scenario.add_step(step_keyword.text_value, name.text_value.strip, line)\n+    end\n+  end\n+\n+  def _nt_step\n+    start_index = index\n+    if node_cache[:step].has_key?(index)\n+      cached = node_cache[:step][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    s1, i1 = [], index\n+    loop do\n+      r2 = _nt_whitespace\n+      if r2\n+        s1 << r2\n+      else\n+        break\n+      end\n+    end\n+    r1 = SyntaxNode.new(input, i1...index, s1)\n+    s0 << r1\n+    if r1\n+      r3 = _nt_step_keyword\n+      s0 << r3\n+      if r3\n+        s4, i4 = [], index\n+        loop do\n+          r5 = _nt_whitespace\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+        if r4\n+          s6, i6 = [], index\n+          loop do\n+            i7, s7 = index, []\n+            i8 = index\n+            r9 = _nt_newline\n+            if r9\n+              r8 = nil\n+            else\n+              self.index = i8\n+              r8 = SyntaxNode.new(input, index...index)\n+            end\n+            s7 << r8\n+            if r8\n+              if index < input_length\n+                r10 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r10 = nil\n+              end\n+              s7 << r10\n+            end\n+            if s7.last\n+              r7 = (SyntaxNode).new(input, i7...index, s7)\n+              r7.extend(Step0)\n+            else\n+              self.index = i7\n+              r7 = nil\n+            end\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          if s6.empty?\n+            self.index = i6\n+            r6 = nil\n+          else\n+            r6 = SyntaxNode.new(input, i6...index, s6)\n+          end\n+          s0 << r6\n+          if r6\n+            s11, i11 = [], index\n+            loop do\n+              r12 = _nt_newline\n+              if r12\n+                s11 << r12\n+              else\n+                break\n+              end\n+            end\n+            r11 = SyntaxNode.new(input, i11...index, s11)\n+            s0 << r11\n+            if r11\n+              r13 = _nt_blanks\n+              s0 << r13\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Step1)\n+      r0.extend(Step2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:step][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module GivenScenario0\n+  end\n+\n+  module GivenScenario1\n+    def given_scenario_keyword\n+      elements[0]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+  end\n+\n+  module GivenScenario2\n+    def populate(scenario)\n+      line = input.line_of(interval.first)\n+      scenario.add_given_scenario(name.text_value.strip, line)\n+    end\n+  end\n+\n+  def _nt_given_scenario\n+    start_index = index\n+    if node_cache[:given_scenario].has_key?(index)\n+      cached = node_cache[:given_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_given_scenario_keyword\n+    s0 << r1\n+    if r1\n+      if input.index(":", index) == index\n+        r3 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure(":")\n+        r3 = nil\n+      end\n+      if r3\n+        r2 = r3\n+      else\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s0 << r2\n+      if r2\n+        s4, i4 = [], index\n+        loop do\n+          r5 = _nt_whitespace\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+        if r4\n+          s6, i6 = [], index\n+          loop do\n+            i7, s7 = index, []\n+            i8 = index\n+            r9 = _nt_newline\n+            if r9\n+              r8 = nil\n+            else\n+              self.index = i8\n+              r8 = SyntaxNode.new(input, index...index)\n+            end\n+            s7 << r8\n+            if r8\n+              if index < input_length\n+                r10 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r10 = nil\n+              end\n+              s7 << r10\n+            end\n+            if s7.last\n+              r7 = (SyntaxNode).new(input, i7...index, s7)\n+              r7.extend(GivenScenario0)\n+            else\n+              self.index = i7\n+              r7 = nil\n+            end\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          if s6.empty?\n+            self.index = i6\n+            r6 = nil\n+          else\n+            r6 = SyntaxNode.new(input, i6...index, s6)\n+          end\n+          s0 << r6\n+          if r6\n+            s11, i11 = [], index\n+            loop do\n+              r12 = _nt_newline\n+              if r12\n+                s11 << r12\n+              else\n+                break\n+              end\n+            end\n+            r11 = SyntaxNode.new(input, i11...index, s11)\n+            s0 << r11\n+            if r11\n+              r13 = _nt_blanks\n+              s0 << r13\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(GivenScenario1)\n+      r0.extend(GivenScenario2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:given_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_step_keyword\n+    start_index = index\n+    if node_cache[:step_keyword].has_key?(index)\n+      cached = node_cache[:step_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    if input.index(\'Gitt\', index) == index\n+      r1 = (SyntaxNode).new(input, index...(index + 4))\n+      @index += 4\n+    else\n+      terminal_parse_failure(\'Gitt\')\n+      r1 = nil\n+    end\n+    if r1\n+      r0 = r1\n+    else\n+      if input.index(\'Når\', index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 4))\n+        @index += 4\n+      else\n+        terminal_parse_failure(\'Når\')\n+        r2 = nil\n+      end\n+      if r2\n+        r0 = r2\n+      else\n+        if input.index(\'Så\', index) == index\n+          r3 = (SyntaxNode).new(input, index...(index + 3))\n+          @index += 3\n+        else\n+          terminal_parse_failure(\'Så\')\n+          r3 = nil\n+        end\n+        if r3\n+          r0 = r3\n+        else\n+          if input.index(\'Og\', index) == index\n+            r4 = (SyntaxNode).new(input, index...(index + 2))\n+            @index += 2\n+          else\n+            terminal_parse_failure(\'Og\')\n+            r4 = nil\n+          end\n+          if r4\n+            r0 = r4\n+          else\n+            self.index = i0\n+            r0 = nil\n+          end\n+        end\n+      end\n+    end\n+\n+    node_cache[:step_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_scenario_keyword\n+    start_index = index\n+    if node_cache[:scenario_keyword].has_key?(index)\n+      cached = node_cache[:scenario_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'Scenario\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 8))\n+      @index += 8\n+    else\n+      terminal_parse_failure(\'Scenario\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:scenario_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_given_scenario_keyword\n+    start_index = index\n+    if node_cache[:given_scenario_keyword].has_key?(index)\n+      cached = node_cache[:given_scenario_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'GittScenario\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 12))\n+      @index += 12\n+    else\n+      terminal_parse_failure(\'GittScenario\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:given_scenario_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Table0\n+    def newline\n+      elements[0]\n+    end\n+\n+    def table_line\n+      elements[1]\n+    end\n+  end\n+\n+  module Table1\n+    def table_line\n+      elements[0]\n+    end\n+\n+    def more\n+      elements[1]\n+    end\n+\n+  end\n+\n+  module Table2\n+    def populate(feature)\n+      Feature.last_scenario.table_header = table_line.values\n+      more.elements.each do |e|\n+        feature.add_row_scenario(Feature.last_scenario, e.table_line.values, e.table_line.line)\n+      end\n+    end\n+  end\n+\n+  def _nt_table\n+    start_index = index\n+    if node_cache[:table].has_key?(index)\n+      cached = node_cache[:table][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_table_line\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        i3, s3 = index, []\n+        r4 = _nt_newline\n+        s3 << r4\n+        if r4\n+          r5 = _nt_table_line\n+          s3 << r5\n+        end\n+        if s3.last\n+          r3 = (SyntaxNode).new(input, i3...index, s3)\n+          r3.extend(Table0)\n+        else\n+          self.index = i3\n+          r3 = nil\n+        end\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      if s2.empty?\n+        self.index = i2\n+        r2 = nil\n+      else\n+        r2 = SyntaxNode.new(input, i2...index, s2)\n+      end\n+      s0 << r2\n+      if r2\n+        s6, i6 = [], index\n+        loop do\n+          r7 = _nt_newline\n+          if r7\n+            s6 << r7\n+          else\n+            break\n+          end\n+        end\n+        r6 = SyntaxNode.new(input, i6...index, s6)\n+        s0 << r6\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Table1)\n+      r0.extend(Table2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:table][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module TableLine0\n+    def cell_value\n+      elements[1]\n+    end\n+\n+    def separator\n+      elements[3]\n+    end\n+  end\n+\n+  module TableLine1\n+    def separator\n+      elements[1]\n+    end\n+\n+    def cells\n+      elements[2]\n+    end\n+  end\n+\n+  module TableLine2\n+    def values\n+      cells.elements.map { |cell| cell.cell_value.text_value.strip }\n+    end\n+    \n+    def line\n+      input.line_of(interval.first)\n+    end\n+  end\n+\n+  def _nt_table_line\n+    start_index = index\n+    if node_cache[:table_line].has_key?(index)\n+      cached = node_cache[:table_line][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    s1, i1 = [], index\n+    loop do\n+      r2 = _nt_whitespace\n+      if r2\n+        s1 << r2\n+      else\n+        break\n+      end\n+    end\n+    r1 = SyntaxNode.new(input, i1...index, s1)\n+    s0 << r1\n+    if r1\n+      r3 = _nt_separator\n+      s0 << r3\n+      if r3\n+        s4, i4 = [], index\n+        loop do\n+          i5, s5 = index, []\n+          s6, i6 = [], index\n+          loop do\n+            r7 = _nt_whitespace\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          r6 = SyntaxNode.new(input, i6...index, s6)\n+          s5 << r6\n+          if r6\n+            r8 = _nt_cell_value\n+            s5 << r8\n+            if r8\n+              s9, i9 = [], index\n+              loop do\n+                r10 = _nt_whitespace\n+                if r10\n+                  s9 << r10\n+                else\n+                  break\n+                end\n+              end\n+              r9 = SyntaxNode.new(input, i9...index, s9)\n+              s5 << r9\n+              if r9\n+                r11 = _nt_separator\n+                s5 << r11\n+              end\n+            end\n+          end\n+          if s5.last\n+            r5 = (SyntaxNode).new(input, i5...index, s5)\n+            r5.extend(TableLine0)\n+          else\n+            self.index = i5\n+            r5 = nil\n+          end\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(TableLine1)\n+      r0.extend(TableLine2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:table_line][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module CellValue0\n+  end\n+\n+  def _nt_cell_value\n+    start_index = index\n+    if node_cache[:cell_value].has_key?(index)\n+      cached = node_cache[:cell_value][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1, s1 = index, []\n+      i2 = index\n+      i3 = index\n+      r4 = _nt_separator\n+      if r4\n+        r3 = r4\n+      else\n+        r5 = _nt_newline\n+        if r5\n+          r3 = r5\n+        else\n+          self.index = i3\n+          r3 = nil\n+        end\n+      end\n+      if r3\n+        r2 = nil\n+      else\n+        self.index = i2\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s1 << r2\n+      if r2\n+        if index < input_length\n+          r6 = (SyntaxNode).new(input, index...(index + 1))\n+          @index += 1\n+        else\n+          terminal_parse_failure("any character")\n+          r6 = nil\n+        end\n+        s1 << r6\n+      end\n+      if s1.last\n+        r1 = (SyntaxNode).new(input, i1...index, s1)\n+        r1.extend(CellValue0)\n+      else\n+        self.index = i1\n+        r1 = nil\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:cell_value][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_separator\n+    start_index = index\n+    if node_cache[:separator].has_key?(index)\n+      cached = node_cache[:separator][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'|\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 1))\n+      @index += 1\n+    else\n+      terminal_parse_failure(\'|\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:separator][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_blanks\n+    start_index = index\n+    if node_cache[:blanks].has_key?(index)\n+      cached = node_cache[:blanks][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1 = index\n+      r2 = _nt_newline\n+      if r2\n+        r1 = r2\n+      else\n+        r3 = _nt_whitespace\n+        if r3\n+          r1 = r3\n+        else\n+          self.index = i1\n+          r1 = nil\n+        end\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:blanks][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_newline\n+    start_index = index\n+    if node_cache[:newline].has_key?(index)\n+      cached = node_cache[:newline][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    if input.index("\\r\\n?", index) == index\n+      r1 = (SyntaxNode).new(input, index...(index + 3))\n+      @index += 3\n+    else\n+      terminal_parse_failure("\\r\\n?")\n+      r1 = nil\n+    end\n+    if r1\n+      r0 = r1\n+    else\n+      if input.index("\\n", index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure("\\n")\n+        r2 = nil\n+      end\n+      if r2\n+        r0 = r2\n+      else\n+        self.index = i0\n+        r0 = nil\n+      end\n+    end\n+\n+    node_cache[:newline][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_whitespace\n+    start_index = index\n+    if node_cache[:whitespace].has_key?(index)\n+      cached = node_cache[:whitespace][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(Regexp.new(\'[ \\\\t]\'), index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 1))\n+      @index += 1\n+    else\n+      r0 = nil\n+    end\n+\n+    node_cache[:whitespace][start_index] = r0\n+\n+    return r0\n+  end\n+\n+end\n+\n+class FeatureParser < Treetop::Runtime::CompiledParser\n+  include Feature\n+end\n+\n+\n+end\n end\n\\ No newline at end of file\ndiff --git a/lib/cucumber/treetop_parser/feature_pt.rb b/lib/cucumber/treetop_parser/feature_pt.rb\nindex 3d6a14b4..a7fa466f 100644\n--- a/lib/cucumber/treetop_parser/feature_pt.rb\n+++ b/lib/cucumber/treetop_parser/feature_pt.rb\n@@ -1,1185 +1,1180 @@\n-module Cucumber\r\n-module TreetopParser\r\n-\r\n-module Feature\r\n-  include Treetop::Runtime\r\n-\r\n-  def root\r\n-    @root || :root\r\n-  end\r\n-\r\n-  module Root0\r\n-    def header\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def scenarios\r\n-      elements[2]\r\n-    end\r\n-  end\r\n-\r\n-  module Root1\r\n-    \r\n-    def feature\r\n-      f = Tree::Feature.new(header.text_value.strip)\r\n-      scenarios.populate(f)\r\n-      f\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_root\r\n-    start_index = index\r\n-    if node_cache[:root].has_key?(index)\r\n-      cached = node_cache[:root][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_header\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        r3 = _nt_whitespace\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      s0 << r2\r\n-      if r2\r\n-        r4 = _nt_scenarios\r\n-        s0 << r4\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Root0)\r\n-      r0.extend(Root1)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:root][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Header0\r\n-  end\r\n-\r\n-  def _nt_header\r\n-    start_index = index\r\n-    if node_cache[:header].has_key?(index)\r\n-      cached = node_cache[:header][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1, s1 = index, []\r\n-      i2 = index\r\n-      r3 = _nt_step_scenario\r\n-      if r3\r\n-        r2 = nil\r\n-      else\r\n-        self.index = i2\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s1 << r2\r\n-      if r2\r\n-        if index < input_length\r\n-          r4 = (SyntaxNode).new(input, index...(index + 1))\r\n-          @index += 1\r\n-        else\r\n-          terminal_parse_failure("any character")\r\n-          r4 = nil\r\n-        end\r\n-        s1 << r4\r\n-      end\r\n-      if s1.last\r\n-        r1 = (SyntaxNode).new(input, i1...index, s1)\r\n-        r1.extend(Header0)\r\n-      else\r\n-        self.index = i1\r\n-        r1 = nil\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:header][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Scenarios0\r\n-    def step_scenario\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def more\r\n-      elements[1]\r\n-    end\r\n-  end\r\n-\r\n-  module Scenarios1\r\n-    def populate(feature)\r\n-      step_scenario.populate(feature)\r\n-      more.elements.each { |m| m.populate(feature) }\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_scenarios\r\n-    start_index = index\r\n-    if node_cache[:scenarios].has_key?(index)\r\n-      cached = node_cache[:scenarios][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_step_scenario\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        i3 = index\r\n-        r4 = _nt_table\r\n-        if r4\r\n-          r3 = r4\r\n-        else\r\n-          r5 = _nt_step_scenario\r\n-          if r5\r\n-            r3 = r5\r\n-          else\r\n-            self.index = i3\r\n-            r3 = nil\r\n-          end\r\n-        end\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      s0 << r2\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Scenarios0)\r\n-      r0.extend(Scenarios1)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:scenarios][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module StepScenario0\r\n-  end\r\n-\r\n-  module StepScenario1\r\n-    def scenario_keyword\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-\r\n-    def steps\r\n-      elements[6]\r\n-    end\r\n-  end\r\n-\r\n-  module StepScenario2\r\n-    def populate(feature)\r\n-      sc = feature.add_scenario(name.text_value.strip)\r\n-      steps.elements.each{|s| s.populate(sc)}\r\n-      Feature.last_scenario = sc\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_step_scenario\r\n-    start_index = index\r\n-    if node_cache[:step_scenario].has_key?(index)\r\n-      cached = node_cache[:step_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_scenario_keyword\r\n-    s0 << r1\r\n-    if r1\r\n-      if input.index(":", index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure(":")\r\n-        r2 = nil\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s3, i3 = [], index\r\n-        loop do\r\n-          r4 = _nt_whitespace\r\n-          if r4\r\n-            s3 << r4\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s3.empty?\r\n-          self.index = i3\r\n-          r3 = nil\r\n-        else\r\n-          r3 = SyntaxNode.new(input, i3...index, s3)\r\n-        end\r\n-        s0 << r3\r\n-        if r3\r\n-          s5, i5 = [], index\r\n-          loop do\r\n-            i6, s6 = index, []\r\n-            i7 = index\r\n-            r8 = _nt_newline\r\n-            if r8\r\n-              r7 = nil\r\n-            else\r\n-              self.index = i7\r\n-              r7 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s6 << r7\r\n-            if r7\r\n-              if index < input_length\r\n-                r9 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r9 = nil\r\n-              end\r\n-              s6 << r9\r\n-            end\r\n-            if s6.last\r\n-              r6 = (SyntaxNode).new(input, i6...index, s6)\r\n-              r6.extend(StepScenario0)\r\n-            else\r\n-              self.index = i6\r\n-              r6 = nil\r\n-            end\r\n-            if r6\r\n-              s5 << r6\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s5.empty?\r\n-            self.index = i5\r\n-            r5 = nil\r\n-          else\r\n-            r5 = SyntaxNode.new(input, i5...index, s5)\r\n-          end\r\n-          s0 << r5\r\n-          if r5\r\n-            s10, i10 = [], index\r\n-            loop do\r\n-              r11 = _nt_newline\r\n-              if r11\r\n-                s10 << r11\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r10 = SyntaxNode.new(input, i10...index, s10)\r\n-            s0 << r10\r\n-            if r10\r\n-              r12 = _nt_blanks\r\n-              s0 << r12\r\n-              if r12\r\n-                s13, i13 = [], index\r\n-                loop do\r\n-                  r14 = _nt_step_or_given_scenario\r\n-                  if r14\r\n-                    s13 << r14\r\n-                  else\r\n-                    break\r\n-                  end\r\n-                end\r\n-                if s13.empty?\r\n-                  self.index = i13\r\n-                  r13 = nil\r\n-                else\r\n-                  r13 = SyntaxNode.new(input, i13...index, s13)\r\n-                end\r\n-                s0 << r13\r\n-              end\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(StepScenario1)\r\n-      r0.extend(StepScenario2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:step_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_step_or_given_scenario\r\n-    start_index = index\r\n-    if node_cache[:step_or_given_scenario].has_key?(index)\r\n-      cached = node_cache[:step_or_given_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    r1 = _nt_step\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      r2 = _nt_given_scenario\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        self.index = i0\r\n-        r0 = nil\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:step_or_given_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Step0\r\n-  end\r\n-\r\n-  module Step1\r\n-    def step_keyword\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-  end\r\n-\r\n-  module Step2\r\n-    def populate(scenario)\r\n-      line = input.line_of(interval.first)\r\n-      scenario.add_step(step_keyword.text_value, name.text_value.strip, line)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_step\r\n-    start_index = index\r\n-    if node_cache[:step].has_key?(index)\r\n-      cached = node_cache[:step][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    s1, i1 = [], index\r\n-    loop do\r\n-      r2 = _nt_whitespace\r\n-      if r2\r\n-        s1 << r2\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r1 = SyntaxNode.new(input, i1...index, s1)\r\n-    s0 << r1\r\n-    if r1\r\n-      r3 = _nt_step_keyword\r\n-      s0 << r3\r\n-      if r3\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          r5 = _nt_whitespace\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-        if r4\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            i7, s7 = index, []\r\n-            i8 = index\r\n-            r9 = _nt_newline\r\n-            if r9\r\n-              r8 = nil\r\n-            else\r\n-              self.index = i8\r\n-              r8 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s7 << r8\r\n-            if r8\r\n-              if index < input_length\r\n-                r10 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r10 = nil\r\n-              end\r\n-              s7 << r10\r\n-            end\r\n-            if s7.last\r\n-              r7 = (SyntaxNode).new(input, i7...index, s7)\r\n-              r7.extend(Step0)\r\n-            else\r\n-              self.index = i7\r\n-              r7 = nil\r\n-            end\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s6.empty?\r\n-            self.index = i6\r\n-            r6 = nil\r\n-          else\r\n-            r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          end\r\n-          s0 << r6\r\n-          if r6\r\n-            s11, i11 = [], index\r\n-            loop do\r\n-              r12 = _nt_newline\r\n-              if r12\r\n-                s11 << r12\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r11 = SyntaxNode.new(input, i11...index, s11)\r\n-            s0 << r11\r\n-            if r11\r\n-              r13 = _nt_blanks\r\n-              s0 << r13\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Step1)\r\n-      r0.extend(Step2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:step][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module GivenScenario0\r\n-  end\r\n-\r\n-  module GivenScenario1\r\n-    def given_scenario_keyword\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def name\r\n-      elements[3]\r\n-    end\r\n-\r\n-    def blanks\r\n-      elements[5]\r\n-    end\r\n-  end\r\n-\r\n-  module GivenScenario2\r\n-    def populate(scenario)\r\n-      line = input.line_of(interval.first)\r\n-      scenario.add_given_scenario(name.text_value.strip, line)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_given_scenario\r\n-    start_index = index\r\n-    if node_cache[:given_scenario].has_key?(index)\r\n-      cached = node_cache[:given_scenario][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_given_scenario_keyword\r\n-    s0 << r1\r\n-    if r1\r\n-      if input.index(":", index) == index\r\n-        r3 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure(":")\r\n-        r3 = nil\r\n-      end\r\n-      if r3\r\n-        r2 = r3\r\n-      else\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          r5 = _nt_whitespace\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-        if r4\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            i7, s7 = index, []\r\n-            i8 = index\r\n-            r9 = _nt_newline\r\n-            if r9\r\n-              r8 = nil\r\n-            else\r\n-              self.index = i8\r\n-              r8 = SyntaxNode.new(input, index...index)\r\n-            end\r\n-            s7 << r8\r\n-            if r8\r\n-              if index < input_length\r\n-                r10 = (SyntaxNode).new(input, index...(index + 1))\r\n-                @index += 1\r\n-              else\r\n-                terminal_parse_failure("any character")\r\n-                r10 = nil\r\n-              end\r\n-              s7 << r10\r\n-            end\r\n-            if s7.last\r\n-              r7 = (SyntaxNode).new(input, i7...index, s7)\r\n-              r7.extend(GivenScenario0)\r\n-            else\r\n-              self.index = i7\r\n-              r7 = nil\r\n-            end\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          if s6.empty?\r\n-            self.index = i6\r\n-            r6 = nil\r\n-          else\r\n-            r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          end\r\n-          s0 << r6\r\n-          if r6\r\n-            s11, i11 = [], index\r\n-            loop do\r\n-              r12 = _nt_newline\r\n-              if r12\r\n-                s11 << r12\r\n-              else\r\n-                break\r\n-              end\r\n-            end\r\n-            r11 = SyntaxNode.new(input, i11...index, s11)\r\n-            s0 << r11\r\n-            if r11\r\n-              r13 = _nt_blanks\r\n-              s0 << r13\r\n-            end\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(GivenScenario1)\r\n-      r0.extend(GivenScenario2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:given_scenario][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_step_keyword\r\n-    start_index = index\r\n-    if node_cache[:step_keyword].has_key?(index)\r\n-      cached = node_cache[:step_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    if input.index(\'Dado\', index) == index\r\n-      r1 = (SyntaxNode).new(input, index...(index + 4))\r\n-      @index += 4\r\n-    else\r\n-      terminal_parse_failure(\'Dado\')\r\n-      r1 = nil\r\n-    end\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      if input.index(\'Cuando\', index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 6))\r\n-        @index += 6\r\n-      else\r\n-        terminal_parse_failure(\'Cuando\')\r\n-        r2 = nil\r\n-      end\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        if input.index(\'Entonces\', index) == index\r\n-          r3 = (SyntaxNode).new(input, index...(index + 8))\r\n-          @index += 8\r\n-        else\r\n-          terminal_parse_failure(\'Entonces\')\r\n-          r3 = nil\r\n-        end\r\n-        if r3\r\n-          r0 = r3\r\n-        else\r\n-          if input.index(\'Y\', index) == index\r\n-            r4 = (SyntaxNode).new(input, index...(index + 1))\r\n-            @index += 1\r\n-          else\r\n-            terminal_parse_failure(\'Y\')\r\n-            r4 = nil\r\n-          end\r\n-          if r4\r\n-            r0 = r4\r\n-          else\r\n-            self.index = i0\r\n-            r0 = nil\r\n-          end\r\n-        end\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:step_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_scenario_keyword\r\n-    start_index = index\r\n-    if node_cache[:scenario_keyword].has_key?(index)\r\n-      cached = node_cache[:scenario_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'Escenario\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 9))\r\n-      @index += 9\r\n-    else\r\n-      terminal_parse_failure(\'Escenario\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:scenario_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_given_scenario_keyword\r\n-    start_index = index\r\n-    if node_cache[:given_scenario_keyword].has_key?(index)\r\n-      cached = node_cache[:given_scenario_keyword][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'DadoElEscenario\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 15))\r\n-      @index += 15\r\n-    else\r\n-      terminal_parse_failure(\'DadoElEscenario\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:given_scenario_keyword][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module Table0\r\n-    def newline\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def table_line\r\n-      elements[1]\r\n-    end\r\n-  end\r\n-\r\n-  module Table1\r\n-    def table_line\r\n-      elements[0]\r\n-    end\r\n-\r\n-    def more\r\n-      elements[1]\r\n-    end\r\n-\r\n-  end\r\n-\r\n-  module Table2\r\n-    def populate(feature)\r\n-      Feature.last_scenario.table_header = table_line.values\r\n-      more.elements.each do |e|\r\n-        feature.add_row_scenario(Feature.last_scenario, e.table_line.values, e.table_line.line)\r\n-      end\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_table\r\n-    start_index = index\r\n-    if node_cache[:table].has_key?(index)\r\n-      cached = node_cache[:table][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    r1 = _nt_table_line\r\n-    s0 << r1\r\n-    if r1\r\n-      s2, i2 = [], index\r\n-      loop do\r\n-        i3, s3 = index, []\r\n-        r4 = _nt_newline\r\n-        s3 << r4\r\n-        if r4\r\n-          r5 = _nt_table_line\r\n-          s3 << r5\r\n-        end\r\n-        if s3.last\r\n-          r3 = (SyntaxNode).new(input, i3...index, s3)\r\n-          r3.extend(Table0)\r\n-        else\r\n-          self.index = i3\r\n-          r3 = nil\r\n-        end\r\n-        if r3\r\n-          s2 << r3\r\n-        else\r\n-          break\r\n-        end\r\n-      end\r\n-      if s2.empty?\r\n-        self.index = i2\r\n-        r2 = nil\r\n-      else\r\n-        r2 = SyntaxNode.new(input, i2...index, s2)\r\n-      end\r\n-      s0 << r2\r\n-      if r2\r\n-        s6, i6 = [], index\r\n-        loop do\r\n-          r7 = _nt_newline\r\n-          if r7\r\n-            s6 << r7\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        r6 = SyntaxNode.new(input, i6...index, s6)\r\n-        s0 << r6\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(Table1)\r\n-      r0.extend(Table2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:table][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module TableLine0\r\n-    def cell_value\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def separator\r\n-      elements[3]\r\n-    end\r\n-  end\r\n-\r\n-  module TableLine1\r\n-    def separator\r\n-      elements[1]\r\n-    end\r\n-\r\n-    def cells\r\n-      elements[2]\r\n-    end\r\n-  end\r\n-\r\n-  module TableLine2\r\n-    def values\r\n-      cells.elements.map { |cell| cell.cell_value.text_value }\r\n-    end\r\n-    \r\n-    def line\r\n-      input.line_of(interval.first)\r\n-    end\r\n-  end\r\n-\r\n-  def _nt_table_line\r\n-    start_index = index\r\n-    if node_cache[:table_line].has_key?(index)\r\n-      cached = node_cache[:table_line][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0, s0 = index, []\r\n-    s1, i1 = [], index\r\n-    loop do\r\n-      r2 = _nt_whitespace\r\n-      if r2\r\n-        s1 << r2\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r1 = SyntaxNode.new(input, i1...index, s1)\r\n-    s0 << r1\r\n-    if r1\r\n-      r3 = _nt_separator\r\n-      s0 << r3\r\n-      if r3\r\n-        s4, i4 = [], index\r\n-        loop do\r\n-          i5, s5 = index, []\r\n-          s6, i6 = [], index\r\n-          loop do\r\n-            r7 = _nt_whitespace\r\n-            if r7\r\n-              s6 << r7\r\n-            else\r\n-              break\r\n-            end\r\n-          end\r\n-          r6 = SyntaxNode.new(input, i6...index, s6)\r\n-          s5 << r6\r\n-          if r6\r\n-            r8 = _nt_cell_value\r\n-            s5 << r8\r\n-            if r8\r\n-              s9, i9 = [], index\r\n-              loop do\r\n-                r10 = _nt_whitespace\r\n-                if r10\r\n-                  s9 << r10\r\n-                else\r\n-                  break\r\n-                end\r\n-              end\r\n-              r9 = SyntaxNode.new(input, i9...index, s9)\r\n-              s5 << r9\r\n-              if r9\r\n-                r11 = _nt_separator\r\n-                s5 << r11\r\n-              end\r\n-            end\r\n-          end\r\n-          if s5.last\r\n-            r5 = (SyntaxNode).new(input, i5...index, s5)\r\n-            r5.extend(TableLine0)\r\n-          else\r\n-            self.index = i5\r\n-            r5 = nil\r\n-          end\r\n-          if r5\r\n-            s4 << r5\r\n-          else\r\n-            break\r\n-          end\r\n-        end\r\n-        if s4.empty?\r\n-          self.index = i4\r\n-          r4 = nil\r\n-        else\r\n-          r4 = SyntaxNode.new(input, i4...index, s4)\r\n-        end\r\n-        s0 << r4\r\n-      end\r\n-    end\r\n-    if s0.last\r\n-      r0 = (SyntaxNode).new(input, i0...index, s0)\r\n-      r0.extend(TableLine1)\r\n-      r0.extend(TableLine2)\r\n-    else\r\n-      self.index = i0\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:table_line][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  module CellValue0\r\n-  end\r\n-\r\n-  def _nt_cell_value\r\n-    start_index = index\r\n-    if node_cache[:cell_value].has_key?(index)\r\n-      cached = node_cache[:cell_value][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1, s1 = index, []\r\n-      i2 = index\r\n-      i3 = index\r\n-      r4 = _nt_separator\r\n-      if r4\r\n-        r3 = r4\r\n-      else\r\n-        r5 = _nt_newline\r\n-        if r5\r\n-          r3 = r5\r\n-        else\r\n-          r6 = _nt_whitespace\r\n-          if r6\r\n-            r3 = r6\r\n-          else\r\n-            self.index = i3\r\n-            r3 = nil\r\n-          end\r\n-        end\r\n-      end\r\n-      if r3\r\n-        r2 = nil\r\n-      else\r\n-        self.index = i2\r\n-        r2 = SyntaxNode.new(input, index...index)\r\n-      end\r\n-      s1 << r2\r\n-      if r2\r\n-        if index < input_length\r\n-          r7 = (SyntaxNode).new(input, index...(index + 1))\r\n-          @index += 1\r\n-        else\r\n-          terminal_parse_failure("any character")\r\n-          r7 = nil\r\n-        end\r\n-        s1 << r7\r\n-      end\r\n-      if s1.last\r\n-        r1 = (SyntaxNode).new(input, i1...index, s1)\r\n-        r1.extend(CellValue0)\r\n-      else\r\n-        self.index = i1\r\n-        r1 = nil\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:cell_value][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_separator\r\n-    start_index = index\r\n-    if node_cache[:separator].has_key?(index)\r\n-      cached = node_cache[:separator][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(\'|\', index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 1))\r\n-      @index += 1\r\n-    else\r\n-      terminal_parse_failure(\'|\')\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:separator][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_blanks\r\n-    start_index = index\r\n-    if node_cache[:blanks].has_key?(index)\r\n-      cached = node_cache[:blanks][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    s0, i0 = [], index\r\n-    loop do\r\n-      i1 = index\r\n-      r2 = _nt_newline\r\n-      if r2\r\n-        r1 = r2\r\n-      else\r\n-        r3 = _nt_whitespace\r\n-        if r3\r\n-          r1 = r3\r\n-        else\r\n-          self.index = i1\r\n-          r1 = nil\r\n-        end\r\n-      end\r\n-      if r1\r\n-        s0 << r1\r\n-      else\r\n-        break\r\n-      end\r\n-    end\r\n-    r0 = SyntaxNode.new(input, i0...index, s0)\r\n-\r\n-    node_cache[:blanks][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_newline\r\n-    start_index = index\r\n-    if node_cache[:newline].has_key?(index)\r\n-      cached = node_cache[:newline][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    i0 = index\r\n-    if input.index("\\r\\n?", index) == index\r\n-      r1 = (SyntaxNode).new(input, index...(index + 3))\r\n-      @index += 3\r\n-    else\r\n-      terminal_parse_failure("\\r\\n?")\r\n-      r1 = nil\r\n-    end\r\n-    if r1\r\n-      r0 = r1\r\n-    else\r\n-      if input.index("\\n", index) == index\r\n-        r2 = (SyntaxNode).new(input, index...(index + 1))\r\n-        @index += 1\r\n-      else\r\n-        terminal_parse_failure("\\n")\r\n-        r2 = nil\r\n-      end\r\n-      if r2\r\n-        r0 = r2\r\n-      else\r\n-        self.index = i0\r\n-        r0 = nil\r\n-      end\r\n-    end\r\n-\r\n-    node_cache[:newline][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-  def _nt_whitespace\r\n-    start_index = index\r\n-    if node_cache[:whitespace].has_key?(index)\r\n-      cached = node_cache[:whitespace][index]\r\n-      @index = cached.interval.end if cached\r\n-      return cached\r\n-    end\r\n-\r\n-    if input.index(Regexp.new(\'[ \\\\t]\'), index) == index\r\n-      r0 = (SyntaxNode).new(input, index...(index + 1))\r\n-      @index += 1\r\n-    else\r\n-      r0 = nil\r\n-    end\r\n-\r\n-    node_cache[:whitespace][start_index] = r0\r\n-\r\n-    return r0\r\n-  end\r\n-\r\n-end\r\n-\r\n-class FeatureParser < Treetop::Runtime::CompiledParser\r\n-  include Feature\r\n-end\r\n-\r\n-\r\n-end\r\n+module Cucumber\n+module TreetopParser\n+\n+module Feature\n+  include Treetop::Runtime\n+\n+  def root\n+    @root || :root\n+  end\n+\n+  module Root0\n+    def header\n+      elements[0]\n+    end\n+\n+    def scenarios\n+      elements[2]\n+    end\n+  end\n+\n+  module Root1\n+    \n+    def feature\n+      f = Tree::Feature.new(header.text_value.strip)\n+      scenarios.populate(f)\n+      f\n+    end\n+  end\n+\n+  def _nt_root\n+    start_index = index\n+    if node_cache[:root].has_key?(index)\n+      cached = node_cache[:root][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_header\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        r3 = _nt_whitespace\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      r2 = SyntaxNode.new(input, i2...index, s2)\n+      s0 << r2\n+      if r2\n+        r4 = _nt_scenarios\n+        s0 << r4\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Root0)\n+      r0.extend(Root1)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:root][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Header0\n+  end\n+\n+  def _nt_header\n+    start_index = index\n+    if node_cache[:header].has_key?(index)\n+      cached = node_cache[:header][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1, s1 = index, []\n+      i2 = index\n+      r3 = _nt_step_scenario\n+      if r3\n+        r2 = nil\n+      else\n+        self.index = i2\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s1 << r2\n+      if r2\n+        if index < input_length\n+          r4 = (SyntaxNode).new(input, index...(index + 1))\n+          @index += 1\n+        else\n+          terminal_parse_failure("any character")\n+          r4 = nil\n+        end\n+        s1 << r4\n+      end\n+      if s1.last\n+        r1 = (SyntaxNode).new(input, i1...index, s1)\n+        r1.extend(Header0)\n+      else\n+        self.index = i1\n+        r1 = nil\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:header][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Scenarios0\n+    def step_scenario\n+      elements[0]\n+    end\n+\n+    def more\n+      elements[1]\n+    end\n+  end\n+\n+  module Scenarios1\n+    def populate(feature)\n+      step_scenario.populate(feature)\n+      more.elements.each { |m| m.populate(feature) }\n+    end\n+  end\n+\n+  def _nt_scenarios\n+    start_index = index\n+    if node_cache[:scenarios].has_key?(index)\n+      cached = node_cache[:scenarios][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_step_scenario\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        i3 = index\n+        r4 = _nt_table\n+        if r4\n+          r3 = r4\n+        else\n+          r5 = _nt_step_scenario\n+          if r5\n+            r3 = r5\n+          else\n+            self.index = i3\n+            r3 = nil\n+          end\n+        end\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      r2 = SyntaxNode.new(input, i2...index, s2)\n+      s0 << r2\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Scenarios0)\n+      r0.extend(Scenarios1)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:scenarios][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module StepScenario0\n+  end\n+\n+  module StepScenario1\n+    def scenario_keyword\n+      elements[0]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+\n+    def steps\n+      elements[6]\n+    end\n+  end\n+\n+  module StepScenario2\n+    def populate(feature)\n+      sc = feature.add_scenario(name.text_value.strip)\n+      steps.elements.each{|s| s.populate(sc)}\n+      Feature.last_scenario = sc\n+    end\n+  end\n+\n+  def _nt_step_scenario\n+    start_index = index\n+    if node_cache[:step_scenario].has_key?(index)\n+      cached = node_cache[:step_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_scenario_keyword\n+    s0 << r1\n+    if r1\n+      if input.index(":", index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure(":")\n+        r2 = nil\n+      end\n+      s0 << r2\n+      if r2\n+        s3, i3 = [], index\n+        loop do\n+          r4 = _nt_whitespace\n+          if r4\n+            s3 << r4\n+          else\n+            break\n+          end\n+        end\n+        if s3.empty?\n+          self.index = i3\n+          r3 = nil\n+        else\n+          r3 = SyntaxNode.new(input, i3...index, s3)\n+        end\n+        s0 << r3\n+        if r3\n+          s5, i5 = [], index\n+          loop do\n+            i6, s6 = index, []\n+            i7 = index\n+            r8 = _nt_newline\n+            if r8\n+              r7 = nil\n+            else\n+              self.index = i7\n+              r7 = SyntaxNode.new(input, index...index)\n+            end\n+            s6 << r7\n+            if r7\n+              if index < input_length\n+                r9 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r9 = nil\n+              end\n+              s6 << r9\n+            end\n+            if s6.last\n+              r6 = (SyntaxNode).new(input, i6...index, s6)\n+              r6.extend(StepScenario0)\n+            else\n+              self.index = i6\n+              r6 = nil\n+            end\n+            if r6\n+              s5 << r6\n+            else\n+              break\n+            end\n+          end\n+          if s5.empty?\n+            self.index = i5\n+            r5 = nil\n+          else\n+            r5 = SyntaxNode.new(input, i5...index, s5)\n+          end\n+          s0 << r5\n+          if r5\n+            s10, i10 = [], index\n+            loop do\n+              r11 = _nt_newline\n+              if r11\n+                s10 << r11\n+              else\n+                break\n+              end\n+            end\n+            r10 = SyntaxNode.new(input, i10...index, s10)\n+            s0 << r10\n+            if r10\n+              r12 = _nt_blanks\n+              s0 << r12\n+              if r12\n+                s13, i13 = [], index\n+                loop do\n+                  r14 = _nt_step_or_given_scenario\n+                  if r14\n+                    s13 << r14\n+                  else\n+                    break\n+                  end\n+                end\n+                if s13.empty?\n+                  self.index = i13\n+                  r13 = nil\n+                else\n+                  r13 = SyntaxNode.new(input, i13...index, s13)\n+                end\n+                s0 << r13\n+              end\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(StepScenario1)\n+      r0.extend(StepScenario2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:step_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_step_or_given_scenario\n+    start_index = index\n+    if node_cache[:step_or_given_scenario].has_key?(index)\n+      cached = node_cache[:step_or_given_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    r1 = _nt_step\n+    if r1\n+      r0 = r1\n+    else\n+      r2 = _nt_given_scenario\n+      if r2\n+        r0 = r2\n+      else\n+        self.index = i0\n+        r0 = nil\n+      end\n+    end\n+\n+    node_cache[:step_or_given_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Step0\n+  end\n+\n+  module Step1\n+    def step_keyword\n+      elements[1]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+  end\n+\n+  module Step2\n+    def populate(scenario)\n+      line = input.line_of(interval.first)\n+      scenario.add_step(step_keyword.text_value, name.text_value.strip, line)\n+    end\n+  end\n+\n+  def _nt_step\n+    start_index = index\n+    if node_cache[:step].has_key?(index)\n+      cached = node_cache[:step][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    s1, i1 = [], index\n+    loop do\n+      r2 = _nt_whitespace\n+      if r2\n+        s1 << r2\n+      else\n+        break\n+      end\n+    end\n+    r1 = SyntaxNode.new(input, i1...index, s1)\n+    s0 << r1\n+    if r1\n+      r3 = _nt_step_keyword\n+      s0 << r3\n+      if r3\n+        s4, i4 = [], index\n+        loop do\n+          r5 = _nt_whitespace\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+        if r4\n+          s6, i6 = [], index\n+          loop do\n+            i7, s7 = index, []\n+            i8 = index\n+            r9 = _nt_newline\n+            if r9\n+              r8 = nil\n+            else\n+              self.index = i8\n+              r8 = SyntaxNode.new(input, index...index)\n+            end\n+            s7 << r8\n+            if r8\n+              if index < input_length\n+                r10 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r10 = nil\n+              end\n+              s7 << r10\n+            end\n+            if s7.last\n+              r7 = (SyntaxNode).new(input, i7...index, s7)\n+              r7.extend(Step0)\n+            else\n+              self.index = i7\n+              r7 = nil\n+            end\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          if s6.empty?\n+            self.index = i6\n+            r6 = nil\n+          else\n+            r6 = SyntaxNode.new(input, i6...index, s6)\n+          end\n+          s0 << r6\n+          if r6\n+            s11, i11 = [], index\n+            loop do\n+              r12 = _nt_newline\n+              if r12\n+                s11 << r12\n+              else\n+                break\n+              end\n+            end\n+            r11 = SyntaxNode.new(input, i11...index, s11)\n+            s0 << r11\n+            if r11\n+              r13 = _nt_blanks\n+              s0 << r13\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Step1)\n+      r0.extend(Step2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:step][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module GivenScenario0\n+  end\n+\n+  module GivenScenario1\n+    def given_scenario_keyword\n+      elements[0]\n+    end\n+\n+    def name\n+      elements[3]\n+    end\n+\n+    def blanks\n+      elements[5]\n+    end\n+  end\n+\n+  module GivenScenario2\n+    def populate(scenario)\n+      line = input.line_of(interval.first)\n+      scenario.add_given_scenario(name.text_value.strip, line)\n+    end\n+  end\n+\n+  def _nt_given_scenario\n+    start_index = index\n+    if node_cache[:given_scenario].has_key?(index)\n+      cached = node_cache[:given_scenario][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_given_scenario_keyword\n+    s0 << r1\n+    if r1\n+      if input.index(":", index) == index\n+        r3 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure(":")\n+        r3 = nil\n+      end\n+      if r3\n+        r2 = r3\n+      else\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s0 << r2\n+      if r2\n+        s4, i4 = [], index\n+        loop do\n+          r5 = _nt_whitespace\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+        if r4\n+          s6, i6 = [], index\n+          loop do\n+            i7, s7 = index, []\n+            i8 = index\n+            r9 = _nt_newline\n+            if r9\n+              r8 = nil\n+            else\n+              self.index = i8\n+              r8 = SyntaxNode.new(input, index...index)\n+            end\n+            s7 << r8\n+            if r8\n+              if index < input_length\n+                r10 = (SyntaxNode).new(input, index...(index + 1))\n+                @index += 1\n+              else\n+                terminal_parse_failure("any character")\n+                r10 = nil\n+              end\n+              s7 << r10\n+            end\n+            if s7.last\n+              r7 = (SyntaxNode).new(input, i7...index, s7)\n+              r7.extend(GivenScenario0)\n+            else\n+              self.index = i7\n+              r7 = nil\n+            end\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          if s6.empty?\n+            self.index = i6\n+            r6 = nil\n+          else\n+            r6 = SyntaxNode.new(input, i6...index, s6)\n+          end\n+          s0 << r6\n+          if r6\n+            s11, i11 = [], index\n+            loop do\n+              r12 = _nt_newline\n+              if r12\n+                s11 << r12\n+              else\n+                break\n+              end\n+            end\n+            r11 = SyntaxNode.new(input, i11...index, s11)\n+            s0 << r11\n+            if r11\n+              r13 = _nt_blanks\n+              s0 << r13\n+            end\n+          end\n+        end\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(GivenScenario1)\n+      r0.extend(GivenScenario2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:given_scenario][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_step_keyword\n+    start_index = index\n+    if node_cache[:step_keyword].has_key?(index)\n+      cached = node_cache[:step_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    if input.index(\'Dado\', index) == index\n+      r1 = (SyntaxNode).new(input, index...(index + 4))\n+      @index += 4\n+    else\n+      terminal_parse_failure(\'Dado\')\n+      r1 = nil\n+    end\n+    if r1\n+      r0 = r1\n+    else\n+      if input.index(\'Cuando\', index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 6))\n+        @index += 6\n+      else\n+        terminal_parse_failure(\'Cuando\')\n+        r2 = nil\n+      end\n+      if r2\n+        r0 = r2\n+      else\n+        if input.index(\'Entonces\', index) == index\n+          r3 = (SyntaxNode).new(input, index...(index + 8))\n+          @index += 8\n+        else\n+          terminal_parse_failure(\'Entonces\')\n+          r3 = nil\n+        end\n+        if r3\n+          r0 = r3\n+        else\n+          if input.index(\'Y\', index) == index\n+            r4 = (SyntaxNode).new(input, index...(index + 1))\n+            @index += 1\n+          else\n+            terminal_parse_failure(\'Y\')\n+            r4 = nil\n+          end\n+          if r4\n+            r0 = r4\n+          else\n+            self.index = i0\n+            r0 = nil\n+          end\n+        end\n+      end\n+    end\n+\n+    node_cache[:step_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_scenario_keyword\n+    start_index = index\n+    if node_cache[:scenario_keyword].has_key?(index)\n+      cached = node_cache[:scenario_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'Escenario\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 9))\n+      @index += 9\n+    else\n+      terminal_parse_failure(\'Escenario\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:scenario_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_given_scenario_keyword\n+    start_index = index\n+    if node_cache[:given_scenario_keyword].has_key?(index)\n+      cached = node_cache[:given_scenario_keyword][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'DadoElEscenario\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 15))\n+      @index += 15\n+    else\n+      terminal_parse_failure(\'DadoElEscenario\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:given_scenario_keyword][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module Table0\n+    def newline\n+      elements[0]\n+    end\n+\n+    def table_line\n+      elements[1]\n+    end\n+  end\n+\n+  module Table1\n+    def table_line\n+      elements[0]\n+    end\n+\n+    def more\n+      elements[1]\n+    end\n+\n+  end\n+\n+  module Table2\n+    def populate(feature)\n+      Feature.last_scenario.table_header = table_line.values\n+      more.elements.each do |e|\n+        feature.add_row_scenario(Feature.last_scenario, e.table_line.values, e.table_line.line)\n+      end\n+    end\n+  end\n+\n+  def _nt_table\n+    start_index = index\n+    if node_cache[:table].has_key?(index)\n+      cached = node_cache[:table][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    r1 = _nt_table_line\n+    s0 << r1\n+    if r1\n+      s2, i2 = [], index\n+      loop do\n+        i3, s3 = index, []\n+        r4 = _nt_newline\n+        s3 << r4\n+        if r4\n+          r5 = _nt_table_line\n+          s3 << r5\n+        end\n+        if s3.last\n+          r3 = (SyntaxNode).new(input, i3...index, s3)\n+          r3.extend(Table0)\n+        else\n+          self.index = i3\n+          r3 = nil\n+        end\n+        if r3\n+          s2 << r3\n+        else\n+          break\n+        end\n+      end\n+      if s2.empty?\n+        self.index = i2\n+        r2 = nil\n+      else\n+        r2 = SyntaxNode.new(input, i2...index, s2)\n+      end\n+      s0 << r2\n+      if r2\n+        s6, i6 = [], index\n+        loop do\n+          r7 = _nt_newline\n+          if r7\n+            s6 << r7\n+          else\n+            break\n+          end\n+        end\n+        r6 = SyntaxNode.new(input, i6...index, s6)\n+        s0 << r6\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(Table1)\n+      r0.extend(Table2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:table][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module TableLine0\n+    def cell_value\n+      elements[1]\n+    end\n+\n+    def separator\n+      elements[3]\n+    end\n+  end\n+\n+  module TableLine1\n+    def separator\n+      elements[1]\n+    end\n+\n+    def cells\n+      elements[2]\n+    end\n+  end\n+\n+  module TableLine2\n+    def values\n+      cells.elements.map { |cell| cell.cell_value.text_value.strip }\n+    end\n+    \n+    def line\n+      input.line_of(interval.first)\n+    end\n+  end\n+\n+  def _nt_table_line\n+    start_index = index\n+    if node_cache[:table_line].has_key?(index)\n+      cached = node_cache[:table_line][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0, s0 = index, []\n+    s1, i1 = [], index\n+    loop do\n+      r2 = _nt_whitespace\n+      if r2\n+        s1 << r2\n+      else\n+        break\n+      end\n+    end\n+    r1 = SyntaxNode.new(input, i1...index, s1)\n+    s0 << r1\n+    if r1\n+      r3 = _nt_separator\n+      s0 << r3\n+      if r3\n+        s4, i4 = [], index\n+        loop do\n+          i5, s5 = index, []\n+          s6, i6 = [], index\n+          loop do\n+            r7 = _nt_whitespace\n+            if r7\n+              s6 << r7\n+            else\n+              break\n+            end\n+          end\n+          r6 = SyntaxNode.new(input, i6...index, s6)\n+          s5 << r6\n+          if r6\n+            r8 = _nt_cell_value\n+            s5 << r8\n+            if r8\n+              s9, i9 = [], index\n+              loop do\n+                r10 = _nt_whitespace\n+                if r10\n+                  s9 << r10\n+                else\n+                  break\n+                end\n+              end\n+              r9 = SyntaxNode.new(input, i9...index, s9)\n+              s5 << r9\n+              if r9\n+                r11 = _nt_separator\n+                s5 << r11\n+              end\n+            end\n+          end\n+          if s5.last\n+            r5 = (SyntaxNode).new(input, i5...index, s5)\n+            r5.extend(TableLine0)\n+          else\n+            self.index = i5\n+            r5 = nil\n+          end\n+          if r5\n+            s4 << r5\n+          else\n+            break\n+          end\n+        end\n+        if s4.empty?\n+          self.index = i4\n+          r4 = nil\n+        else\n+          r4 = SyntaxNode.new(input, i4...index, s4)\n+        end\n+        s0 << r4\n+      end\n+    end\n+    if s0.last\n+      r0 = (SyntaxNode).new(input, i0...index, s0)\n+      r0.extend(TableLine1)\n+      r0.extend(TableLine2)\n+    else\n+      self.index = i0\n+      r0 = nil\n+    end\n+\n+    node_cache[:table_line][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  module CellValue0\n+  end\n+\n+  def _nt_cell_value\n+    start_index = index\n+    if node_cache[:cell_value].has_key?(index)\n+      cached = node_cache[:cell_value][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1, s1 = index, []\n+      i2 = index\n+      i3 = index\n+      r4 = _nt_separator\n+      if r4\n+        r3 = r4\n+      else\n+        r5 = _nt_newline\n+        if r5\n+          r3 = r5\n+        else\n+          self.index = i3\n+          r3 = nil\n+        end\n+      end\n+      if r3\n+        r2 = nil\n+      else\n+        self.index = i2\n+        r2 = SyntaxNode.new(input, index...index)\n+      end\n+      s1 << r2\n+      if r2\n+        if index < input_length\n+          r6 = (SyntaxNode).new(input, index...(index + 1))\n+          @index += 1\n+        else\n+          terminal_parse_failure("any character")\n+          r6 = nil\n+        end\n+        s1 << r6\n+      end\n+      if s1.last\n+        r1 = (SyntaxNode).new(input, i1...index, s1)\n+        r1.extend(CellValue0)\n+      else\n+        self.index = i1\n+        r1 = nil\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:cell_value][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_separator\n+    start_index = index\n+    if node_cache[:separator].has_key?(index)\n+      cached = node_cache[:separator][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(\'|\', index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 1))\n+      @index += 1\n+    else\n+      terminal_parse_failure(\'|\')\n+      r0 = nil\n+    end\n+\n+    node_cache[:separator][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_blanks\n+    start_index = index\n+    if node_cache[:blanks].has_key?(index)\n+      cached = node_cache[:blanks][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    s0, i0 = [], index\n+    loop do\n+      i1 = index\n+      r2 = _nt_newline\n+      if r2\n+        r1 = r2\n+      else\n+        r3 = _nt_whitespace\n+        if r3\n+          r1 = r3\n+        else\n+          self.index = i1\n+          r1 = nil\n+        end\n+      end\n+      if r1\n+        s0 << r1\n+      else\n+        break\n+      end\n+    end\n+    r0 = SyntaxNode.new(input, i0...index, s0)\n+\n+    node_cache[:blanks][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_newline\n+    start_index = index\n+    if node_cache[:newline].has_key?(index)\n+      cached = node_cache[:newline][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    i0 = index\n+    if input.index("\\r\\n?", index) == index\n+      r1 = (SyntaxNode).new(input, index...(index + 3))\n+      @index += 3\n+    else\n+      terminal_parse_failure("\\r\\n?")\n+      r1 = nil\n+    end\n+    if r1\n+      r0 = r1\n+    else\n+      if input.index("\\n", index) == index\n+        r2 = (SyntaxNode).new(input, index...(index + 1))\n+        @index += 1\n+      else\n+        terminal_parse_failure("\\n")\n+        r2 = nil\n+      end\n+      if r2\n+        r0 = r2\n+      else\n+        self.index = i0\n+        r0 = nil\n+      end\n+    end\n+\n+    node_cache[:newline][start_index] = r0\n+\n+    return r0\n+  end\n+\n+  def _nt_whitespace\n+    start_index = index\n+    if node_cache[:whitespace].has_key?(index)\n+      cached = node_cache[:whitespace][index]\n+      @index = cached.interval.end if cached\n+      return cached\n+    end\n+\n+    if input.index(Regexp.new(\'[ \\\\t]\'), index) == index\n+      r0 = (SyntaxNode).new(input, index...(index + 1))\n+      @index += 1\n+    else\n+      r0 = nil\n+    end\n+\n+    node_cache[:whitespace][start_index] = r0\n+\n+    return r0\n+  end\n+\n+end\n+\n+class FeatureParser < Treetop::Runtime::CompiledParser\n+  include Feature\n+end\n+\n+\n+end\n end\n\\ No newline at end of file\ndiff --git a/spec/cucumber/treetop_parser/feature_parser_spec.rb b/spec/cucumber/treetop_parser/feature_parser_spec.rb\nindex 91121038..8e03ecc1 100644\n--- a/spec/cucumber/treetop_parser/feature_parser_spec.rb\n+++ b/spec/cucumber/treetop_parser/feature_parser_spec.rb\n@@ -52,6 +52,14 @@ module Cucumber\n         second = f.scenarios[1]\n         second.should have(3).steps\n       end\n+      \n+      it "should allow spaces between FIT values" do\n+        p = FeatureParser.new\n+        Cucumber::Tree::RowScenario.should_receive(:new).with(anything,anything, [\'I can have spaces\'], anything)\n+        \n+        f = p.parse_feature(File.dirname(__FILE__) + \'/fit_scenario.feature\')\n+      end\n+      \n     end\n   end\n end\n\\ No newline at end of file\ndiff --git a/spec/cucumber/treetop_parser/fit_scenario.feature b/spec/cucumber/treetop_parser/fit_scenario.feature\nnew file mode 100644\nindex 00000000..ee4d6163\n--- /dev/null\n+++ b/spec/cucumber/treetop_parser/fit_scenario.feature\n@@ -0,0 +1,7 @@\n+Some title  \n+\n+  Scenario: second  \n+    Given \'bind me please\'\n+  \n+  |c|\n+  |I can have spaces|\n\\ No newline at end of file\n', 'commit_subject': "Merge branch 'master' of git://github.com/JoeSniff/cucumber", 'repo_name': 'cucumber/cucumber-ruby', 'committer': {'name': 'Aslak Hellesøy', 'email': '9ef4f83a0ea93e22b183f4bda513ab25aeda16aa@gmail.com', 'time_sec': '1220892909', 'tz_offset': '120', 'date': {'seconds': '1220892909'}}, 'commit_tree': 'd220becd3c5f6842aa479189e11151e5f69d90d6', 'commit_message': "Merge branch 'master' of git://github.com/JoeSniff/cucumber\n", 'language_name': 'JavaScript', 'license': 'mit', 'hunks': "@@ -0,0 +1,7 @@\n+Some title  \n+\n+  Scenario: second  \n+    Given 'bind me please'\n+  \n+  |c|\n+  |I can have spaces|\n\\ No newline at end of file\n", 'addition_count': 7, 'deletion_count': 0, 'src_file': '/dev/null', 'tgt_file': 'b/spec/cucumber/treetop_parser/fit_scenario.feature', 'file_extension': '.feature', 'before_file': 'ADDFILE', 'message': "Merge branch 'master' of git://github.com/JoeSniff/cucumber\n", 'author_name': 'Aslak Hellesøy', 'lang': 'feature'}