diff --git a/Gemfile b/Gemfile
index efbc0b0d..cb12421b 100644
--- a/Gemfile
+++ b/Gemfile
@@ -2,8 +2,8 @@
 source "https://rubygems.org"
 
 gem "concurrent-ruby", "~> 1.0.0"
-gem "flay", "~> 2.12"
-gem "sexp_processor", "~> 4.11"
+gem "flay", "~> 2.13.1"
+gem "sexp_processor", "~> 4.17"
 
 gem "codeclimate-parser-client",
   path: "/home/app/codeclimate-parser-client"
diff --git a/Gemfile.lock b/Gemfile.lock
index a488df8b..a47d6b75 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -8,41 +8,39 @@ PATH
 GEM
   remote: https://rubygems.org/
   specs:
-    ast (2.3.0)
-    coderay (1.1.0)
-    concurrent-ruby (1.0.0)
-    diff-lcs (1.2.5)
-    erubis (2.7.0)
+    ast (2.4.2)
+    coderay (1.1.3)
+    concurrent-ruby (1.0.5)
+    diff-lcs (1.5.0)
+    erubi (1.12.0)
     excon (0.99.0)
-    flay (2.12.0)
-      erubis (~> 2.7.0)
+    flay (2.13.1)
+      erubi (~> 1.10)
       path_expander (~> 1.0)
       ruby_parser (~> 3.0)
       sexp_processor (~> 4.0)
-    method_source (0.8.2)
-    path_expander (1.0.3)
-    pry (0.10.3)
-      coderay (~> 1.1.0)
-      method_source (~> 0.8.1)
-      slop (~> 3.4)
-    rake (10.4.2)
-    rspec (3.3.0)
-      rspec-core (~> 3.3.0)
-      rspec-expectations (~> 3.3.0)
-      rspec-mocks (~> 3.3.0)
-    rspec-core (3.3.2)
-      rspec-support (~> 3.3.0)
-    rspec-expectations (3.3.1)
+    method_source (1.0.0)
+    path_expander (1.1.1)
+    pry (0.14.2)
+      coderay (~> 1.1)
+      method_source (~> 1.0)
+    rake (13.1.0)
+    rspec (3.12.0)
+      rspec-core (~> 3.12.0)
+      rspec-expectations (~> 3.12.0)
+      rspec-mocks (~> 3.12.0)
+    rspec-core (3.12.2)
+      rspec-support (~> 3.12.0)
+    rspec-expectations (3.12.3)
       diff-lcs (>= 1.2.0, < 2.0)
-      rspec-support (~> 3.3.0)
-    rspec-mocks (3.3.2)
+      rspec-support (~> 3.12.0)
+    rspec-mocks (3.12.6)
       diff-lcs (>= 1.2.0, < 2.0)
-      rspec-support (~> 3.3.0)
-    rspec-support (3.3.0)
-    ruby_parser (3.11.0)
-      sexp_processor (~> 4.9)
-    sexp_processor (4.11.0)
-    slop (3.6.0)
+      rspec-support (~> 3.12.0)
+    rspec-support (3.12.1)
+    ruby_parser (3.20.3)
+      sexp_processor (~> 4.16)
+    sexp_processor (4.17.0)
 
 PLATFORMS
   ruby
@@ -50,11 +48,11 @@ PLATFORMS
 DEPENDENCIES
   codeclimate-parser-client!
   concurrent-ruby (~> 1.0.0)
-  flay (~> 2.12)
+  flay (~> 2.13.1)
   pry
   rake
   rspec
-  sexp_processor (~> 4.11)
+  sexp_processor (~> 4.17)
 
 BUNDLED WITH
    2.4.22
diff --git a/lib/cc/engine/analyzers/analyzer_base.rb b/lib/cc/engine/analyzers/analyzer_base.rb
index aa144ceb..cb7c2bba 100644
--- a/lib/cc/engine/analyzers/analyzer_base.rb
+++ b/lib/cc/engine/analyzers/analyzer_base.rb
@@ -1,5 +1,51 @@
 # frozen_string_literal: true
 
+# Monkey patch for Parser class
+# used in language analyzers via Sexp::Matcher.parse
+# https://github.com/seattlerb/sexp_processor/blob/master/lib/sexp_matcher.rb
+class Sexp
+  class Matcher < Sexp
+    class Parser
+      def parse_sexp
+        token = next_token
+
+        case token
+        when "(" then
+          parse_list
+        when "[" then
+          parse_cmd
+        when "nil" then
+          nil
+        when /^\d+$/ then
+          token.to_i
+        when "___" then
+          Sexp.___
+        when "_" then
+          Sexp._
+        when %r%^/(.*)/$% then
+          re = $1
+          raise SyntaxError, "Not allowed: /%p/" % [re] unless
+            re =~ /\A([\w()|.*+^$]+)\z/
+          Regexp.new re
+        when /^"(.*)"$/ then
+          $1
+        when /^([A-Z]\w*)$/ then
+          if Object.const_defined?($1)
+              Object.const_get $1
+            else
+              # Handle as a symbol or string
+              $1.to_sym  # or return $1 as a string
+            end
+        when /^:?([\w?!=~-]+)$/ then
+          $1.to_sym
+        else
+          raise SyntaxError, "unhandled token: %p" % [token]
+        end
+      end
+    end
+  end
+end
+
 require "cc/engine/analyzers/parser_error"
 require "cc/engine/analyzers/parser_base"
 require "cc/engine/analyzers/file_list"
diff --git a/spec/cc/engine/analyzers/ruby/main_spec.rb b/spec/cc/engine/analyzers/ruby/main_spec.rb
index 1b892275..f9743816 100644
--- a/spec/cc/engine/analyzers/ruby/main_spec.rb
+++ b/spec/cc/engine/analyzers/ruby/main_spec.rb
@@ -61,10 +61,10 @@ def self.from_remediation_amount(amount)
 
         expect(json["location"]).to eq({
           "path" => "foo.rb",
-          "lines" => { "begin" => 2, "end" => 12 },
+          "lines" => { "begin" => 2, "end" => 11 },
         })
         expect(json["other_locations"]).to eq([
-          {"path" => "foo.rb", "lines" => { "begin" => 18, "end" => 28} },
+          {"path" => "foo.rb", "lines" => { "begin" => 18, "end" => 27} },
         ])
       end
 
diff --git a/spec/cc/engine/analyzers/sexp_lines_spec.rb b/spec/cc/engine/analyzers/sexp_lines_spec.rb
index 77ab6c02..2dc04938 100644
--- a/spec/cc/engine/analyzers/sexp_lines_spec.rb
+++ b/spec/cc/engine/analyzers/sexp_lines_spec.rb
@@ -18,9 +18,9 @@ module CC::Engine::Analyzers
 
         expect(locations.count).to eq 2
         expect(locations[0].begin_line).to eq(3)
-        expect(locations[0].end_line).to eq(7)
+        expect(locations[0].end_line).to eq(4)
         expect(locations[1].begin_line).to eq(5)
-        expect(locations[1].end_line).to eq(7)
+        expect(locations[1].end_line).to eq(6)
       end
 
       it "gets appropriate locations for hashes" do
