You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							126 lines
						
					
					
						
							3.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							126 lines
						
					
					
						
							3.9 KiB
						
					
					
				| /* | |
|  * This program source code file is part of KiCad, a free EDA CAD application. | |
|  * | |
|  * Copyright (C) 2021 Ola Rinta-Koski | |
|  * Copyright (C) 2021-2023 KiCad Developers, see AUTHORS.txt for contributors. | |
|  * | |
|  * This program is free software: you can redistribute it and/or modify it | |
|  * under the terms of the GNU General Public License as published by the | |
|  * Free Software Foundation, either version 3 of the License, or (at your | |
|  * option) any later version. | |
|  * | |
|  * This program is distributed in the hope that it will be useful, but | |
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | |
|  * General Public License for more details. | |
|  * | |
|  * You should have received a copy of the GNU General Public License along | |
|  * with this program.  If not, see <http://www.gnu.org/licenses/>. | |
|  */ | |
| 
 | |
| #ifndef MARKUP_PARSER_H | |
| #define MARKUP_PARSER_H | |
|  | |
| #include <pegtl.hpp> | |
| #include <pegtl/contrib/parse_tree.hpp> | |
| #include <iostream> | |
| #include <string> | |
| #include <core/utf8.h> | |
| #include <kicommon.h> | |
|  | |
| 
 | |
| namespace MARKUP | |
| { | |
| using namespace tao::pegtl; | |
| 
 | |
| struct subscript; | |
| struct superscript; | |
| struct overbar; | |
| 
 | |
| struct KICOMMON_API NODE : parse_tree::basic_node<NODE> | |
| { | |
|     std::string asString() const; | |
| 
 | |
|     std::string typeString() const; | |
| 
 | |
|     wxString asWxString() const; | |
| 
 | |
|     bool isOverbar() const     { return is_type<MARKUP::overbar>(); } | |
|     bool isSubscript() const   { return is_type<MARKUP::subscript>(); } | |
|     bool isSuperscript() const { return is_type<MARKUP::superscript>(); } | |
| }; | |
| 
 | |
| struct markup : sor< subscript, | |
|                      superscript, | |
|                      overbar > {}; | |
| 
 | |
| /** | |
|  * anyString = | |
|  * a run of characters that do not start a command sequence, or if they do, they do not start | |
|  * a complete command prefix (command char + open brace) | |
|  */ | |
| struct anyString : plus< seq< not_at< markup >, | |
|                               utf8::any > > {}; | |
| 
 | |
| struct escapeSequence : seq< string<'{'>, identifier, string<'}'> > {}; | |
| 
 | |
| struct anyStringWithinBraces : plus< sor< seq< not_at< markup >, | |
|                                                escapeSequence >, | |
|                                           seq< not_at< markup >, | |
|                                                utf8::not_one<'}'> > > > {}; | |
| 
 | |
| template< typename ControlChar > | |
| struct braces : seq< seq< ControlChar, | |
|                           string<'{'> >, | |
|                      until< string<'}'>, | |
|                             sor< anyStringWithinBraces, | |
|                                  subscript, | |
|                                  superscript, | |
|                                  overbar > > > {}; | |
| 
 | |
| struct superscript : braces< string<'^'> > {}; | |
| struct subscript   : braces< string<'_'> > {}; | |
| struct overbar     : braces< string<'~'> > {}; | |
| 
 | |
| /** | |
|  * Finally, the full grammar | |
|  */ | |
| struct anything : sor< anyString, | |
|                        subscript, | |
|                        superscript, | |
|                        overbar > {}; | |
| 
 | |
| struct grammar : until< tao::pegtl::eof, anything > {}; | |
| 
 | |
| template <typename Rule> | |
| using selector = parse_tree::selector< Rule, | |
|                                        parse_tree::store_content::on< anyStringWithinBraces, | |
|                                                                       anyString >, | |
|                                        parse_tree::discard_empty::on< superscript, | |
|                                                                       subscript, | |
|                                                                       overbar > >; | |
| 
 | |
| class KICOMMON_API MARKUP_PARSER | |
| { | |
| public: | |
|     MARKUP_PARSER( const std::string& source ) : | |
|             in( std::make_unique<string_input<>>( source, "from_input" ) ), | |
|             mem_in() | |
|     {} | |
| 
 | |
|     MARKUP_PARSER( const std::string* source ) : | |
|             in(), | |
|             mem_in( std::make_unique<memory_input<>>( *source, "from_input" ) ) | |
|     {} | |
| 
 | |
|     std::unique_ptr<NODE> Parse(); | |
| 
 | |
| private: | |
|     std::unique_ptr<string_input<>> in; | |
|     std::unique_ptr<memory_input<>> mem_in; | |
| }; | |
| 
 | |
| } // namespace MARKUP | |
|  | |
| 
 | |
| #endif //MARKUP_PARSER_H
 |