Sha256: b5fabc624cd5b3b67c93ca068087fed5607c6376c7f88169acc226e7b1309478

Contents?: true

Size: 1.07 KB

Versions: 5

Compression:

Stored size: 1.07 KB

Contents

# frozen_string_literal: true

require "treetop"
require "set"

require_relative "spdx_grammar"

class SpdxParser
  Treetop.load(File.expand_path(File.join(File.dirname(__FILE__), "spdx_parser.treetop")))

  SKIP_PARENS = ["NONE", "NOASSERTION", ""].freeze

  def self.parse(data)
    parse_tree(data)
  end

  def self.parse_licenses(data)
    tree = parse_tree(data)
    tree.get_licenses
  end

  private_class_method def self.parse_tree(data)
    parser = SpdxGrammarParser.new # The generated grammar parser is not thread safe
    # Couldn't figure out treetop to make parens optional
    data = "(#{data})" unless SKIP_PARENS.include?(data)

    tree = parser.parse(data)
    raise SpdxGrammar::SpdxParseError, "Unable to parse expression '#{data}'. Parse error at offset: #{parser.index}" if tree.nil?

    clean_tree(tree)
    tree
  end

  private_class_method def self.clean_tree(root_node)
    return if root_node.elements.nil?

    root_node.elements.delete_if { |node| node.class.name == "Treetop::Runtime::SyntaxNode" }
    root_node.elements.each { |node| clean_tree(node) }
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
spdx-3.1.0 lib/spdx_parser.rb
spdx-3.0.1 lib/spdx_parser.rb
spdx-3.0.0 lib/spdx_parser.rb
spdx-2.0.12 lib/spdx_parser.rb
spdx-2.0.11 lib/spdx_parser.rb