def p_define_object(self, p):
        if p.parser.enable_declaratives():
            p.parser.namespace.define_object(p[2], p[3])

            # Try to parse replacement list as an expression
            tokens = p.parser.namespace.apply_macros(p[3])
            lexer = TokenListLexer(tokens)
            expr_parser = StrictConstantExpressionParser(lexer, 
                                                         p.parser.namespace)
            value = expr_parser.parse(debug=False)
            if value is not None:
                value = value.evaluate(p.parser.namespace)
                p.parser.write(
                    (create_token('PP_DEFINE_CONSTANT', (p[2], value), p),))
            else:
                # Didn't parse, pass on as string
                value = ' '.join([str(t.value) for t in p[3]])
                p.parser.write((create_token('PP_DEFINE', (p[2], value), p),))
Returns:
dataset/ETHPy150Open ardekantur/pyglet/tools/wraptypes/preprocessor.py/PreprocessorGrammar.p_define_object--crossover with--dataset/ETHPy150Open meraki-analytics/cassiopeia/cassiopeia/type/core/featuredgames.py/Participant.bot