Module: SrlRuby

Defined in:
lib/srl_ruby.rb,
lib/srl_ruby/grammar.rb,
lib/srl_ruby/version.rb,
lib/srl_ruby/srl_token.rb,
lib/srl_ruby/tokenizer.rb,
lib/srl_ruby/ast_builder.rb

Overview

This module is used as a namespace

Defined Under Namespace

Classes: ASTBuilder, Position, SrlToken, Tokenizer

Constant Summary collapse

Grammar =

And now build the grammar and make it accessible via a global constant

builder.grammar
VERSION =
'0.2.2'.freeze

Class Method Summary collapse

Class Method Details

.load_file(filename) ⇒ Regexp

Load the SRL expression contained in filename. Returns an equivalent Regexp object.

Parameters:

  • filename (String)

    file name to parse.

Returns:

  • (Regexp)


11
12
13
14
15
16
17
# File 'lib/srl_ruby.rb', line 11

def self.load_file(filename)
  source = nil
  File.open(filename, 'r') { |f| source = f.read }
  return source if source.nil? || source.empty?
  
  return parse(source)
end

.parse(source) ⇒ Regexp

Parse the SRL expression into its Regexp equivalent.

Parameters:

  • source (String)

    the SRL source to parse and convert.

Returns:

  • (Regexp)


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/srl_ruby.rb', line 22

def self.parse(source)
  # Create a Rley facade object
  engine = Rley::Engine.new

  # Step 1. Load SRL grammar
  engine.use_grammar(SrlRuby::Grammar)

  lexer = SrlRuby::Tokenizer.new(source)
  result = engine.parse(lexer.tokens)

  unless result.success?
    # Stop if the parse failed...
    line1 = "Parsing failed\n"
    line2 = "Reason: #{result.failure_reason.message}"
    raise StandardError, line1 + line2
  end

  # Generate an abstract syntax tree (AST) from the parse result
  engine.configuration.repr_builder = SrlRuby::ASTBuilder
  ast_ptree = engine.convert(result)

  # Now output the regexp literal
  root = ast_ptree.root
  # puts root.to_str # TODO remove this line
  # pp root
  return Regexp.new(root.to_str)
end