BfParser.h 6.1 KB

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