I have posted about this earlier, but abandoned the work then because I 
had to work on something else. Now I'm coming back to this, and I have a 
question. Basically I am trying to write a parser for simple boolean 
expressions. I want to be able to use 'and' and 'or' to qualify these 
expressions, where 'and' should be optional. 'or' and 'and' are not 
allowed to appear as a search term, but "and" forces a search for the term 
'and'. To prevent 'and' and 'or' to appear as search terms, I am trying to 
use the grammar definition as below:

        ident_no_key : /[a-zA-Z\d]+/
        {
                $return = ($item[1]=~/^(OR|AND)$/i) ? undef : new 
ident_no_key(@item[1..$#item]);
        }

However, this gives me an error message:

Can't use string ("ident_no_key") as a SCALAR ref while "strict refs" in 
use at
(eval 17) line 1375.

What am I doing wrong and how can I fix it?

Jonas

__END__

package QueryParser;

use strict;
use Parse::RecDescent;

my $grammar = q
{
        <autotree>
        disj         : conj disjOp disj | conj
        conj         : term conjOp(?) conj | term
        term         : brack | phrase | ident_no_key
        brack        : '(' disj ')'
        phrase       : '"' ident_key(s?) '"'
        ident_no_key : /[a-zA-Z\d]+/
        {
                $return = ($item[1]=~/^(OR|AND)$/i) ? undef : new 
ident_no_key(@item[1..$#item]);
        }
        ident_key    : /[a-zA-Z\d]+/
        conjOp       : /AND/i
        disjOp       : /OR/i
};


sub new
{
    my $class = shift;
    my $self = {
        result => undef,
        parser => new Parse::RecDescent($grammar),
    };
    die "Bad grammar - $!" unless ($self->{parser});
    bless ($self, $class);
    return $self;
}

sub parse
{
        my ($self, $text) = @_;
        $self->{result} = $self->{parser}->disj($text);
        return defined $self->{result};
}

# ...

package ident_no_key;

sub printTree
{
        my ($self, $lead, $depth) = @_;
        # terminal
        print $lead x $depth . "ident_no_key: " . $self->{__VALUE__} . 
"\n";
}

sub formQuery
{
        my ($self) = @_;
        return $self->{__VALUE__};
}

sub getAllIdentifiers
{
        my ($self) = @_;
        return $self->{__VALUE__};
}

# ...

my $parser = QueryParser->new;
$parser->parse("@ARGV");
$parser->printTree();

Reply via email to