56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
		
		
			
		
	
	
			56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
|  | """
 | ||
|  | GTSAM Copyright 2010-2020, Georgia Tech Research Corporation, | ||
|  | Atlanta, Georgia 30332-0415 | ||
|  | All Rights Reserved | ||
|  | 
 | ||
|  | See LICENSE for the license information | ||
|  | 
 | ||
|  | Parser classes and rules for parsing C++ variables. | ||
|  | 
 | ||
|  | Author: Varun Agrawal, Gerry Chen | ||
|  | """
 | ||
|  | 
 | ||
|  | from typing import List | ||
|  | 
 | ||
|  | from pyparsing import Optional, ParseResults  # type: ignore | ||
|  | 
 | ||
|  | from .tokens import DEFAULT_ARG, EQUAL, IDENT, SEMI_COLON | ||
|  | from .type import TemplatedType, Type | ||
|  | 
 | ||
|  | 
 | ||
|  | class Variable: | ||
|  |     """
 | ||
|  |     Rule to parse variables. | ||
|  |     Variables are a combination of Type/TemplatedType and the variable identifier. | ||
|  | 
 | ||
|  |     E.g. | ||
|  |     ``` | ||
|  |     class Hello { | ||
|  |         string name;  // This is a property variable. | ||
|  |     }; | ||
|  | 
 | ||
|  |     Vector3 kGravity;  // This is a global variable. | ||
|  |     ```` | ||
|  |     """
 | ||
|  |     rule = ((Type.rule ^ TemplatedType.rule)("ctype")  # | ||
|  |             + IDENT("name")  # | ||
|  |             + Optional(EQUAL + DEFAULT_ARG)("default")  # | ||
|  |             + SEMI_COLON  # | ||
|  |             ).setParseAction(lambda t: Variable( | ||
|  |                 t.ctype,  # | ||
|  |                 t.name,  # | ||
|  |                 t.default[0] if isinstance(t.default, ParseResults) else None)) | ||
|  | 
 | ||
|  |     def __init__(self, | ||
|  |                  ctype: List[Type], | ||
|  |                  name: str, | ||
|  |                  default: ParseResults = None, | ||
|  |                  parent=''): | ||
|  |         self.ctype = ctype[0]  # ParseResult is a list | ||
|  |         self.name = name | ||
|  |         self.default = default | ||
|  |         self.parent = parent | ||
|  | 
 | ||
|  |     def __repr__(self) -> str: | ||
|  |         return '{} {}'.format(self.ctype.__repr__(), self.name) |