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)