From: Chris Lattner Date: Sun, 21 Jun 2009 19:56:35 +0000 (+0000) Subject: add string literals. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=10a907d70fb54c40eecabb889e81c79b44092221 add string literals. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73858 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/llvm-mc/AsmLexer.cpp b/tools/llvm-mc/AsmLexer.cpp index 4a68d0d354c..f29075ace48 100644 --- a/tools/llvm-mc/AsmLexer.cpp +++ b/tools/llvm-mc/AsmLexer.cpp @@ -77,7 +77,7 @@ asmtok::TokKind AsmLexer::LexIdentifier() { while (isalnum(*CurPtr) || *CurPtr == '_' || *CurPtr == '$' || *CurPtr == '.' || *CurPtr == '@') ++CurPtr; - CurStrVal.assign(TokStart, CurPtr); // Skip % + CurStrVal.assign(TokStart, CurPtr); // Include % return asmtok::Identifier; } @@ -194,6 +194,28 @@ asmtok::TokKind AsmLexer::LexDigit() { return asmtok::IntVal; } +/// LexQuote: String: "..." +asmtok::TokKind AsmLexer::LexQuote() { + int CurChar = getNextChar(); + // TODO: does gas allow multiline string constants? + while (CurChar != '"') { + if (CurChar == '\\') { + // Allow \", etc. + CurChar = getNextChar(); + } + + if (CurChar == EOF) { + PrintError(TokStart, "unterminated string constant"); + return asmtok::Eof; + } + + CurChar = getNextChar(); + } + + CurStrVal.assign(TokStart, CurPtr); // include quotes. + return asmtok::String; +} + asmtok::TokKind AsmLexer::LexToken() { TokStart = CurPtr; @@ -228,6 +250,7 @@ asmtok::TokKind AsmLexer::LexToken() { case '%': return LexPercent(); case '/': return LexSlash(); case '#': return LexHash(); + case '"': return LexQuote(); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return LexDigit(); diff --git a/tools/llvm-mc/AsmLexer.h b/tools/llvm-mc/AsmLexer.h index 9e694c7a301..c5d1722e491 100644 --- a/tools/llvm-mc/AsmLexer.h +++ b/tools/llvm-mc/AsmLexer.h @@ -28,10 +28,15 @@ namespace asmtok { // Markers Eof, Error, + // String values. Identifier, Register, + String, + + // Integer values. IntVal, + // No-value. EndOfStatement, Colon, Plus, @@ -70,7 +75,8 @@ public: asmtok::TokKind getKind() const { return CurKind; } const std::string &getCurStrVal() const { - assert((CurKind == asmtok::Identifier || CurKind == asmtok::Register) && + assert((CurKind == asmtok::Identifier || CurKind == asmtok::Register || + CurKind == asmtok::String) && "This token doesn't have a string value"); return CurStrVal; } @@ -95,6 +101,7 @@ private: asmtok::TokKind LexSlash(); asmtok::TokKind LexHash(); asmtok::TokKind LexDigit(); + asmtok::TokKind LexQuote(); }; } // end namespace llvm diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index 20f353ca670..7a179e83ff6 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -82,6 +82,9 @@ static int AssembleInput(const char *ProgName) { case asmtok::Register: outs() << "register: " << Lexer.getCurStrVal() << '\n'; break; + case asmtok::String: + outs() << "string: " << Lexer.getCurStrVal() << '\n'; + break; case asmtok::IntVal: outs() << "int: " << Lexer.getCurIntVal() << '\n'; break;