MCAsmLexer.h revision 5d74e1f64445713cca863af03b8b6ab39321046e
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===-- llvm/MC/MCAsmLexer.h - Abstract Asm Lexer Interface -----*- C++ -*-===// 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The LLVM Compiler Infrastructure 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// License. See LICENSE.TXT for details. 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LLVM_MC_MCASMLEXER_H 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LLVM_MC_MCASMLEXER_H 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "llvm/ADT/StringRef.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/System/DataTypes.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/Support/SMLoc.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace llvm { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MCAsmLexer; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MCInst; 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Target; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// AsmToken - Target independent representation for an assembler token. 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AsmToken { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public: 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enum TokenKind { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Markers 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Eof, Error, 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // String values. 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Identifier, 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) String, 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Integer values. 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Integer, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Register values (stored in IntVal). Only used by TargetAsmLexer. 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Register, 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No-value. 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndOfStatement, 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Colon, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Plus, Minus, Tilde, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Slash, // '/' 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LParen, RParen, LBrac, RBrac, LCurly, RCurly, 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Star, Comma, Dollar, Equal, EqualEqual, 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Pipe, PipePipe, Caret, 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Amp, AmpAmp, Exclaim, ExclaimEqual, Percent, Hash, 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Less, LessEqual, LessLess, LessGreater, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Greater, GreaterEqual, GreaterGreater 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TokenKind Kind; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// A reference to the entire token contents; this is always a pointer into 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// a memory buffer owned by the source manager. 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StringRef Str; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64_t IntVal; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)public: 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AsmToken() {} 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AsmToken(TokenKind _Kind, StringRef _Str, int64_t _IntVal = 0) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : Kind(_Kind), Str(_Str), IntVal(_IntVal) {} 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TokenKind getKind() const { return Kind; } 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is(TokenKind K) const { return Kind == K; } 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool isNot(TokenKind K) const { return Kind != K; } 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SMLoc getLoc() const; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// getStringContents - Get the contents of a string token (without quotes). 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StringRef getStringContents() const { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(Kind == String && "This token isn't a string!"); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Str.slice(1, Str.size() - 1); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// getIdentifier - Get the identifier string for the current token, which 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// should be an identifier or a string. This gets the portion of the string 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// which should be used as the identifier, e.g., it does not include the 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// quotes on strings. 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringRef getIdentifier() const { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Kind == Identifier) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return getString(); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return getStringContents(); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// getString - Get the string for the current token, this includes all 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// characters (for example, the quotes on strings) in the token. 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// The returned StringRef points into the source manager's memory buffer, and 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// is safe to store across calls to Lex(). 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringRef getString() const { return Str; } 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // FIXME: Don't compute this in advance, it makes every token larger, and is 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // also not generally what we want (it is nicer for recovery etc. to lex 123br 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // as a single token, then diagnose as an invalid number). 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int64_t getIntVal() const { 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(Kind == Integer && "This token isn't an integer!"); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IntVal; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// getRegVal - Get the register number for the current token, which should 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// be a register. 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned getRegVal() const { 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(Kind == Register && "This token isn't a register!"); 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return static_cast<unsigned>(IntVal); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// MCAsmLexer - Generic assembler lexer interface, for use by target specific 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// assembly lexers. 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MCAsmLexer { 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// The current token, stored in the base class for faster access. 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsmToken CurTok; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// The location and description of the current error 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SMLoc ErrLoc; 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string Err; 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MCAsmLexer(const MCAsmLexer &); // DO NOT IMPLEMENT 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void operator=(const MCAsmLexer &); // DO NOT IMPLEMENT 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)protected: // Can only create subclasses. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MCAsmLexer(); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual AsmToken LexToken() = 0; 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetError(const SMLoc &errLoc, const std::string &err) { 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ErrLoc = errLoc; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Err = err; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public: 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~MCAsmLexer(); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// Lex - Consume the next token from the input stream and return it. 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /// The lexer will continuosly return the end-of-file token once the end of 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /// the main input file has been reached. 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const AsmToken &Lex() { 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return CurTok = LexToken(); 14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /// getTok - Get the current (last) lexed token. 14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const AsmToken &getTok() { 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CurTok; 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// getErrLoc - Get the current error location 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SMLoc &getErrLoc() { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ErrLoc; 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// getErr - Get the current error string 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string &getErr() { 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Err; 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// getKind - Get the kind of current token. 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsmToken::TokenKind getKind() const { return CurTok.getKind(); } 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// is - Check if the current token has kind \arg K. 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is(AsmToken::TokenKind K) const { return CurTok.is(K); } 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// isNot - Check if the current token has kind \arg K. 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool isNot(AsmToken::TokenKind K) const { return CurTok.isNot(K); } 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // End llvm namespace 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)