BfParser.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. #pragma once
  2. #include "BeefySysLib/Common.h"
  3. #include "BfAst.h"
  4. #include "BeefySysLib/util/BumpAllocator.h"
  5. #include "BeefySysLib/util/Hash.h"
  6. #include "BeefySysLib/util/HashSet.h"
  7. #include "BfUtil.h"
  8. #include "BfSource.h"
  9. #include "MemReporter.h"
  10. #include <set>
  11. NS_BF_BEGIN
  12. class BfPassInstance;
  13. class BfProject;
  14. class BfSourceClassifier;
  15. enum BfSyntaxToken
  16. {
  17. BfSyntaxToken_None,
  18. BfSyntaxToken_Token,
  19. BfSyntaxToken_Identifier,
  20. BfSyntaxToken_CharQuote,
  21. BfSyntaxToken_StringQuote,
  22. BfSyntaxToken_ForwardSlash,
  23. BfSyntaxToken_Literal,
  24. BfSyntaxToken_CommentLine,
  25. BfSyntaxToken_CommentBlock,
  26. BfSyntaxToken_GeneratedNode,
  27. BfSyntaxToken_FAILED,
  28. BfSyntaxToken_HIT_END_IDX,
  29. BfSyntaxToken_EOF
  30. };
  31. struct BfLineStartEntry
  32. {
  33. int mCharIdx;
  34. int mLineNum;
  35. };
  36. #define PARSER_JUMPTABLE_DIVIDE 64
  37. enum BfParserFlag
  38. {
  39. ParserFlag_None,
  40. ParserFlag_Autocomplete = 1,
  41. ParserFlag_GetDefinition = 2,
  42. ParserFlag_Classifying = 4,
  43. };
  44. struct BfParserWarningEnabledChange
  45. {
  46. int mWarningNumber;
  47. bool mEnable;
  48. };
  49. enum MaybeBool
  50. {
  51. MaybeBool_None = -1,
  52. MaybeBool_False = 0,
  53. MaybeBool_True = 1,
  54. };
  55. class BfParseFileData
  56. {
  57. public:
  58. Dictionary<int, int> mUniqueIDList;
  59. int mRefCount;
  60. public:
  61. BfParseFileData()
  62. {
  63. mRefCount = 0;
  64. }
  65. ~BfParseFileData();
  66. int GetUniqueId(int idx);
  67. };
  68. class BfParserData : public BfSourceData
  69. {
  70. public:
  71. uint64 mHash;
  72. int mDataId;
  73. int mRefCount; // -1 = not cached
  74. BfParser* mUniqueParser; // For non-cached usage (ie: autocomplete)
  75. String mFileName;
  76. uint8* mCharIdData;
  77. Val128 mMD5Hash;
  78. HashSet<String> mDefines_Def;
  79. HashSet<String> mDefines_NoDef;
  80. BfLineStartEntry* mJumpTable;
  81. int mJumpTableSize;
  82. OwnedVector<String> mStringLiterals;
  83. Dictionary<int, BfParserWarningEnabledChange> mWarningEnabledChanges;
  84. std::set<int> mUnwarns;
  85. BfParseFileData* mParseFileData;
  86. bool mFailed; // Don't cache if there's a warning or an error
  87. bool mDidReduce;
  88. public:
  89. BfParserData();
  90. ~BfParserData();
  91. void Deref();
  92. virtual BfParserData* ToParserData() override
  93. {
  94. return this;
  95. }
  96. void InitFileData();
  97. virtual BfParser* ToParser() override;
  98. int GetCharIdAtIndex(int findIndex);
  99. void GetLineCharAtIdx(int idx, int& line, int& lineChar);
  100. bool IsUnwarnedAt(BfAstNode* node);
  101. bool IsWarningEnabledAtSrcIndex(int warningNumber, int srcIdx);
  102. void ReportMemory(MemReporter* memReporter);
  103. };
  104. class BfParserCache
  105. {
  106. public:
  107. struct LookupEntry
  108. {
  109. uint64 mHash;
  110. String mFileName;
  111. const char* mSrc;
  112. int mSrcLength;
  113. BfProject* mProject;
  114. };
  115. struct DataEntry
  116. {
  117. BfParserData* mParserData;
  118. bool operator==(const LookupEntry& lookup) const;
  119. bool operator==(const DataEntry& lookup) const
  120. {
  121. return lookup.mParserData == mParserData;
  122. }
  123. };
  124. public:
  125. CritSect mCritSect;
  126. int mRefCount;
  127. BfAstAllocManager mAstAllocManager;
  128. HashSet<DataEntry> mEntries;
  129. Dictionary<String, BfParseFileData*> mParseFileDataMap;
  130. public:
  131. BfParserCache();
  132. ~BfParserCache();
  133. void ReportMemory(MemReporter* memReporter);
  134. };
  135. enum BfDefineState : int8
  136. {
  137. BfDefineState_FromProject,
  138. BfDefineState_ManualSet,
  139. BfDefineState_ManualUnset
  140. };
  141. enum BfSourceEmbedKind : int8
  142. {
  143. BfSourceEmbedKind_None,
  144. BfSourceEmbedKind_Type,
  145. BfSourceEmbedKind_Method
  146. };
  147. class BfParser : public BfSource
  148. {
  149. public:
  150. BfParserData* mParserData;
  151. bool mUsingCache;
  152. BfPassInstance* mPassInstance;
  153. BfSourceClassifier* mSourceClassifier;
  154. String mFileName;
  155. int mTextVersion;
  156. BfSourceEmbedKind mEmbedKind;
  157. bool mAwaitingDelete;
  158. bool mCompatMode; // Does C++ compatible parsing
  159. bool mQuickCompatMode;
  160. bool mScanOnly;
  161. bool mCompleteParse;
  162. bool mIsEmitted;
  163. BfLineStartEntry* mJumpTable;
  164. int mJumpTableSize;
  165. int mOrigSrcLength;
  166. int mDataId;
  167. bool mAddedDependsDefines;
  168. int mSrcIdx;
  169. int mLineStart;
  170. int mLineNum;
  171. bool mInAsmBlock;
  172. int mCurBlockId;
  173. BfParserFlag mParserFlags;
  174. int mCursorIdx;
  175. int mCursorCheckIdx;
  176. BfSyntaxToken mSyntaxToken;
  177. int mTriviaStart; // mTriviaStart < mTokenStart when there's leading whitespace
  178. int mTokenStart;
  179. int mTokenEnd;
  180. BfAstNode* mGeneratedNode;
  181. BfVariant mLiteral;
  182. BfToken mToken;
  183. BfPreprocesorIgnoredSectionNode* mPreprocessorIgnoredSectionNode;
  184. int mPreprocessorIgnoreDepth;
  185. Array< std::pair<BfAstNode*, bool> > mPreprocessorNodeStack;
  186. Dictionary<String, BfDefineState> mPreprocessorDefines;
  187. std::set<int> mPreprocessorIgnoredSectionStarts;
  188. public:
  189. virtual void HandleInclude(BfAstNode* paramNode);
  190. virtual void HandleIncludeNext(BfAstNode* paramNode);
  191. virtual void HandlePragma(const StringImpl& pragma, BfBlock* block);
  192. virtual void HandleDefine(const StringImpl& name, BfAstNode* paramNode);
  193. virtual void HandleUndefine(const StringImpl& name);
  194. virtual MaybeBool HandleIfDef(const StringImpl& name);
  195. virtual MaybeBool HandleProcessorCondition(BfBlock* paramNode);
  196. public:
  197. void Init(uint64 cacheHash = 0);
  198. void NewLine();
  199. BfExpression* CreateInlineExpressionFromNode(BfBlock* block);
  200. bool EvaluatePreprocessor(BfExpression* expr);
  201. BfBlock* ParseInlineBlock(int spaceIdx, int endIdx);
  202. bool HandlePreprocessor();
  203. bool IsUnwarnedAt(BfAstNode* node);
  204. bool SrcPtrHasToken(const char* name);
  205. uint32 GetTokenHash();
  206. void ParseBlock(BfBlock* astNode, int depth, bool isInterpolate = false);
  207. double ParseLiteralDouble();
  208. void AddErrorNode(int startIdx, int endIdx);
  209. BfCommentKind GetCommentKind(int startIdx);
  210. public:
  211. BfParser(BfSystem* bfSystem, BfProject* bfProject = NULL);
  212. ~BfParser();
  213. void SetCursorIdx(int cursorIdx);
  214. virtual BfParser* ToParser() override { return this; }
  215. void GetLineCharAtIdx(int idx, int& line, int& lineChar);
  216. int GetIndexAtLine(int line);
  217. void Fail(const StringImpl& error, int offset = -1);
  218. void TokenFail(const StringImpl& error, int offset = -1);
  219. void UnexpectedCharacter();
  220. void SetSource(const char* data, int length);
  221. void MoveSource(const char* data, int length); // Takes ownership of data ptr
  222. void RefSource(const char* data, int length);
  223. void MakeNegative(uint64& val, bool& hadOverflow);
  224. void NextToken(int endIdx = -1, bool outerIsInterpolate = false, bool disablePreprocessor = false);
  225. BfAstNode* CreateNode();
  226. void Parse(BfPassInstance* passInstance);
  227. int GetCharIdAtIndex(int findIndex);
  228. virtual void Close() override;
  229. virtual void HadSrcRealloc() override;
  230. void GenerateAutoCompleteFrom(int srcPosition);
  231. void ReportMemory(MemReporter* memReporter);
  232. void GetSrcPosition(int idx, int& lineNum, int& column);
  233. };
  234. extern BfParserCache* gBfParserCache;
  235. NS_BF_END
  236. namespace std
  237. {
  238. template<>
  239. struct hash<Beefy::BfParserCache::LookupEntry>
  240. {
  241. size_t operator()(const Beefy::BfParserCache::LookupEntry& val) const
  242. {
  243. return (size_t)val.mHash;
  244. }
  245. };
  246. template<>
  247. struct hash<Beefy::BfParserCache::DataEntry>
  248. {
  249. size_t operator()(const Beefy::BfParserCache::DataEntry& val) const
  250. {
  251. return (size_t)val.mParserData->mHash;
  252. }
  253. };
  254. }