Вам нужно немного разложить ваш код;правила, которые вы показываете, не только ужасны, но и содержат много избыточности.Например, два правила в основном одинаковы, за исключением последнего терминала;Вы могли бы легко разложить эту часть по определенному правилу:
type_name:
| INTEGER { St_int }
| BOOLEAN { St_bool }
Чтобы ответить на ваш вопрос, параметры в параметризованных приложениях правил не могут быть последовательностью терминала (что должно возвращать все это?), а толькоодин «фактический», который является либо терминальным, нетерминальным, либо применением параметризованного правила.Это заставляет вас разбивать вашу грамматику на отдельные произведения, что хорошо.
%inline couple(open_sep,X,close_sep):
| open_sep x1 = X COMMA x2 = X close_sep { (x1, x2) }
rectangle:
| rect = couple(LPAREN, couple(LBRACKET, INT, RBRACKET), RPAREN) { rect }
type_name:
| INTEGER { St_int }
| BOOLEAN { St_bool }
binding_names:
| ids_names = separated_nonempty_list (COMMA, rectangle) COLON ty = type_name
{ [] (* put what you want here *) }
В этом случае rectangle
возвращает (int * int) * (int * int)
.
PS: если вы столкнетесь с подобнымснова ошибка, не стесняйтесь читать менгир документация (PDF) .