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)
 |