Class: Ruby::Rego::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby/rego/parser.rb,
lib/ruby/rego/parser/query.rb,
lib/ruby/rego/parser/rules.rb,
lib/ruby/rego/parser/precedence.rb,
lib/ruby/rego/parser/references.rb,
lib/ruby/rego/parser/collections.rb,
lib/ruby/rego/parser/expressions.rb

Overview

Parsing helpers for expressions. rubocop:disable Metrics/ClassLength

Defined Under Namespace

Modules: Helpers, Precedence Classes: BracketMatcher, IdentifierContext, RuleHeadPathBuilder

Constant Summary collapse

IDENTIFIER_TOKEN_TYPES =
[TokenType::IDENT, TokenType::DATA, TokenType::INPUT].freeze
IDENTIFIER_TOKEN_NAMES =
{
  TokenType::DATA => "data",
  TokenType::INPUT => "input"
}.freeze
BINARY_OPERATOR_MAP =
{
  TokenType::ASSIGN => :assign,
  TokenType::UNIFY => :unify,
  TokenType::IN => :in,
  TokenType::OR => :or,
  TokenType::AND => :and,
  TokenType::EQ => :eq,
  TokenType::NEQ => :neq,
  TokenType::LT => :lt,
  TokenType::LTE => :lte,
  TokenType::GT => :gt,
  TokenType::GTE => :gte,
  TokenType::PLUS => :plus,
  TokenType::MINUS => :minus,
  TokenType::STAR => :mult,
  TokenType::SLASH => :div,
  TokenType::PERCENT => :mod
}.freeze
UNARY_OPERATOR_MAP =
{
  TokenType::NOT => :not,
  TokenType::MINUS => :minus
}.freeze
PRIMARY_PARSERS =
{
  TokenType::STRING => :parse_string_literal,
  TokenType::TEMPLATE_STRING => :parse_template_string,
  TokenType::RAW_STRING => :parse_string_literal,
  TokenType::RAW_TEMPLATE_STRING => :parse_template_string,
  TokenType::NUMBER => :parse_number_literal,
  TokenType::TRUE => :parse_boolean_literal,
  TokenType::FALSE => :parse_boolean_literal,
  TokenType::NULL => :parse_null_literal,
  TokenType::NOT => :parse_unary_expression,
  TokenType::MINUS => :parse_unary_expression,
  TokenType::EVERY => :parse_every,
  TokenType::LPAREN => :parse_parenthesized_expression,
  TokenType::LBRACKET => :parse_array,
  TokenType::LBRACE => :parse_braced_literal,
  TokenType::IDENT => :parse_identifier_expression,
  TokenType::DATA => :parse_identifier_expression,
  TokenType::INPUT => :parse_identifier_expression,
  TokenType::UNDERSCORE => :parse_identifier_expression
}.freeze
PACKAGE_PATH_TOKEN_TYPES =
[TokenType::IDENT].freeze
IMPORT_PATH_TOKEN_TYPES =
IDENTIFIER_TOKEN_TYPES

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(tokens) ⇒ Parser

Create a parser from a token list.

Parameters:

  • tokens (Array<Token>)

    token stream



77
78
79
80
81
# File 'lib/ruby/rego/parser.rb', line 77

def initialize(tokens)
  @tokens = tokens.dup
  @current = 0
  @errors = [] # @type var errors: Array[ParserError]
end

Class Method Details

.parse_expression_from_string(source) ⇒ Object

Parse a single Rego expression from source.

Parameters:

  • source (String)

Returns:

  • (Object)


203
204
205
206
207
208
209
# File 'lib/ruby/rego/parser.rb', line 203

def parse_expression_from_string(source)
  tokens = Lexer.new(source.to_s).tokenize
  parser = new(tokens)
  expression = parser.send(:parse_expression)
  parser.send(:consume, TokenType::EOF, "Expected end of expression.")
  expression
end

Instance Method Details

#parseAST::Module

Parse the token stream into an AST module.

Returns:



86
87
88
89
90
91
# File 'lib/ruby/rego/parser.rb', line 86

def parse
  module_node = parse_module
  raise errors.first if errors.any?

  module_node
end