Технически, эта проблема связана с попыткой связать грамматику с семантическим значением, которое фактически не отличается синтаксисом.
ISTM, что вам просто нужна единственная грамматическая конструкция, которая описывает как типы, так и выражения. Различайте в коде, а не в грамматике, особенно если нет синтаксической разницы. Yacc называется генератором компилятора, но это не совсем верно. Это просто делает парсеры.
Сказав это, распознавание []
в качестве символа терминала может быть более простым способом решения проблемы и продолжения работы. Yacc не очень хорошо разбирается в неоднозначных грамматиках, и ему необходимо быстро принять решение, по какому пути идти.