my $grammar = q { { my $g = GraphViz->new } start: expression /$/ { $return = $g } expression: item_right_exp | right_exp | item right_exp: operator expression {$return = $g->add_node($item[1]);$g->add_edge($return, $item[2]);} item_right_exp: item operator expression {$return = $g->add_node($item[1].'-'.$item[2].'-'.$item[3], label => $item[2]);$g->add_edge($return, $item[1]);$g->add_edge($return, $item[3]);} operator: 'AND' | 'OR' item: 'NOT' item | multi_word | word {$return = $g->add_node($item[1]);} multi_word: '"'word(s)'"' {$return = join(' ', @{$item[2]}); } word: /[a-zA-Z\?\*]+/ };