Skip to content

Instantly share code, notes, and snippets.

@Xliff
Created April 14, 2022 23:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Xliff/e2a51378257a714e3dd66613c6369a8a to your computer and use it in GitHub Desktop.
Save Xliff/e2a51378257a714e3dd66613c6369a8a to your computer and use it in GitHub Desktop.
Parsing Code
#!/usr/bin/env raku
my regex nested-parens {
  :ratchet
  '(
   '$<before>=<-[)\s(]>*
    <inside=~~>
    $<after>=<-[)\s(]>*
  ')'
};

my regex nested-braces {
  :ratchet
  '{'
     [
        $<before>=<-[{]>*
        <inside=~~>
        $<after>=<-[}]>*
     ]*
  #'}'
};

my rule class-def {
  'class'
    $<name>=[ \S+ ]
    $<misc>=(<-[\{]>+)
  <nested-braces>
}

my regex method-def {
  $<m>=[ 'sub'?'method' ]     \s*
    $<name>=(<-[)(}{\s]>+)    \s*
    $<args>=<nested-parens>?  \s*
    [ $<misc>=(<-[{]>+) ]?
  #<nested-braces>
}

my $contents;

sub MAIN {
  $contents ~~ / <class-def> /;

  if $/<class-def> -> $cd {
    $cd.gist.say;

    if $cd<nested-braces><inside> -> $i {
      if $i.Str ~~ m:g/ <method-def> / {
        $/.gist.say;
        exit;

        my $sorted-methods = $/<method-def>.sort( *<name> );
        say "Methods found:\n{
             $sorted-methods.map( "\t" ~ *<name>.Str ).join("\n") }";
      } else {
        say 'No methods found!';
      }
    }
  } else {
    say 'No classes found!';
  }
}


INIT {
$contents = q:to/CODE/;
class Rest::Parmas::Iter {
  has RestParamsIter $!rpi;

  submethod BUILD ( :$rest-params-iter ) {
    $!rpi = $rest-params-iter
  }

  method new (RestParams() $rp) {
    my $rest-params-iter = RestParamsIter.new;
    Rest::Params::Iter.init($rest-params-iter, $rp);

    $rest-params-iter ?? self.bless( :$rest-params-iter ) !! Nil;
  }

  method init (
    ::?CLASS:U:

    RestParamsIter $iter,
    RestParams     $params
  ) {
    rest_params_iter_init($iter, $params);
  }

  proto method next (|)
  { * }

  multi method next ( :$raw = False ) {
    my $cn = newCArray(Str);
    my $cp = newCArray(RestParam);

    samewith($cn, $cp, :$raw);
  }
  multi method next (
    CArray[Str]        $name,
    CArray[RestParam]  $param,
                      :$raw = False
  ) {
    rest_params_iter_next($!rpi, $name, $param);

    my $rpr = propReturnObject( ppr($param), $raw, |Rest::Param.getTypePair );

    ( ppr($name), $rpr )
  }
}
CODE

}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment