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