[cfe-dev] from source location to token?
Chris Lattner
clattner at apple.com
Mon Nov 24 10:23:12 PST 2008
On Nov 24, 2008, at 7:53 AM, Roberto Bagnara wrote:
>> It would be interesting to know a little bit more about what you are
>> doing. In general, re-lexing/re-parsing isn't very desirable (though
>> it may be appropriate if it's uncommon).
>
> Hi Steve,
>
> there are program analyses that, for instance:
>
> 1) need to reason on an exact representation of floating-point
> literals
> (any approximation may result into an unsound analysis);
Hi Roberto,
You don't need the original Token to get this. Clang's source
location information is so precise that (given a SourceLocation) you
can arbitrarily re-lex a token later. This property is actually
inherent to how we handle SourceRange's: the source range points to
the *start* of the first/end token in the range. To get render
through the end of the token, the diagnostics machinery re-lexes the
token, which gives exactly the original spelling and length.
You can see this in action with the command line driver. Consider
this program:
struct s;
void foo(struct s *s) {
*s + 0.12321e-42;
}
-fsyntax-only prints:
t.c:7:7: error: invalid operands to binary expression ('struct s' and
'double')
*s + 0.12321e-42;
~~ ^ ~~~~~~~~~~~
The way it gets the end of the fp literal is to relex the token with
code in Lexer::MeasureTokenLength.
Given a SourceLocation and the length of the token (as returned by
MeasureTokenLength) you can get the exact original spelling (including
trigraphs and escaped newlines, beware). The pointer to the start of
the string is obtained with:
const char *StrData = SourceMgr.getCharacterData(Loc);
>
> 2) need to reason on the textual representation that was used in the
> program also for integer literals (for example, there are coding
> rules that forbid the use of octal constants: the analyzer should
> flag their use in the source program).
Sure, Clang can handle this sort of thing with no problem.
-Chris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20081124/a4406d8b/attachment.html>
More information about the cfe-dev
mailing list