blob: 835f351d3d0dd45dcb74b16347cf9dee48cac24b [file] [log] [blame]
Chris Lattnera8058742007-11-18 02:57:27 +00001//===- TGLexer.h - Lexer for TableGen Files ---------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner30609102007-12-29 20:37:13 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattnera8058742007-11-18 02:57:27 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This class represents the Lexer for tablegen files.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef TGLEXER_H
15#define TGLEXER_H
16
Chandler Carruth8b67f772009-10-26 01:35:46 +000017#include "llvm/System/DataTypes.h"
Chris Lattnera8058742007-11-18 02:57:27 +000018#include <vector>
19#include <string>
Chris Lattner8dcf7512007-11-22 23:19:05 +000020#include <cassert>
Chris Lattnera8058742007-11-18 02:57:27 +000021
22namespace llvm {
23class MemoryBuffer;
Chris Lattner8070ea32009-06-21 03:41:50 +000024class SourceMgr;
Chris Lattner1e3a8a42009-06-21 03:39:35 +000025class SMLoc;
Chris Lattnerf4601652007-11-22 20:49:04 +000026
27namespace tgtok {
28 enum TokKind {
29 // Markers
30 Eof, Error,
31
32 // Tokens with no info.
33 minus, plus, // - +
34 l_square, r_square, // [ ]
35 l_brace, r_brace, // { }
36 l_paren, r_paren, // ( )
37 less, greater, // < >
38 colon, semi, // ; :
39 comma, period, // , .
40 equal, question, // = ?
41
42 // Keywords.
43 Bit, Bits, Class, Code, Dag, Def, Defm, Field, In, Int, Let, List,
44 MultiClass, String,
45
46 // !keywords.
David Greene4afc5092009-05-14 21:54:42 +000047 XConcat, XSRA, XSRL, XSHL, XStrConcat, XNameConcat, XCast, XSubst,
David Greene6786d5e2010-01-05 19:11:42 +000048 XForEach, XCar, XCdr, XNull, XIf, XEq,
David Greenec7cafcd2009-04-22 20:18:10 +000049
Chris Lattnerf4601652007-11-22 20:49:04 +000050 // Integer value.
51 IntVal,
52
53 // String valued tokens.
54 Id, StrVal, VarName, CodeFragment
55 };
56}
Chris Lattnera8058742007-11-18 02:57:27 +000057
Chris Lattnerf4601652007-11-22 20:49:04 +000058/// TGLexer - TableGen Lexer class.
Chris Lattnera8058742007-11-18 02:57:27 +000059class TGLexer {
Chris Lattner8070ea32009-06-21 03:41:50 +000060 SourceMgr &SrcMgr;
Chris Lattneraa739d22009-03-13 07:05:43 +000061
Chris Lattnera8058742007-11-18 02:57:27 +000062 const char *CurPtr;
Chris Lattneraa739d22009-03-13 07:05:43 +000063 const MemoryBuffer *CurBuf;
Chris Lattnera8058742007-11-18 02:57:27 +000064
Chris Lattnerf4601652007-11-22 20:49:04 +000065 // Information about the current token.
66 const char *TokStart;
67 tgtok::TokKind CurCode;
68 std::string CurStrVal; // This is valid for ID, STRVAL, VARNAME, CODEFRAGMENT
Dan Gohman63f97202008-10-17 01:33:43 +000069 int64_t CurIntVal; // This is valid for INTVAL.
Chris Lattneraa739d22009-03-13 07:05:43 +000070
71 /// CurBuffer - This is the current buffer index we're lexing from as managed
72 /// by the SourceMgr object.
73 int CurBuffer;
Chris Lattnera8058742007-11-18 02:57:27 +000074
Chris Lattnera8058742007-11-18 02:57:27 +000075public:
Chris Lattner8070ea32009-06-21 03:41:50 +000076 TGLexer(SourceMgr &SrcMgr);
Chris Lattneraa739d22009-03-13 07:05:43 +000077 ~TGLexer() {}
Chris Lattnera8058742007-11-18 02:57:27 +000078
Chris Lattnerf4601652007-11-22 20:49:04 +000079 tgtok::TokKind Lex() {
80 return CurCode = LexToken();
81 }
Chris Lattnera8058742007-11-18 02:57:27 +000082
Chris Lattnerf4601652007-11-22 20:49:04 +000083 tgtok::TokKind getCode() const { return CurCode; }
84
85 const std::string &getCurStrVal() const {
86 assert((CurCode == tgtok::Id || CurCode == tgtok::StrVal ||
87 CurCode == tgtok::VarName || CurCode == tgtok::CodeFragment) &&
88 "This token doesn't have a string value");
89 return CurStrVal;
90 }
Dan Gohman63f97202008-10-17 01:33:43 +000091 int64_t getCurIntVal() const {
Chris Lattnerf4601652007-11-22 20:49:04 +000092 assert(CurCode == tgtok::IntVal && "This token isn't an integer");
93 return CurIntVal;
94 }
95
Chris Lattner1e3a8a42009-06-21 03:39:35 +000096 SMLoc getLoc() const;
Chris Lattnerf4601652007-11-22 20:49:04 +000097
Chris Lattner1c8ae592009-03-13 16:01:53 +000098 void PrintError(const char *Loc, const std::string &Msg) const;
Chris Lattner1e3a8a42009-06-21 03:39:35 +000099 void PrintError(SMLoc Loc, const std::string &Msg) const;
Chris Lattnerf4601652007-11-22 20:49:04 +0000100
Chris Lattnera8058742007-11-18 02:57:27 +0000101private:
Chris Lattnerf4601652007-11-22 20:49:04 +0000102 /// LexToken - Read the next token and return its code.
103 tgtok::TokKind LexToken();
104
105 tgtok::TokKind ReturnError(const char *Loc, const std::string &Msg);
Chris Lattnerc8a9bbc2007-11-19 07:38:58 +0000106
Chris Lattnera8058742007-11-18 02:57:27 +0000107 int getNextChar();
108 void SkipBCPLComment();
109 bool SkipCComment();
Chris Lattnerf4601652007-11-22 20:49:04 +0000110 tgtok::TokKind LexIdentifier();
Chris Lattnera8058742007-11-18 02:57:27 +0000111 bool LexInclude();
Chris Lattnerf4601652007-11-22 20:49:04 +0000112 tgtok::TokKind LexString();
113 tgtok::TokKind LexVarName();
114 tgtok::TokKind LexNumber();
115 tgtok::TokKind LexBracket();
116 tgtok::TokKind LexExclaim();
Chris Lattnera8058742007-11-18 02:57:27 +0000117};
118
119} // end namespace llvm
120
121#endif