aboutsummaryrefslogtreecommitdiff
path: root/parsing/lexer.ml4
diff options
context:
space:
mode:
authorHugo Herbelin2015-12-15 10:46:15 +0100
committerHugo Herbelin2015-12-15 11:58:21 +0100
commit003fe3d5e60b8d89b28e718e3d048818caceb56a (patch)
tree34d21c56940b9ff18046633486d6d12d121301ad /parsing/lexer.ml4
parentfa0b0bedf165812b170cedbce8a5b6cf94a5fadf (diff)
Adding a token "index" representing positions (1st, 2nd, etc.).
Diffstat (limited to 'parsing/lexer.ml4')
-rw-r--r--parsing/lexer.ml424
1 files changed, 19 insertions, 5 deletions
diff --git a/parsing/lexer.ml4 b/parsing/lexer.ml4
index 23bd74da95..d7941bedb4 100644
--- a/parsing/lexer.ml4
+++ b/parsing/lexer.ml4
@@ -262,9 +262,23 @@ let rec ident_tail len = parser
ident_tail (nstore n len s) s
| _ -> len
-let rec number len = parser
- | [< ' ('0'..'9' as c); s >] -> number (store len c) s
- | [< >] -> len
+let check_no_char s =
+ match Stream.npeek 3 s with
+ | [_;_;('a'..'z' | 'A'..'Z' | '0'..'9' | ''' | '_')] -> false
+ | [_;_;_] -> true
+ | [_;_] -> true
+ | _ -> assert false
+
+let rec number_or_index c len = parser
+ | [< ' ('0'..'9' as c); s >] -> number_or_index c (store len c) s
+ | [< s >] ->
+ match Stream.npeek 2 s with
+ | ['s';'t'] when c = '1' && check_no_char s -> njunk 2 s; false, len
+ | ['n';'d'] when c = '2' && check_no_char s -> njunk 2 s; false, len
+ | ['r';'d'] when c = '3' && check_no_char s -> njunk 2 s; false, len
+ | ['t';'h'] when not (len=1 && c='0') && check_no_char s ->
+ njunk 2 s; false, len
+ | _ -> true, len
let rec string in_comments bp len = parser
| [< ''"'; esc=(parser [<''"' >] -> true | [< >] -> false); s >] ->
@@ -513,9 +527,9 @@ let rec next_token = parser bp
let id = get_buff len in
comment_stop bp;
(try find_keyword id s with Not_found -> IDENT id), (bp, ep)
- | [< ' ('0'..'9' as c); len = number (store 0 c) >] ep ->
+ | [< ' ('0'..'9' as c); (b,len) = number_or_index c (store 0 c) >] ep ->
comment_stop bp;
- (INT (get_buff len), (bp, ep))
+ (if b then INT (get_buff len) else INDEX (get_buff len)), (bp, ep)
| [< ''\"'; len = string None bp 0 >] ep ->
comment_stop bp;
(STRING (get_buff len), (bp, ep))