66 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
		
		
			
		
	
	
			66 lines
		
	
	
		
			2.0 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 declarations such as includes and forward declarations. | ||
|  | 
 | ||
|  | Author: Duy Nguyen Ta, Fan Jiang, Matthew Sklar, Varun Agrawal, and Frank Dellaert | ||
|  | """
 | ||
|  | 
 | ||
|  | from pyparsing import CharsNotIn, Optional  # type: ignore | ||
|  | 
 | ||
|  | from .tokens import (CLASS, COLON, INCLUDE, LOPBRACK, ROPBRACK, SEMI_COLON, | ||
|  |                      VIRTUAL) | ||
|  | from .type import Typename | ||
|  | from .utils import collect_namespaces | ||
|  | 
 | ||
|  | 
 | ||
|  | class Include: | ||
|  |     """
 | ||
|  |     Rule to parse #include directives. | ||
|  |     """
 | ||
|  |     rule = (INCLUDE + LOPBRACK + CharsNotIn('>')("header") + | ||
|  |             ROPBRACK).setParseAction(lambda t: Include(t.header)) | ||
|  | 
 | ||
|  |     def __init__(self, header: CharsNotIn, parent: str = ''): | ||
|  |         self.header = header | ||
|  |         self.parent = parent | ||
|  | 
 | ||
|  |     def __repr__(self) -> str: | ||
|  |         return "#include <{}>".format(self.header) | ||
|  | 
 | ||
|  | 
 | ||
|  | class ForwardDeclaration: | ||
|  |     """
 | ||
|  |     Rule to parse forward declarations in the interface file. | ||
|  |     """
 | ||
|  |     rule = (Optional(VIRTUAL("is_virtual")) + CLASS + Typename.rule("name") + | ||
|  |             Optional(COLON + Typename.rule("parent_type")) + | ||
|  |             SEMI_COLON).setParseAction(lambda t: ForwardDeclaration( | ||
|  |                 t.name, t.parent_type, t.is_virtual)) | ||
|  | 
 | ||
|  |     def __init__(self, | ||
|  |                  typename: Typename, | ||
|  |                  parent_type: str, | ||
|  |                  is_virtual: str, | ||
|  |                  parent: str = ''): | ||
|  |         self.name = typename.name | ||
|  |         self.typename = typename | ||
|  |         if parent_type: | ||
|  |             self.parent_type = parent_type | ||
|  |         else: | ||
|  |             self.parent_type = '' | ||
|  | 
 | ||
|  |         self.is_virtual = is_virtual | ||
|  |         self.parent = parent | ||
|  | 
 | ||
|  |     def namespaces(self) -> list: | ||
|  |         """Get the namespaces which this class is nested under as a list.""" | ||
|  |         return collect_namespaces(self) | ||
|  | 
 | ||
|  |     def __repr__(self) -> str: | ||
|  |         return "ForwardDeclaration: {} {}".format(self.is_virtual, self.name) |