Ragel is an actively used programming language created in 2007. Ragel is a finite-state machine compiler and a parser generator. Initially Ragel supported output for C, C++ and Assembly source code,. Although subsequently extended to support several other languages (said to be Objective C, D, Go, Ruby, and Java) this support of other languages was withdrawn . Read more on Wikipedia...

13Years Old 159Users ?Jobs

Example code from Linguist:

  machine simple_scanner;

  action Emit {
    emit data[(ts+8)..(te-7)].pack('c*')

  foo = 'STARTFOO' any+ :>> 'ENDFOO';
  main := |*
    foo => Emit;

# Scans a file for "STARTFOO[...]ENDFOO" blocks and outputs their contents.
# ENV['CHUNK_SIZE'] determines how much of the file to read in at a time, allowing you to control memory usage.
# Uses ragel's scanner functionality even though it's not strictly necessary.
class SimpleScanner
  attr_reader :path

  def initialize(path)
    @path = path
    %% write data;
    # % (this fixes syntax highlighting)

  def emit(foo)
    $stdout.puts foo
  def perform
    # So that ragel doesn't try to get it from data.length
    pe = :ignored
    eof = :ignored

    %% write init;
    # % (this fixes syntax highlighting)

    leftover = []
    File.open(path) do |f|
      while chunk = f.read(ENV['CHUNK_SIZE'].to_i)
        data = leftover + chunk.unpack('c*')
        p ||= 0
        pe = data.length

        %% write exec;
        # % (this fixes syntax highlighting)
        if ts
          leftover = data[ts..pe]
          p = p - ts
          ts = 0
          leftover = []
          p = 0

s = SimpleScanner.new ARGV[0]

Trending Repos

repo stars description

Last updated June 22nd, 2020

Edit Ragel on GitHub