aboutsummaryrefslogtreecommitdiffstats
path: root/cparser/Lexer.mll
diff options
context:
space:
mode:
authorFrançois Pottier <francois.pottier@inria.fr>2015-10-22 18:09:36 +0200
committerFrançois Pottier <francois.pottier@inria.fr>2015-10-22 18:10:12 +0200
commit581ac226fb42a0a005baa8941e5f39b181acc6cb (patch)
tree21f39be5bf22ed67db15693e5e1b6b421b6526ea /cparser/Lexer.mll
parentdfa2941c7df7641872464ff07466f754718df1c1 (diff)
downloadcompcert-kvx-581ac226fb42a0a005baa8941e5f39b181acc6cb.tar.gz
compcert-kvx-581ac226fb42a0a005baa8941e5f39b181acc6cb.zip
Fix [Lexer.char_literal] and [Lexer.string_literal] to properly keep track of [lex_start_p].
This is required for Menhir to pick up the correct start position of the token.
Diffstat (limited to 'cparser/Lexer.mll')
-rw-r--r--cparser/Lexer.mll22
1 files changed, 12 insertions, 10 deletions
diff --git a/cparser/Lexer.mll b/cparser/Lexer.mll
index 5cfe74fd..6be59aa8 100644
--- a/cparser/Lexer.mll
+++ b/cparser/Lexer.mll
@@ -283,15 +283,15 @@ rule initial = parse
currentLoc lexbuf)}
| preprocessing_number as s { error lexbuf "invalid numerical constant '%s'@ These characters form a preprocessor number, but not a constant" s;
CONSTANT (Cabs.CONST_INT "0", currentLoc lexbuf) }
- | "'" { let l = char_literal [] lexbuf in
+ | "'" { let l = char_literal lexbuf.lex_start_p [] lexbuf in
CONSTANT (Cabs.CONST_CHAR(false, l),
currentLoc lexbuf) }
- | "L'" { let l = char_literal [] lexbuf in
+ | "L'" { let l = char_literal lexbuf.lex_start_p [] lexbuf in
CONSTANT (Cabs.CONST_CHAR(true, l),
currentLoc lexbuf) }
- | "\"" { let l = string_literal [] lexbuf in
+ | "\"" { let l = string_literal lexbuf.lex_start_p [] lexbuf in
STRING_LITERAL(false, l, currentLoc lexbuf) }
- | "L\"" { let l = string_literal [] lexbuf in
+ | "L\"" { let l = string_literal lexbuf.lex_start_p [] lexbuf in
STRING_LITERAL(true, l, currentLoc lexbuf) }
| "..." { ELLIPSIS(currentLoc lexbuf) }
| "+=" { ADD_ASSIGN(currentLoc lexbuf) }
@@ -376,15 +376,17 @@ and char = parse
| _ as c
{ Int64.of_int (Char.code c) }
-and char_literal accu = parse
- | '\'' { List.rev accu }
+and char_literal startp accu = parse
+ | '\'' { lexbuf.lex_start_p <- startp;
+ List.rev accu }
| '\n' | eof { fatal_error lexbuf "missing terminating \"'\" character" }
- | "" { let c = char lexbuf in char_literal (c :: accu) lexbuf }
+ | "" { let c = char lexbuf in char_literal startp (c :: accu) lexbuf }
-and string_literal accu = parse
- | '\"' { List.rev accu }
+and string_literal startp accu = parse
+ | '\"' { lexbuf.lex_start_p <- startp;
+ List.rev accu }
| '\n' | eof { fatal_error lexbuf "missing terminating '\"' character" }
- | "" { let c = char lexbuf in string_literal (c :: accu) lexbuf }
+ | "" { let c = char lexbuf in string_literal startp (c :: accu) lexbuf }
(* We assume gcc -E syntax but try to tolerate variations. *)
and hash = parse