From a77f70a077dfffd6b9b161799bd6f19c9dcf3706 Mon Sep 17 00:00:00 2001
From: Guillaume Melquiond <guillaume.melquiond@inria.fr>
Date: Tue, 6 Nov 2012 18:50:10 +0100
Subject: [PATCH] Add support for operators to why3doc.

---
 src/parser/parser.mly     |  3 ++-
 src/why3doc/doc_lexer.mll | 23 ++++++++++++++++++++++-
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/parser/parser.mly b/src/parser/parser.mly
index ff55fc6c0c..552c4a60a8 100644
--- a/src/parser/parser.mly
+++ b/src/parser/parser.mly
@@ -886,8 +886,9 @@ ident_rich:
 
 lident_rich:
 | lident                      { $1 }
-| LEFTPAR lident_op RIGHTPAR  { mk_id $2 (floc ()) }
+| LEFTPAR lident_op RIGHTPAR  { mk_id $2 (floc_i 2) }
 | LEFTPAR_STAR_RIGHTPAR       { mk_id (infix "*") (floc ()) }
+  /* FIXME: use location of operator star rather than left parenthesis */
 ;
 
 lident_op:
diff --git a/src/why3doc/doc_lexer.mll b/src/why3doc/doc_lexer.mll
index 4e008e1667..bb92b602e4 100644
--- a/src/why3doc/doc_lexer.mll
+++ b/src/why3doc/doc_lexer.mll
@@ -83,8 +83,29 @@
 
 }
 
+let op_char_1 = ['=' '<' '>' '~']
+let op_char_2 = ['+' '-']
+let op_char_3 = ['*' '/' '%']
+let op_char_4 = ['!' '$' '&' '?' '@' '^' '.' ':' '|' '#']
+let op_char_34 = op_char_3 | op_char_4
+let op_char_234 = op_char_2 | op_char_34
+let op_char_1234 = op_char_1 | op_char_234
+let op_char_pref = ['!' '?']
+let prefix_op =
+    op_char_1234* op_char_1 op_char_1234*
+  | op_char_234*  op_char_2 op_char_234*
+  | op_char_34* op_char_3 op_char_34*
+  | op_char_4+
+let operator =
+    op_char_pref op_char_4*
+  | prefix_op
+  | prefix_op '_'
+  | "[]"
+  | "[<-]"
+  | "[]<-"
+
 let space = [' ' '\t']
-let ident = ['A'-'Z' 'a'-'z' '_'] ['A'-'Z' 'a'-'z' '0'-'9' '_']*
+let ident = ['A'-'Z' 'a'-'z' '_'] ['A'-'Z' 'a'-'z' '0'-'9' '_']* | operator
 let special = ['<' '>' '&']
 
 rule scan fmt = parse
-- 
GitLab