#!/usr/bin/perl -w
    2 use v5.14;
    3 no if $] >= 5.017011, warnings => 'experimental::smartmatch';
    4 
    5 sub ok{
    6     chomp;                                  # Remove the final newline
    7     y/+/-/;                                 # (1) Replace + with -
    8     return if /^-|-$|\[-|-\]/;              # (2) ERROR if the string starts/ends with a - or if it contains [- or -]
    9     1 while s/\[([^[\]]+)]/-$1/;            # (3) Replace [...] with +...
   10     my ($base, $index, $vars) = (0, 0, 0);
   11     for (split '-'){                        # (4) Tokenize the expression, using '-' as the delimiter
   12         $base++ when m/^bx$|^bp$/i;         # (5) If the current token is bx or bp, increment $base
   13         $index++ when m/^si$|^di$/i;        # (6) If the current token is si or di, increment $index
   14         $vars++ when m/^[a-z]$/;            # (7) If the current token is a lowercase letter, increment $vars
   15         1 when m/^\d*$/i;                   # (8) If the current token is a number, do nothing
   16         default { return }                  # (9) Otherwise ERROR
   17     }
   18 
   19     $base < 2 && $index < 2 && $vars < 2    # (10)
   20 }
   21 
   22 say ok() ? 'OK' : 'ERROR' while <>;