Skip to content

Instantly share code, notes, and snippets.

@opendevnet
Last active November 2, 2015 02:31
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 opendevnet/223bbf019a57d32e8baa to your computer and use it in GitHub Desktop.
Save opendevnet/223bbf019a57d32e8baa to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use v5.22;
use experimental qw/ refaliasing postderef / ;
use Pegex;
my $data = do { local $/; <DATA> } ;
my $grammar = q[
%grammar thing
%version 0.0.1
things: +thing*
thing: (+field +type +func +text)+ % end
value: / <DOUBLE> (<ANY>*) <DOUBLE> /
equals: / <SPACE> <EQUAL> <SPACE> /
end: / BLANK* EOL /
field: 'field' <equals> <value> <SEMI> <EOL>
type: 'type' <equals> /\b(INT|FLOAT)\b/ <SEMI> <EOL>
func: / ('funcCall' LPAREN <ANY>* RPAREN ) / <SEMI> <EOL> .( <DOT>3 <EOL>)*
text: 'text' <equals> <value> <SEMI> <EOL>
];
my $ast = pegex($grammar, 'Pegex::Tree')->parse($data);
for \my @things ( $ast->[0]->{thing}->@* ) {
for \my %thing ( @things ) {
say $thing{"text"}[0] if $thing{"text"}[0] ;
say $thing{"func"}[0] if $thing{"func"}[0] ;
}
}
__DATA__
field = "test string 0";
type = INT;
funcCall(.., field, ...);
...
text = "desc 1";
field = "test string 1";
type = FLOAT;
funcCall(.., field, ...);
...
text = "desc 2";
field = "test string 2";
type = FLOAT;
funcCall(.., field, ...);
...
text = "desc 3";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment