diff options
author | Maxime Dénès <mail@maximedenes.fr> | 2017-11-23 18:09:31 +0100 |
---|---|---|
committer | Maxime Dénès <mail@maximedenes.fr> | 2017-11-23 18:09:31 +0100 |
commit | 92c15a9b660b874ce3fa125b1f9bdf2e85c40f47 (patch) | |
tree | af03fc4e1f9b3e7f38854d9dd9fa83d0d4aa6b66 | |
parent | 167c52c6a15db5e094835244aff3ba76c78b391e (diff) | |
parent | ab7fd497575b161eeb9bfe89da743b3fbc93aaf3 (diff) |
Merge PR #6167: Fixing factorization of recursive notations with an atomic separator
-rw-r--r-- | parsing/egramcoq.ml | 8 | ||||
-rw-r--r-- | test-suite/success/Notations2.v | 9 |
2 files changed, 14 insertions, 3 deletions
diff --git a/parsing/egramcoq.ml b/parsing/egramcoq.ml index 7f50fd22a..2cb7da569 100644 --- a/parsing/egramcoq.ml +++ b/parsing/egramcoq.ml @@ -259,9 +259,11 @@ let is_binder_level from e = match e with | (NumLevel 200, (BorderProd (Right, _) | InternalProd)) -> from = 200 | _ -> false -let make_sep_rules tkl = - let rec mkrule : Tok.t list -> unit rules = function - | [] -> Rules ({ norec_rule = Stop }, ignore) +let make_sep_rules = function + | [tk] -> Atoken tk + | tkl -> + let rec mkrule : Tok.t list -> string rules = function + | [] -> Rules ({ norec_rule = Stop }, fun _ -> (* dropped anyway: *) "") | tkn :: rem -> let Rules ({ norec_rule = r }, f) = mkrule rem in let r = { norec_rule = Next (r, Atoken tkn) } in diff --git a/test-suite/success/Notations2.v b/test-suite/success/Notations2.v index e86b3edb8..2655b651a 100644 --- a/test-suite/success/Notations2.v +++ b/test-suite/success/Notations2.v @@ -96,3 +96,12 @@ Check fun A (x :prod' bool A) => match x with ##### 0 _ y 0%bool => 2 | _ => 1 e Notation "'FUNNAT' i => t" := (fun i : nat => i = t) (at level 200). Notation "'Funnat' i => t" := (FUNNAT i => t + i%nat) (at level 200). + +(* 11. Notations with needed factorization of a recursive pattern *) +(* See https://github.com/coq/coq/issues/6078#issuecomment-342287412 *) +Module A. +Notation "[:: x1 ; .. ; xn & s ]" := (cons x1 .. (cons xn s) ..). +Notation "[:: x1 ; .. ; xn ]" := (cons x1 .. (cons xn nil) ..). +Check [:: 1 ; 2 ; 3 ]. +Check [:: 1 ; 2 ; 3 & nil ]. (* was failing *) +End A. |