102 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
|  | """
 | ||
|  | GTSAM Copyright 2010-2020, Georgia Tech Research Corporation, | ||
|  | Atlanta, Georgia 30332-0415 | ||
|  | All Rights Reserved | ||
|  | 
 | ||
|  | See LICENSE for the license information | ||
|  | 
 | ||
|  | Classes and rules for parsing C++ templates and typedefs for template instantiations. | ||
|  | 
 | ||
|  | Author: Duy Nguyen Ta, Fan Jiang, Matthew Sklar, Varun Agrawal, and Frank Dellaert | ||
|  | """
 | ||
|  | 
 | ||
|  | from typing import List | ||
|  | 
 | ||
|  | from pyparsing import Optional, ParseResults, delimitedList  # type: ignore | ||
|  | 
 | ||
|  | from .tokens import (EQUAL, IDENT, LBRACE, LOPBRACK, RBRACE, ROPBRACK, | ||
|  |                      SEMI_COLON, TEMPLATE, TYPEDEF) | ||
|  | from .type import TemplatedType, Typename | ||
|  | 
 | ||
|  | 
 | ||
|  | class Template: | ||
|  |     """
 | ||
|  |     Rule to parse templated values in the interface file. | ||
|  | 
 | ||
|  |     E.g. | ||
|  |     template<POSE>  // this is the Template. | ||
|  |     class Camera { ... }; | ||
|  |     """
 | ||
|  |     class TypenameAndInstantiations: | ||
|  |         """
 | ||
|  |         Rule to parse the template parameters. | ||
|  | 
 | ||
|  |         template<typename POSE>  // POSE is the Instantiation. | ||
|  |         """
 | ||
|  |         rule = ( | ||
|  |             IDENT("typename")  # | ||
|  |             + Optional(  # | ||
|  |                 EQUAL  # | ||
|  |                 + LBRACE  # | ||
|  |                 + ((delimitedList(TemplatedType.rule ^ Typename.rule) | ||
|  |                     ("instantiations")))  # | ||
|  |                 + RBRACE  # | ||
|  |             )).setParseAction(lambda t: Template.TypenameAndInstantiations( | ||
|  |                 t.typename, t.instantiations)) | ||
|  | 
 | ||
|  |         def __init__(self, typename: str, instantiations: ParseResults): | ||
|  |             self.typename = typename | ||
|  | 
 | ||
|  |             self.instantiations = [] | ||
|  |             if instantiations: | ||
|  |                 for inst in instantiations: | ||
|  |                     x = inst.typename if isinstance(inst, | ||
|  |                                                     TemplatedType) else inst | ||
|  |                     self.instantiations.append(x) | ||
|  | 
 | ||
|  |     rule = (  # BR | ||
|  |         TEMPLATE  # | ||
|  |         + LOPBRACK  # | ||
|  |         + delimitedList(TypenameAndInstantiations.rule)( | ||
|  |             "typename_and_instantiations_list")  # | ||
|  |         + ROPBRACK  # BR | ||
|  |     ).setParseAction( | ||
|  |         lambda t: Template(t.typename_and_instantiations_list.asList())) | ||
|  | 
 | ||
|  |     def __init__( | ||
|  |             self, | ||
|  |             typename_and_instantiations_list: List[TypenameAndInstantiations]): | ||
|  |         ti_list = typename_and_instantiations_list | ||
|  |         self.typenames = [ti.typename for ti in ti_list] | ||
|  |         self.instantiations = [ti.instantiations for ti in ti_list] | ||
|  | 
 | ||
|  |     def __repr__(self) -> str: | ||
|  |         return "<{0}>".format(", ".join(self.typenames)) | ||
|  | 
 | ||
|  | 
 | ||
|  | class TypedefTemplateInstantiation: | ||
|  |     """
 | ||
|  |     Rule for parsing typedefs (with templates) within the interface file. | ||
|  | 
 | ||
|  |     E.g. | ||
|  |     ``` | ||
|  |     typedef SuperComplexName<Arg1, Arg2, Arg3> EasierName; | ||
|  |     ``` | ||
|  |     """
 | ||
|  |     rule = (TYPEDEF + TemplatedType.rule("templated_type") + | ||
|  |             IDENT("new_name") + | ||
|  |             SEMI_COLON).setParseAction(lambda t: TypedefTemplateInstantiation( | ||
|  |                 t.templated_type[0], t.new_name)) | ||
|  | 
 | ||
|  |     def __init__(self, | ||
|  |                  templated_type: TemplatedType, | ||
|  |                  new_name: str, | ||
|  |                  parent: str = ''): | ||
|  |         self.typename = templated_type.typename | ||
|  |         self.new_name = new_name | ||
|  |         self.parent = parent | ||
|  | 
 | ||
|  |     def __repr__(self): | ||
|  |         return "Typedef: {new_name} = {typename}".format( | ||
|  |             new_name=self.new_name, typename=self.typename) |