Search code examples
rubytreetop

Rule for a regex enclosed by two /


How can I match everything between a pair of / characters with treetop? I would also like to match escaped / characters as well. For example, if I were to parse a "regex":

/blarg: dup\/md5 [0-9a-zA-Z]{32}/

The result would return:

blarg: dup\/md5 [0-9a-zA-Z]{32}

Solution

  • This should match everything inside two / characters including escaped slashes. I'm using Ruby's DATA __END__ feature so that everything can run in a single file.

    Also, note that you can tag parts of a parsed expression and then use them as functions. In the example below I tagged inside. This could also have been accessed as elements[1] instead of being tagged.

    This works similar to matching a string which you can find in the treetop docs.

    require 'treetop'
    Treetop.load_from_string DATA.read
    
    parser = RegexParser.new
    
    puts parser.parse('/blarg: dup\/md5 [0-9a-zA-Z]{32}/').inside.text_value
    
    # => blarg: dup\/md5 [0-9a-zA-Z]{32}
    
    __END__
    grammar Regex
       rule regex
          '/' inside:('\/' / !'/' .)* '/'
       end
    end