71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
| """
 | |
| GTSAM Copyright 2010-2020, Georgia Tech Research Corporation,
 | |
| Atlanta, Georgia 30332-0415
 | |
| All Rights Reserved
 | |
| 
 | |
| See LICENSE for the license information
 | |
| 
 | |
| Parser class and rules for parsing C++ enums.
 | |
| 
 | |
| Author: Varun Agrawal
 | |
| """
 | |
| 
 | |
| from pyparsing import delimitedList  # type: ignore
 | |
| 
 | |
| from .tokens import ENUM, IDENT, LBRACE, RBRACE, SEMI_COLON
 | |
| from .type import Typename
 | |
| from .utils import collect_namespaces
 | |
| 
 | |
| 
 | |
| class Enumerator:
 | |
|     """
 | |
|     Rule to parse an enumerator inside an enum.
 | |
|     """
 | |
|     rule = (
 | |
|         IDENT("enumerator")).setParseAction(lambda t: Enumerator(t.enumerator))
 | |
| 
 | |
|     def __init__(self, name):
 | |
|         self.name = name
 | |
| 
 | |
|     def __repr__(self):
 | |
|         return "Enumerator: ({0})".format(self.name)
 | |
| 
 | |
| 
 | |
| class Enum:
 | |
|     """
 | |
|     Rule to parse enums defined in the interface file.
 | |
| 
 | |
|     E.g.
 | |
|     ```
 | |
|     enum Kind {
 | |
|         Dog,
 | |
|         Cat
 | |
|     };
 | |
|     ```
 | |
|     """
 | |
| 
 | |
|     rule = (ENUM + IDENT("name") + LBRACE +
 | |
|             delimitedList(Enumerator.rule)("enumerators") + RBRACE +
 | |
|             SEMI_COLON).setParseAction(lambda t: Enum(t.name, t.enumerators))
 | |
| 
 | |
|     def __init__(self, name, enumerators, parent=''):
 | |
|         self.name = name
 | |
|         self.enumerators = enumerators
 | |
|         self.parent = parent
 | |
| 
 | |
|     def namespaces(self) -> list:
 | |
|         """Get the namespaces which this class is nested under as a list."""
 | |
|         return collect_namespaces(self)
 | |
| 
 | |
|     def cpp_typename(self):
 | |
|         """
 | |
|         Return a Typename with the namespaces and cpp name of this
 | |
|         class.
 | |
|         """
 | |
|         namespaces_name = self.namespaces()
 | |
|         namespaces_name.append(self.name)
 | |
|         return Typename(namespaces_name)
 | |
| 
 | |
|     def __repr__(self):
 | |
|         return "Enum: {0}".format(self.name)
 |