Menhir разделенный_nonempty_list генерирует код с ошибкой типа
У меня есть простое рекурсивное правило:
i_stmt:
| CHAIN LPAREN c=separated_nonempty_list(i_stmt, COMMA) RPAREN {Chain c}
| ASSIGN LPAREN n=i_var COMMA e=i_expr RPAREN {Assign (n,e)}
| CRETURN LPAREN i=i_expr RPAREN { Return i }
;
Он скомпилирован нормально Менгиром, но ocamlc жалуется на сгенерированный код:
File "parser.mly", line 38, characters 72-73:
Error: This expression has type unit list
but an expression was expected of type Ast.istmt list
Type unit is not compatible with type Ast.istmt
Определение типа:
type istmt =
| Chain of (istmt list)
| Assign of ivar*iexpr
| Return of iexpr
Я попытался добавить:
%type <Ast.istmt> i_stmt
Но это тоже не помогло. Что я делаю неправильно?
1 ответ
Решение
Из менгирского мануала:
separated_nonempty_list(sep,X)
непустая последовательностьX
разделен сsep
"s
Так что вы должны написать
| CHAIN LPAREN c=separated_nonempty_list(COMMA, i_stmt) RPAREN {Chain c}