""" GTSAM Copyright 2010-2020, Georgia Tech Research Corporation, Atlanta, Georgia 30332-0415 All Rights Reserved See LICENSE for the license information All the token definitions. Author: Duy Nguyen Ta, Fan Jiang, Matthew Sklar, Varun Agrawal, and Frank Dellaert """ from pyparsing import Or # type: ignore from pyparsing import (Keyword, Literal, OneOrMore, QuotedString, Suppress, Word, alphanums, alphas, nestedExpr, nums, originalTextFor, printables) # rule for identifiers (e.g. variable names) IDENT = Word(alphas + '_', alphanums + '_') ^ Word(nums) RAW_POINTER, SHARED_POINTER, REF = map(Literal, "@*&") LPAREN, RPAREN, LBRACE, RBRACE, COLON, SEMI_COLON = map(Suppress, "(){}:;") LOPBRACK, ROPBRACK, COMMA, EQUAL = map(Suppress, "<>,=") DUNDER = Suppress(Literal("__")) # Default argument passed to functions/methods. # Allow anything up to ',' or ';' except when they # appear inside matched expressions such as # (a, b) {c, b} "hello, world", templates, initializer lists, etc. DEFAULT_ARG = originalTextFor( OneOrMore( QuotedString('"') ^ # parse double quoted strings QuotedString("'") ^ # parse single quoted strings Word(printables, excludeChars="(){}[]<>,;") ^ # parse arbitrary words nestedExpr(opener='(', closer=')') ^ # parse expression in parentheses nestedExpr(opener='[', closer=']') ^ # parse expression in brackets nestedExpr(opener='{', closer='}') ^ # parse expression in braces nestedExpr(opener='<', closer='>') # parse template expressions )) CONST, VIRTUAL, CLASS, STATIC, PAIR, TEMPLATE, TYPEDEF, INCLUDE = map( Keyword, [ "const", "virtual", "class", "static", "pair", "template", "typedef", "#include", ], ) ENUM = Keyword("enum") ^ Keyword("enum class") ^ Keyword("enum struct") NAMESPACE = Keyword("namespace") BASIC_TYPES = map( Keyword, [ "void", "bool", "unsigned char", "char", "int", "size_t", "double", "float", ], ) OPERATOR = Or( map( Literal, [ '+', # __add__, __pos__ '-', # __sub__, __neg__ '*', # __mul__ '/', # __truediv__ '%', # __mod__ '^', # __xor__ '&', # __and__ '|', # __or__ # '~', # __invert__ '+=', # __iadd__ '-=', # __isub__ '*=', # __imul__ '/=', # __itruediv__ '%=', # __imod__ '^=', # __ixor__ '&=', # __iand__ '|=', # __ior__ '<<', # __lshift__ '<<=', # __ilshift__ '>>', # __rshift__ '>>=', # __irshift__ '==', # __eq__ '!=', # __ne__ '<', # __lt__ '>', # __gt__ '<=', # __le__ '>=', # __ge__ # '!', # Use `not` in python # '&&', # Use `and` in python # '||', # Use `or` in python '()', # __call__ '[]', # __getitem__ ], ))