119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===- TGLexer.h - Lexer for TableGen Files ---------------------*- C++ -*-===// 219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// The LLVM Compiler Infrastructure 419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source 619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details. 719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This class represents the Lexer for tablegen files. 1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#ifndef TGLEXER_H 1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define TGLEXER_H 1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/DataTypes.h" 1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include <string> 1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include <vector> 2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include <cassert> 2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm { 2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass MemoryBuffer; 2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass SourceMgr; 2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass SMLoc; 2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass Twine; 2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace tgtok { 2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman enum TokKind { 3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Markers 3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Eof, Error, 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Tokens with no info. 3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman minus, plus, // - + 3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman l_square, r_square, // [ ] 3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman l_brace, r_brace, // { } 3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman l_paren, r_paren, // ( ) 3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman less, greater, // < > 3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman colon, semi, // : ; 4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman comma, period, // , . 4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman equal, question, // = ? 4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Keywords. 4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Bit, Bits, Class, Code, Dag, Def, Defm, Field, In, Int, Let, List, 4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MultiClass, String, 4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // !keywords. 4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman XConcat, XSRA, XSRL, XSHL, XStrConcat, XCast, XSubst, 4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman XForEach, XHead, XTail, XEmpty, XIf, XEq, 5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Integer value. 5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman IntVal, 5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // String valued tokens. 5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Id, StrVal, VarName, CodeFragment 5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman }; 5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// TGLexer - TableGen Lexer class. 6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass TGLexer { 6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SourceMgr &SrcMgr; 6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const char *CurPtr; 6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MemoryBuffer *CurBuf; 6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Information about the current token. 6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const char *TokStart; 6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman tgtok::TokKind CurCode; 6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT 7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman int64_t CurIntVal; // This is valid for INTVAL. 7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// CurBuffer - This is the current buffer index we're lexing from as managed 7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// by the SourceMgr object. 7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman int CurBuffer; 7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// Dependencies - This is the list of all included files. 7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman std::vector<std::string> Dependencies; 7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TGLexer(SourceMgr &SrcMgr); 8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman ~TGLexer() {} 8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman tgtok::TokKind Lex() { 8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return CurCode = LexToken(); 8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const std::vector<std::string> &getDependencies() const { 8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return Dependencies; 8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman tgtok::TokKind getCode() const { return CurCode; } 9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const std::string &getCurStrVal() const { 9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal || 9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) && 9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "This token doesn't have a string value"); 9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return CurStrVal; 9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman int64_t getCurIntVal() const { 9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(CurCode == tgtok::IntVal && "This token isn't an integer"); 10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return CurIntVal; 10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SMLoc getLoc() const; 10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanprivate: 10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// LexToken - Read the next token and return its code. 10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman tgtok::TokKind LexToken(); 10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman tgtok::TokKind ReturnError(const char *Loc, const Twine &Msg); 11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman int getNextChar(); 11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void SkipBCPLComment(); 11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool SkipCComment(); 11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman tgtok::TokKind LexIdentifier(); 11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool LexInclude(); 11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman tgtok::TokKind LexString(); 11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman tgtok::TokKind LexVarName(); 11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman tgtok::TokKind LexNumber(); 11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman tgtok::TokKind LexBracket(); 12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman tgtok::TokKind LexExclaim(); 12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // end namespace llvm 12419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 12519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#endif 126