1 // =================================
 2 // Copyright (c) 2020 Seppo Laakko
 3 // Distributed under the MIT license
 4 // =================================
 5 
 6 #ifndef SNGCPP_PARSER_PARSING_CONTEXT_INCLUDED
 7 #define SNGCPP_PARSER_PARSING_CONTEXT_INCLUDED
 8 #include <sngcpp/parser/ParserApi.hpp>
 9 #include <sngcpp/ast/SourceFile.hpp>
10 #include <stack>
11 
12 namespace sngcpp { namespace cppparser {
13 
14 using namespace sngcpp::ast;
15 
16 class ParsingContext 
17 {
18 public:
19     ParsingContext();
20     bool ParsingTemplateId() const { return parsingTemplateId; }
21     void BeginParsingTemplateId();
22     void EndParsingTemplateId();
23     bool InFunctionBody() const { return inFunctionBody; }
24     void BeginFunctionBody();
25     void EndFunctionBody();
26     bool ParsingLvalue() const { return parsingLvalue; }
27     void BeginParsingLvalue();
28     void EndParsingLvalue();
29     bool ParsingArguments() const { return parsingArguments; }
30     void BeginParsingArguments();
31     void EndParsingArguments();
32     bool ParsingTemplateIdOrLvalue() const { return parsingTemplateId || parsingLvalue; }
33     bool ParsingTemplateIdOrLvalueAndNotArguments() const { return (parsingTemplateId || parsingLvalue) && !parsingArguments; }
34     bool ParsingLvalueAndNotArguments() const { return parsingLvalue && !parsingArguments; }
35     void SetSourceFileNode(SourceFileNode* sourceFileNode_) { sourceFileNode = sourceFileNode_; }
36     SourceFileNode* GetSourceFileNode() { return sourceFileNode; }
37 private:
38     bool parsingTemplateId;
39     std::stack<bool> parsingTemplateIdStack;
40     bool inFunctionBody;
41     std::stack<bool> inFunctionBodyStack;
42     bool parsingLvalue;
43     std::stack<bool> parsingLvalueStack;
44     bool parsingArguments;
45     std::stack<bool> parsingArgumentsStack;
46     SourceFileNode* sourceFileNode;
47 };
48 
49 } } // namespace sngcpp::cppparser
50 
51 #endif // SNGCPP_PARSER_PARSING_CONTEXT_INCLUDED