| 
									
										
										
										
											2021-02-06 15:51:04 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2021, Itamar S. <itamar8910@gmail.com> | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2021-04-22 01:24:48 -07:00
										 |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							| 
									
										
										
										
											2021-02-06 15:51:04 +02:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-13 10:37:23 +02:00
										 |  |  | #include <AK/FlyString.h>
 | 
					
						
							| 
									
										
										
										
											2021-02-06 15:51:04 +02:00
										 |  |  | #include <AK/HashMap.h>
 | 
					
						
							|  |  |  | #include <AK/Optional.h>
 | 
					
						
							|  |  |  | #include <AK/String.h>
 | 
					
						
							|  |  |  | #include <AK/StringView.h>
 | 
					
						
							|  |  |  | #include <AK/Vector.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Cpp { | 
					
						
							|  |  |  | class Preprocessor { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-03-13 10:37:23 +02:00
										 |  |  |     explicit Preprocessor(const String& filename, const StringView& program); | 
					
						
							| 
									
										
										
										
											2021-02-06 15:51:04 +02:00
										 |  |  |     const String& process(); | 
					
						
							|  |  |  |     const String& processed_text(); | 
					
						
							|  |  |  |     Vector<StringView> included_paths() const { return m_included_paths; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct DefinedValue { | 
					
						
							|  |  |  |         Optional<StringView> value; | 
					
						
							| 
									
										
										
										
											2021-03-13 10:37:23 +02:00
										 |  |  |         FlyString filename; | 
					
						
							|  |  |  |         size_t line { 0 }; | 
					
						
							|  |  |  |         size_t column { 0 }; | 
					
						
							| 
									
										
										
										
											2021-02-06 15:51:04 +02:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2021-03-12 17:04:08 +02:00
										 |  |  |     using Definitions = HashMap<StringView, DefinedValue>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const Definitions& definitions() const { return m_definitions; } | 
					
						
							| 
									
										
										
										
											2021-02-06 15:51:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-17 21:18:08 +03:00
										 |  |  |     void set_ignore_unsupported_keywords(bool ignore) { m_options.ignore_unsupported_keywords = ignore; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-12 17:04:08 +02:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2021-05-21 15:39:38 +03:00
										 |  |  |     using PreprocessorKeyword = StringView; | 
					
						
							|  |  |  |     PreprocessorKeyword handle_preprocessor_line(const StringView&); | 
					
						
							|  |  |  |     void handle_preprocessor_keyword(const StringView& keyword, GenericLexer& line_lexer); | 
					
						
							| 
									
										
										
										
											2021-02-06 15:51:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-12 17:04:08 +02:00
										 |  |  |     Definitions m_definitions; | 
					
						
							| 
									
										
										
										
											2021-03-13 10:37:23 +02:00
										 |  |  |     const String m_filename; | 
					
						
							| 
									
										
										
										
											2021-02-06 15:51:04 +02:00
										 |  |  |     const StringView m_program; | 
					
						
							|  |  |  |     StringBuilder m_builder; | 
					
						
							|  |  |  |     Vector<StringView> m_lines; | 
					
						
							|  |  |  |     size_t m_line_index { 0 }; | 
					
						
							|  |  |  |     size_t m_current_depth { 0 }; | 
					
						
							|  |  |  |     Vector<size_t> m_depths_of_taken_branches; | 
					
						
							|  |  |  |     Vector<size_t> m_depths_of_not_taken_branches; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     enum class State { | 
					
						
							|  |  |  |         Normal, | 
					
						
							|  |  |  |         SkipIfBranch, | 
					
						
							|  |  |  |         SkipElseBranch | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     State m_state { State::Normal }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Vector<StringView> m_included_paths; | 
					
						
							|  |  |  |     String m_processed_text; | 
					
						
							| 
									
										
										
										
											2021-03-17 21:18:08 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     struct Options { | 
					
						
							|  |  |  |         bool ignore_unsupported_keywords { false }; | 
					
						
							|  |  |  |     } m_options; | 
					
						
							| 
									
										
										
										
											2021-02-06 15:51:04 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | } |