TGParser.h revision aff9c270de8de7d1a0bc138d391bc67136bad58e
1f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//===- TGParser.h - Parser for TableGen Files -------------------*- C++ -*-===//
2f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//
3f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//                     The LLVM Compiler Infrastructure
4f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//
53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source
63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details.
7f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//
8f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//===----------------------------------------------------------------------===//
9f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//
10f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner// This class represents the Parser for tablegen files.
11f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//
12f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//===----------------------------------------------------------------------===//
13f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
14f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#ifndef TGPARSER_H
15f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#define TGPARSER_H
16f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
17f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#include "TGLexer.h"
18f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#include <map>
19f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
20f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnernamespace llvm {
21f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  class Record;
22f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  class RecordVal;
2341b2340b74fa27344c79b0cbd2d8b2ad2b7d2b62Chris Lattner  struct RecTy;
2441b2340b74fa27344c79b0cbd2d8b2ad2b7d2b62Chris Lattner  struct Init;
25f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  struct MultiClass;
26aff9c270de8de7d1a0bc138d391bc67136bad58eCedric Venet  class SubClassReference;
27f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
28f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  struct LetRecord {
29f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    std::string Name;
30f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    std::vector<unsigned> Bits;
31f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    Init *Value;
32f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    TGLexer::LocTy Loc;
33f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    LetRecord(const std::string &N, const std::vector<unsigned> &B, Init *V,
34f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner              TGLexer::LocTy L)
35f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner      : Name(N), Bits(B), Value(V), Loc(L) {
36f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    }
37f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  };
38f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
39f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerclass TGParser {
40f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  TGLexer Lex;
41f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::vector<std::vector<LetRecord> > LetStack;
42f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::map<std::string, MultiClass*> MultiClasses;
43f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
44f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  /// CurMultiClass - If we are parsing a 'multiclass' definition, this is the
45f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  /// current value.
46f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  MultiClass *CurMultiClass;
47f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerpublic:
48f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  typedef TGLexer::LocTy LocTy;
49f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
50f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  TGParser(MemoryBuffer *StartBuf) : Lex(StartBuf), CurMultiClass(0) {}
51f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
52f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  void setIncludeDirs(const std::vector<std::string> &D){Lex.setIncludeDirs(D);}
53f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
54f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  /// ParseFile - Main entrypoint for parsing a tblgen file.  These parser
55f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  /// routines return true on error, or false on success.
56f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseFile();
57f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
58f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool Error(LocTy L, const std::string &Msg) const {
59f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    Lex.PrintError(L, Msg);
60f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return true;
61f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
62f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool TokError(const std::string &Msg) const {
63f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return Error(Lex.getLoc(), Msg);
64f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
65f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerprivate:  // Semantic analysis methods.
66f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool AddValue(Record *TheRec, LocTy Loc, const RecordVal &RV);
67f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool SetValue(Record *TheRec, LocTy Loc, const std::string &ValName,
68f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner                const std::vector<unsigned> &BitList, Init *V);
69aff9c270de8de7d1a0bc138d391bc67136bad58eCedric Venet  bool AddSubClass(Record *Rec, SubClassReference &SubClass);
70f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
71f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerprivate:  // Parser methods.
72f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseObjectList();
73f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseObject();
74f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseClass();
75f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseMultiClass();
76f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseMultiClassDef(MultiClass *CurMC);
77f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseDefm();
78f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseTopLevelLet();
79f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::vector<LetRecord> ParseLetList();
80f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
81f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  Record *ParseDef(MultiClass *CurMultiClass);
82f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseObjectBody(Record *CurRec);
83f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseBody(Record *CurRec);
84f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseBodyItem(Record *CurRec);
85f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
86f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseTemplateArgList(Record *CurRec);
87f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::string ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs);
88f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
89f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm);
90f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
91f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  Init *ParseIDValue(Record *CurRec);
92f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  Init *ParseIDValue(Record *CurRec, const std::string &Name, LocTy NameLoc);
93f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  Init *ParseSimpleValue(Record *CurRec);
94f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  Init *ParseValue(Record *CurRec);
95f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::vector<Init*> ParseValueList(Record *CurRec);
96f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::vector<std::pair<llvm::Init*, std::string> > ParseDagArgList(Record *);
97f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseOptionalRangeList(std::vector<unsigned> &Ranges);
98f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseOptionalBitList(std::vector<unsigned> &Ranges);
99f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::vector<unsigned> ParseRangeList();
100f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseRangePiece(std::vector<unsigned> &Ranges);
101f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  RecTy *ParseType();
102f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::string ParseObjectName();
103f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  Record *ParseClassID();
104f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  Record *ParseDefmID();
105f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner};
106f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
107f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner} // end namespace llvm
108f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
109f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#endif
110