From dbe29599c2e9bf49368c7a92fe00259aa9cbbe15 Mon Sep 17 00:00:00 2001 From: Hugo Herbelin Date: Fri, 8 Apr 2016 12:07:57 +0200 Subject: 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. --- interp/notation.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'interp/notation.ml') diff --git a/interp/notation.ml b/interp/notation.ml index b8f4f32017..1a2e7074fd 100644 --- a/interp/notation.ml +++ b/interp/notation.ml @@ -965,7 +965,7 @@ let pr_visibility prglob = function (**********************************************************************) (* Mapping notations to concrete syntax *) -type unparsing_rule = unparsing list * precedence +type unparsing_rule = unparsing list * precedence * tolerability option type extra_unparsing_rules = (string * string) list (* Concrete syntax for symbolic-extension table *) let printing_rules = -- cgit v1.2.3