NewLang Project
Yet another programm language
Loading...
Searching...
No Matches
parser.h
Go to the documentation of this file.
1#ifndef NEWLANG_PARSER_H_
2#define NEWLANG_PARSER_H_
3
4#include "dict.h"
5#include "diag.h"
6
7#include "warning_push.h"
8
9#include "llvm/Support/Path.h"
10#include "llvm/Support/FileSystem.h"
11
12#include "parser.yy.h"
13#include "warning_pop.h"
14
15namespace newlang {
16
17 TermPtr ProcessMacro(Parser &parser, TermPtr &term);
18
19 enum class ExpandMacroResult : uint8_t {
21 Break,
22 Goto,
23 };
24 ExpandMacroResult ExpandTermMacro(Parser &parser);
25
32 class Parser {
33 public:
34
35 Parser(MacroPtr macro = nullptr, PostLexerType *postlex = nullptr, DiagPtr diag = nullptr, bool pragma_enable = true, RunTime *rt = nullptr);
36
37 virtual ~Parser() {
38 }
41
44
46 std::string m_filename;
47 std::string m_name_module;
48 parser::location_type m_location;
49
51 std::string filename;
52 parser::location_type location;
53 };
54
55 std::vector<ParserLocation> m_loc_stack;
56
57 std::istringstream m_stream;
58
59
60 parser::token_type ExpandPredefMacro(TermPtr &term);
61
62 static int m_counter;
63 std::map<std::string, std::string> m_predef_macro;
64 bool RegisterPredefMacro(const char * name, const char * desc);
65 void InitPredefMacro();
66 bool CheckPredefMacro(const TermPtr & term);
67
68
69 // To demonstrate pure handling of parse errors, instead of
70 // simply dumping them on the standard error output, we will pass
71 // them to the driver using the following two member functions.
72
75 void error(const class location& l, const std::string& m);
76
79 void error(const std::string &m);
80
83 class Scanner* lexer;
84
88 void AstAddTerm(TermPtr &term);
90
92
100
101
102 parser::token_type GetNextToken(TermPtr * yylval, parser::location_type* yylloc);
103 // TermPtr MacroEval(const TermPtr &term);
104
105 // Проверяет термин на наличие команды препроцессора (прагмы)
106 bool PragmaCheck(const TermPtr &term);
107 // Выполняет команду препроцессора (прагму)
108 bool PragmaEval(const TermPtr &term, BlockType &buffer, BlockType &seq);
109 bool PragmaStaticAssert(const TermPtr &term);
110 static ObjPtr StaticEval(const TermPtr &term);
111
112 TermPtr Parse(const std::string str, bool expand_module = false);
113 TermPtr ParseFile(const std::string_view filename);
114
115 // Собирает термин из последовательности лексем и удаялет их из входного буфера
116 static size_t ParseTerm(TermPtr &term, const BlockType &buffer, const size_t skip = 0, bool pragma_enable = true);
117 static TermPtr ParseTerm(const char *proto, MacroPtr macro = nullptr, bool pragma_enable = true);
118
119 inline static bool IsBracket(const std::string_view str) {
120 return str.size() > 0 && (str[0] == '(' || str[0] == '[' || str[0] == '<');
121 }
122
123
124 static std::string GetCurrentDate(time_t ts = std::time(NULL));
125 static std::string GetCurrentTime(time_t ts = std::time(NULL));
126 static std::string GetCurrentTimeStamp(time_t ts = std::time(NULL));
127 static std::string GetCurrentTimeStampISO(time_t ts = std::time(NULL));
128
129 TermPtr CheckModuleTerm(const TermPtr & term);
130
131 static size_t SkipBrackets(const BlockType& buffer, size_t offset);
132
134
135 std::string m_file_time;
136 std::string m_file_md5;
137
141 private:
146 };
147
148 // /*
149 // *
150 // *
151 // */
152 //
153 // class FileParser : public Parser {
154 // public:
155 //
156 // FileParser(MacroPtr macro = nullptr, PostLexerType *postlex = nullptr, DiagPtr diag = nullptr,
157 // bool pragma_enable = true, RunTime *rt = nullptr)
158 // : Parser(macro, postlex, diag, pragma_enable, rt) {
159 //
160 // InitPredefMacro();
161 //
162 // VERIFY(RegisterPredefMacro("@__FILE_MD5__", "MD5 hash for current file"));
163 // VERIFY(RegisterPredefMacro("@__FILE_TIMESTAMP__", "Timestamp current file"));
164 // VERIFY(RegisterPredefMacro("$\\\\", "Full name of the current module name"));
165 // VERIFY(RegisterPredefMacro("@\\\\", "Root directory with the main program module"));
166 //
167 // }
168 //
169 //
170 // std::string m_file_time;
171 // std::string m_file_md5;
172 //
173 // parser::token_type ExpandPredefMacro(TermPtr &term) override;
174 //
175 // TermPtr CheckModuleTerm(const TermPtr & term) override;
176 // TermPtr ParseFile(const std::string_view filename);
177 // };
178 //
179
180} // namespace example
181
182#endif // NEWLANG_PARSER_H_
void error(const class location &l, const std::string &m)
Definition parser.cpp:110
TermPtr Parse(const std::string str, bool expand_module=false)
Definition parser.cpp:44
TermPtr m_ast
Definition parser.h:142
RunTime * m_rt
Definition parser.h:145
bool m_is_lexer_complete
Definition parser.h:140
virtual ~Parser()
Definition parser.h:37
TermPtr m_expected
Definition parser.h:93
static size_t SkipBrackets(const BlockType &buffer, size_t offset)
Definition parser.cpp:862
std::istringstream m_stream
Definition parser.h:57
bool RegisterPredefMacro(const char *name, const char *desc)
Definition parser.cpp:583
Parser(MacroPtr macro=nullptr, PostLexerType *postlex=nullptr, DiagPtr diag=nullptr, bool pragma_enable=true, RunTime *rt=nullptr)
Definition parser.cpp:14
bool PragmaCheck(const TermPtr &term)
Definition parser.cpp:176
TermPtr m_finalize
Definition parser.h:95
static size_t ParseTerm(TermPtr &term, const BlockType &buffer, const size_t skip=0, bool pragma_enable=true)
Definition parser.cpp:895
std::map< std::string, std::string > m_predef_macro
Definition parser.h:63
std::string m_file_md5
Definition parser.h:136
int m_finalize_counter
Definition parser.h:96
bool m_is_runing
Definition parser.h:143
void AstAddTerm(TermPtr &term)
Definition parser.cpp:130
static std::string GetCurrentTimeStampISO(time_t ts=std::time(NULL))
Definition parser.cpp:667
void InitPredefMacro()
Definition parser.cpp:592
bool trace_parsing
enable debug output in the bison parser
Definition parser.h:43
std::string m_name_module
Definition parser.h:47
std::vector< ParserLocation > m_loc_stack
Definition parser.h:55
TermPtr m_unexpected
Definition parser.h:94
bool PragmaEval(const TermPtr &term, BlockType &buffer, BlockType &seq)
Definition parser.cpp:185
static std::string GetCurrentDate(time_t ts=std::time(NULL))
Definition parser.cpp:649
static int m_counter
Definition parser.h:62
std::string m_file_time
Definition parser.h:135
static std::string GetCurrentTime(time_t ts=std::time(NULL))
Definition parser.cpp:655
DiagPtr m_diag
Definition parser.h:138
bool m_no_macro
Definition parser.h:98
PostLexerType * m_postlex
Definition parser.h:144
static bool IsBracket(const std::string_view str)
Definition parser.h:119
bool trace_scanning
enable debug output in the flex scanner
Definition parser.h:40
parser::token_type GetNextToken(TermPtr *yylval, parser::location_type *yylloc)
Definition parser.cpp:1131
bool m_enable_pragma
Definition parser.h:99
class Scanner * lexer
Definition parser.h:83
parser::token_type ExpandPredefMacro(TermPtr &term)
Definition parser.cpp:673
TermPtr GetAst()
Definition parser.cpp:126
static std::string GetCurrentTimeStamp(time_t ts=std::time(NULL))
Definition parser.cpp:661
bool CheckPredefMacro(const TermPtr &term)
Definition parser.cpp:636
TermPtr CheckModuleTerm(const TermPtr &term)
Definition parser.cpp:964
time_t m_timestamp
Definition parser.h:133
TermPtr m_annotation
Definition parser.h:97
std::string m_filename
stream name (file or input stream) used for error messages.
Definition parser.h:46
bool PragmaStaticAssert(const TermPtr &term)
Definition parser.cpp:506
TermPtr ParseFile(const std::string_view filename)
Definition parser.cpp:66
MacroPtr m_macro
Definition parser.h:139
parser::location_type m_location
Definition parser.h:48
BlockType m_macro_analisys_buff
Последовательность лексем для анализа на наличие макросов
Definition parser.h:91
static ObjPtr StaticEval(const TermPtr &term)
* yylval
Definition lexer.l:131
Definition nlc.h:59
std::vector< std::string > PostLexerType
Definition types.h:255
ExpandMacroResult
Definition parser.h:19
std::shared_ptr< Term > TermPtr
Definition variable.h:33
std::shared_ptr< Obj > ObjPtr
Definition variable.h:28
ExpandMacroResult ExpandTermMacro(Parser &parser)
Definition macro.cpp:45
std::shared_ptr< Macro > MacroPtr
Definition types.h:244
std::vector< TermPtr > BlockType
Definition types.h:239
std::shared_ptr< Diag > DiagPtr
Definition types.h:243
TermPtr ProcessMacro(Parser &parser, TermPtr &term)
Definition macro.cpp:26
parser::location_type location
Definition parser.h:52