diff options
author | Roman Divacky <rdivacky@freebsd.org> | 2010-12-18 08:56:37 +0000 |
---|---|---|
committer | Roman Divacky <rdivacky@freebsd.org> | 2010-12-18 08:56:37 +0000 |
commit | 71d29167ea4d64166cd941fb6b5432652a0ea406 (patch) | |
tree | 9b1b6f273bd822d3f5590c601de53f2071c44931 /llvm/lib/MC/MCParser/AsmLexer.cpp | |
parent | c15ab07cffcbca4a37334d5bfafcdd141e253f09 (diff) | |
download | llvm-71d29167ea4d64166cd941fb6b5432652a0ea406.zip llvm-71d29167ea4d64166cd941fb6b5432652a0ea406.tar.gz llvm-71d29167ea4d64166cd941fb6b5432652a0ea406.tar.bz2 |
Add support for lexing single quotes like 'c'.
This fixed 8615.
llvm-svn: 122150
Diffstat (limited to 'llvm/lib/MC/MCParser/AsmLexer.cpp')
-rw-r--r-- | llvm/lib/MC/MCParser/AsmLexer.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCParser/AsmLexer.cpp b/llvm/lib/MC/MCParser/AsmLexer.cpp index 867cb20..085d519 100644 --- a/llvm/lib/MC/MCParser/AsmLexer.cpp +++ b/llvm/lib/MC/MCParser/AsmLexer.cpp @@ -265,6 +265,42 @@ AsmToken AsmLexer::LexDigit() { return AsmToken(AsmToken::Integer, Result, Value); } +/// LexSingleQuote: Integer: 'b' +AsmToken AsmLexer::LexSingleQuote() { + int CurChar = getNextChar(); + + if (CurChar == '\\') + CurChar = getNextChar(); + + if (CurChar == EOF) + return ReturnError(TokStart, "unterminated single quote"); + + CurChar = getNextChar(); + + if (CurChar != '\'') + return ReturnError(TokStart, "single quote way too long"); + + // The idea here being that 'c' is basically just an integral + // constant. + StringRef Res = StringRef(TokStart,CurPtr - TokStart); + long long Value; + + if (Res.startswith("\'\\")) { + char theChar = Res[2]; + switch (theChar) { + default: Value = theChar; break; + case '\'': Value = '\''; break; + case 't': Value = '\t'; break; + case 'n': Value = '\n'; break; + case 'b': Value = '\b'; break; + } + } else + Value = TokStart[1]; + + return AsmToken(AsmToken::Integer, Res, Value); +} + + /// LexQuote: String: "..." AsmToken AsmLexer::LexQuote() { int CurChar = getNextChar(); @@ -361,6 +397,7 @@ AsmToken AsmLexer::LexToken() { case '%': return AsmToken(AsmToken::Percent, StringRef(TokStart, 1)); case '/': return LexSlash(); case '#': return AsmToken(AsmToken::Hash, StringRef(TokStart, 1)); + case '\'': return LexSingleQuote(); case '"': return LexQuote(); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': |