blob: f0febb728191ae4e7ba98c9ddf7c53343cb05858 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
#ifndef CPP_EXTRACT_PARSER_H
#define CPP_EXTRACT_PARSER_H
#include "diagnostics.h"
#include "node.h"
#include "identifier-lookup.h"
#include "node-tree.h"
#include "../../source/compiler-core/slang-lexer.h"
namespace CppExtract {
using namespace Slang;
class Parser
{
public:
typedef uint32_t NodeTypeBitType;
SlangResult expect(TokenType type, Token* outToken = nullptr);
bool advanceIfMarker(Token* outToken = nullptr);
bool advanceIfToken(TokenType type, Token* outToken = nullptr);
bool advanceIfStyle(IdentifierStyle style, Token* outToken = nullptr);
SlangResult pushAnonymousNamespace();
SlangResult pushScope(ScopeNode* node);
SlangResult consumeToClosingBrace(const Token* openBraceToken = nullptr);
SlangResult popScope();
/// Parse the contents of the source file
SlangResult parse(SourceOrigin* sourceOrigin, const Options* options);
void setTypeEnabled(Node::Type type, bool isEnabled = true);
bool isTypeEnabled(Node::Type type) { return (m_nodeTypeEnabled & (NodeTypeBitType(1) << int(type))) != 0; }
void setTypesEnabled(const Node::Type* types, Index typesCount, bool isEnabled = true);
Parser(NodeTree* nodeTree, DiagnosticSink* sink);
protected:
static Node::Type _toNodeType(IdentifierStyle style);
bool _isMarker(const UnownedStringSlice& name);
SlangResult _maybeConsumeScope();
SlangResult _parsePreDeclare();
SlangResult _parseTypeSet();
SlangResult _maybeParseNode(Node::Type type);
SlangResult _maybeParseField();
SlangResult _parseTypeDef();
SlangResult _parseEnum();
SlangResult _maybeParseType(List<Token>& outToks);
SlangResult _maybeParseType(UnownedStringSlice& outType);
SlangResult _maybeParseType(Index& ioTemplateDepth);
SlangResult _maybeParseTemplateArgs(Index& ioTemplateDepth);
SlangResult _maybeParseTemplateArg(Index& ioTemplateDepth);
/// Parse balanced - if a sink is set will report to that sink
SlangResult _parseBalanced(DiagnosticSink* sink);
/// Concatenate all tokens from start to the current position
UnownedStringSlice _concatTokens(TokenReader::ParsingCursor start);
void _consumeTypeModifiers();
SlangResult _consumeToSync();
NodeTypeBitType m_nodeTypeEnabled;
TokenList m_tokenList;
TokenReader m_reader;
ScopeNode* m_currentScope; ///< The current scope being processed
SourceOrigin* m_sourceOrigin; ///< The source origin that all tokens are in
DiagnosticSink* m_sink; ///< Diagnostic sink
NodeTree* m_nodeTree; ///< Shared state between parses. Nodes will be added to this
const Options* m_options;
};
} // CppExtract
#endif
|