http://www.perlmonks.org?node_id=1157468

blindluke has asked for the wisdom of the Perl Monks concerning the following question:

Enlightened Monks!

I wanted to play around with Regexp::Grammars, but it seems even the basic stuff eludes me. Could someone tell me what I'm doing wrong?

#!/usr/bin/perl use v5.14; my $sentence = "Show me the money"; my $grammar = qr{ <nocontext:> <Sentence> <rule: Sentence> <VerbGroup> <NounGroup> <rule: VerbGroup> <Verb> | <Verb> me <rule: Verb> <Word> <rule: NounGroup> <Noun> | a <Noun> | the <Noun> <rule: Noun> <Word> <rule: Word> \w+ }x; sub parse { my $s = shift; say "The sentence is: $s"; if ($s =~ $grammar) { use Data::Dumper; print Dumper %/; } else { say "I did not understand you." } } parse ($sentence);

I was expecting a data structure from which I could get $verb and $noun, but what I get instead is:

The sentence is: Show me the money I did not understand you.

- Luke

Replies are listed 'Best First'.
Re: Parsing a sentence with Regexp::Grammars
by Paladin (Vicar) on Mar 11, 2016 at 17:54 UTC
    I haven't used it myself, but you seem to be missing a use Regexp::Grammars; line in your code.

      You, sir, are a gentleman and a scholar.

      This fine example of my stupidity will rank highly among its countless peers.

      Edit:

      Just in case someone gets here looking for a working example, here it is:

      use v5.14; use Regexp::Grammars; my $sentence = "Show me the money"; my $grammar = qr{ <nocontext:> <Sentence> <rule: Sentence> <VerbGroup> <NounGroup> <rule: VerbGroup> <Verb> <VPostfix>? <rule: Verb> <.Word> <rule: NounGroup> <NPrefix>? <Noun> <rule: Noun> <.Word> <rule: VPostfix> me | us | them <rule: NPrefix> a | an | the | some <rule: Word> \w+ }x; sub parse { my $s = shift; say "The sentence is: $s"; if ($s =~ $grammar) { use Data::Dumper; print Dumper \%/; } else { say "I did not understand you." } } parse ($sentence);

      The result looks like this:

      The sentence is: Show me the money $VAR1 = { 'Sentence' => { 'NounGroup' => { 'NPrefix' => 'the', 'Noun' => 'money' }, 'VerbGroup' => { 'Verb' => 'Show', 'VPostfix' => 'me' } } };

      - Luke