diff options
author | François Pottier <francois.pottier@inria.fr> | 2015-10-22 18:09:36 +0200 |
---|---|---|
committer | François Pottier <francois.pottier@inria.fr> | 2015-10-22 18:10:12 +0200 |
commit | 581ac226fb42a0a005baa8941e5f39b181acc6cb (patch) | |
tree | 21f39be5bf22ed67db15693e5e1b6b421b6526ea | |
parent | dfa2941c7df7641872464ff07466f754718df1c1 (diff) | |
download | compcert-581ac226fb42a0a005baa8941e5f39b181acc6cb.tar.gz compcert-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.
-rw-r--r-- | cparser/Lexer.mll | 22 |
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 |