The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package Pugs::Grammar::Postcircumfix;
use strict;
use warnings;
#use base qw(Pugs::Grammar::Operator);
use Pugs::Grammar::Operator;
use base qw(Pugs::Grammar::BaseCategory);

use Pugs::Grammar::Infix;

sub add_rule {
    my $self = shift;
    my %opt = @_;
    $self->Pugs::Grammar::Operator::add_rule( %opt,
        fixity => 'postcircumfix', 
        assoc => 'non',
    );
    $self->Pugs::Grammar::Operator::add_rule( %opt,
        fixity => 'postcircumfix', 
        assoc => 'non',
        name => 'postcircumfix:<' . $opt{name} . ' ' . $opt{name2} . '>',
    );
    $self->SUPER::add_rule( 
        $opt{name}, 
        '{ return { op => "' . $opt{name} . '" ,} }' );
    $self->SUPER::add_rule( 
        $opt{name2}, 
        '{ return { op => "' . $opt{name2} . '" ,} }' );
    $self->SUPER::add_rule( 
        "postcircumfix:<" . $opt{name} . " " . $opt{name2} . ">",
        '{ return { op => "postcircumfix:<' . $opt{name} . ' ' . $opt{name2} . '>" ,} }' );
}


BEGIN {
    __PACKAGE__->add_rule( 
        name => '(',
        name2 => ')',
        assoc => 'non',
        precedence => 'equal',
        other => 'circumfix:<( )>',
    );
    __PACKAGE__->add_rule( 
        name => '[',
        name2 => ']',
        assoc => 'left',
        precedence => 'tighter',
        other => 'prefix:<++>',
    );
    __PACKAGE__->add_rule( 
        name => '{',
        name2 => '}',
        assoc => 'non',
        precedence => 'equal',
        other => 'postcircumfix:<[ ]>',
    );
    __PACKAGE__->recompile;
}

1;