194b9550a32d189704a8eae55505edf62662c0534Evan Cheng//===-- llvm/MC/MCTargetAsmLexer.h - Target Assembly Lexer ------*- C++ -*-===//
2af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner//
3af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner//                     The LLVM Compiler Infrastructure
4af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner//
5af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner// This file is distributed under the University of Illinois Open Source
6af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner// License. See LICENSE.TXT for details.
7af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner//
8af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner//===----------------------------------------------------------------------===//
9af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner
1094b9550a32d189704a8eae55505edf62662c0534Evan Cheng#ifndef LLVM_MC_MCTARGETASMLEXER_H
1194b9550a32d189704a8eae55505edf62662c0534Evan Cheng#define LLVM_MC_MCTARGETASMLEXER_H
12af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner
13563515620336138c108febe0f5179594b071c896Sean Callanan#include "llvm/MC/MCParser/MCAsmLexer.h"
14563515620336138c108febe0f5179594b071c896Sean Callanan
15af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattnernamespace llvm {
16af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattnerclass Target;
17639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
1894b9550a32d189704a8eae55505edf62662c0534Evan Cheng/// MCTargetAsmLexer - Generic interface to target specific assembly lexers.
1994b9550a32d189704a8eae55505edf62662c0534Evan Chengclass MCTargetAsmLexer {
20563515620336138c108febe0f5179594b071c896Sean Callanan  /// The current token
21563515620336138c108febe0f5179594b071c896Sean Callanan  AsmToken CurTok;
22639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
23563515620336138c108febe0f5179594b071c896Sean Callanan  /// The location and description of the current error
24563515620336138c108febe0f5179594b071c896Sean Callanan  SMLoc ErrLoc;
25563515620336138c108febe0f5179594b071c896Sean Callanan  std::string Err;
26639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
271f7210e808373fa92be3a2d4fa653a6f79d5088bCraig Topper  MCTargetAsmLexer(const MCTargetAsmLexer &) LLVM_DELETED_FUNCTION;
281f7210e808373fa92be3a2d4fa653a6f79d5088bCraig Topper  void operator=(const MCTargetAsmLexer &) LLVM_DELETED_FUNCTION;
29af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattnerprotected: // Can only create subclasses.
3094b9550a32d189704a8eae55505edf62662c0534Evan Cheng  MCTargetAsmLexer(const Target &);
31639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
32563515620336138c108febe0f5179594b071c896Sean Callanan  virtual AsmToken LexToken() = 0;
33639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
34563515620336138c108febe0f5179594b071c896Sean Callanan  void SetError(const SMLoc &errLoc, const std::string &err) {
35563515620336138c108febe0f5179594b071c896Sean Callanan    ErrLoc = errLoc;
36563515620336138c108febe0f5179594b071c896Sean Callanan    Err = err;
37563515620336138c108febe0f5179594b071c896Sean Callanan  }
38639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
39af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner  /// TheTarget - The Target that this machine was created for.
40af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner  const Target &TheTarget;
41894c1af05fb3f0d8e2ee6565816fa220b260ed9dSean Callanan  MCAsmLexer *Lexer;
42639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
43af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattnerpublic:
4494b9550a32d189704a8eae55505edf62662c0534Evan Cheng  virtual ~MCTargetAsmLexer();
45639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
46af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner  const Target &getTarget() const { return TheTarget; }
47639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
48894c1af05fb3f0d8e2ee6565816fa220b260ed9dSean Callanan  /// InstallLexer - Set the lexer to get tokens from lower-level lexer \arg L.
49894c1af05fb3f0d8e2ee6565816fa220b260ed9dSean Callanan  void InstallLexer(MCAsmLexer &L) {
50894c1af05fb3f0d8e2ee6565816fa220b260ed9dSean Callanan    Lexer = &L;
51894c1af05fb3f0d8e2ee6565816fa220b260ed9dSean Callanan  }
52639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
53894c1af05fb3f0d8e2ee6565816fa220b260ed9dSean Callanan  MCAsmLexer *getLexer() {
54894c1af05fb3f0d8e2ee6565816fa220b260ed9dSean Callanan    return Lexer;
55894c1af05fb3f0d8e2ee6565816fa220b260ed9dSean Callanan  }
56639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
57563515620336138c108febe0f5179594b071c896Sean Callanan  /// Lex - Consume the next token from the input stream and return it.
58563515620336138c108febe0f5179594b071c896Sean Callanan  const AsmToken &Lex() {
59563515620336138c108febe0f5179594b071c896Sean Callanan    return CurTok = LexToken();
60563515620336138c108febe0f5179594b071c896Sean Callanan  }
61639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
62563515620336138c108febe0f5179594b071c896Sean Callanan  /// getTok - Get the current (last) lexed token.
63563515620336138c108febe0f5179594b071c896Sean Callanan  const AsmToken &getTok() {
64563515620336138c108febe0f5179594b071c896Sean Callanan    return CurTok;
65563515620336138c108febe0f5179594b071c896Sean Callanan  }
66639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
67563515620336138c108febe0f5179594b071c896Sean Callanan  /// getErrLoc - Get the current error location
68563515620336138c108febe0f5179594b071c896Sean Callanan  const SMLoc &getErrLoc() {
69563515620336138c108febe0f5179594b071c896Sean Callanan    return ErrLoc;
70563515620336138c108febe0f5179594b071c896Sean Callanan  }
71639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
72563515620336138c108febe0f5179594b071c896Sean Callanan  /// getErr - Get the current error string
73563515620336138c108febe0f5179594b071c896Sean Callanan  const std::string &getErr() {
74563515620336138c108febe0f5179594b071c896Sean Callanan    return Err;
75563515620336138c108febe0f5179594b071c896Sean Callanan  }
76639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
77563515620336138c108febe0f5179594b071c896Sean Callanan  /// getKind - Get the kind of current token.
78563515620336138c108febe0f5179594b071c896Sean Callanan  AsmToken::TokenKind getKind() const { return CurTok.getKind(); }
79639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
80563515620336138c108febe0f5179594b071c896Sean Callanan  /// is - Check if the current token has kind \arg K.
81563515620336138c108febe0f5179594b071c896Sean Callanan  bool is(AsmToken::TokenKind K) const { return CurTok.is(K); }
82639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach
83563515620336138c108febe0f5179594b071c896Sean Callanan  /// isNot - Check if the current token has kind \arg K.
84563515620336138c108febe0f5179594b071c896Sean Callanan  bool isNot(AsmToken::TokenKind K) const { return CurTok.isNot(K); }
85af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner};
86af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner
87af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner} // End llvm namespace
88af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner
89af0d301f43ddc61582c5ceb3b9e0492d71dc4330Chris Lattner#endif
90