diff options
author | 2016-04-08 12:07:57 +0200 | |
---|---|---|
committer | 2016-04-27 21:55:45 +0200 | |
commit | dbe29599c2e9bf49368c7a92fe00259aa9cbbe15 (patch) | |
tree | 7c737eed6064ab403cec16fe1ff4c02d554758b7 /test-suite/output/Notations2.v | |
parent | 5d9cb7ad4b3e4ccc77f77456bbb9969c418fcce2 (diff) |
A heuristic to add parentheses in the presence of rules such as
Notation "## c" := (S c) (at level 0, c at level 100).
which break the stratification of precedences. This works for the case
of infix or suffix operators which occur in only one grammar rule,
such as +, *, etc. This solves the "constr" part of #3709, even though
this example is artificial.
The fix is not complete. It puts extra parenthesese even when it is
end of sentence, as in
Notation "# c % d" := (c+d) (at level 3).
Check fun x => # ## x % ## (x * 2).
(* fun x : nat => # ## x % (## x * 2) *)
The fix could be improved by not always using 100 for the printing
level of "## c", but 100 only when not the end of the sentence.
The fix does not solve the general problem with symbols occurring in
more than one rule, as e.g. in:
Notation "# c % d" := (c+d) (at level 1).
Notation "## c" := (S c) (at level 0, c at level 5).
Check fun x => # ## x % 0.
(* Parentheses are necessary only if "0 % 0" is also parsable *)
I don't see in this case what better approach to follow than
restarting the parser to check reversibility of the printing.
Diffstat (limited to 'test-suite/output/Notations2.v')
-rw-r--r-- | test-suite/output/Notations2.v | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/test-suite/output/Notations2.v b/test-suite/output/Notations2.v index 4e0d135d7..d32758375 100644 --- a/test-suite/output/Notations2.v +++ b/test-suite/output/Notations2.v @@ -106,3 +106,10 @@ Check fun x (H:le x 0) => exist (le x) 0 H. Parameters (A : Set) (x y : A) (Q : A -> A -> Prop) (conj : Q x y). Check (exist (Q x) y conj). + +(* Check printing of notations that have arguments at higher level + than the notation itself *) + +Notation "## a" := (S a) (at level 0, a at level 100). +Check fun x => (S x) + x. +Check fun x => S (x + x). |