# See ast_builder.py
#
# This is a definition of the AST tree from which C++ (or other
# language) code is generated.  It is also valid, executable python
# code which is used to build the data structures used by ast_builder.py.
# It doesn't do anything useful on it's own, of course.

from ast_builder import enum, ast, main, generic_list_ast, ref

class xp2_operators(enum):
    prefix='XP2_'
    options=('EQ',
             'NE',
             'GT',
             'GE',
             'LT',
             'LE',
             'ADD',
             'SUB',
             'MUL',
             'DIV',
             'UNION',
             'SLASH',
             'DOUBLE_SLASH')

class t_ast_node(ast):
    class t_ast_list(ast,generic("T")):
    class t_ast_expr(ast):
        class t_ast_true: pass
        class t_ast_literal(ast):
            class t_ast_string_literal(ast):
                value = "const char *"
            class t_ast_integer_literal(ast):
                value = "int"
            class t_ast_decimal_literal(ast):
                value = "decimal"
            class t_ast_double_literal(ast):
                value = "double"
        class t_ast_variable_reference(ast):
            class t_ast_context_item(ast): pass
            class t_ast_named_variable(ast):
                varname = "const char *"
        class t_ast_empty_tuple(ast): pass
        class t_ast_or(ast):
            args = ref.t_ast_list(ref.t_ast_expr)
        class t_ast_and(ast):
            args = ref.t_ast_list(ref.t_ast_expr)
        class t_ast_binary_oper(ast):
            oper = ref.xp2_operators
            left = ref.t_ast_expr
            right = ref.t_ast_expr
        class t_ast_unary_oper(ast):
            oper = ref.xp2_operators
            left = ref.t_ast_expr
        class t_ast_function_call(ast):
            args = ref.t_ast_list(ref.t_ast_expr)
        class t_ast_root_node(ast):
            context = ref.t_ast_expr
        class t_ast_apply_to(ast):
        class t_ast_double_slash(ast):
        class t_ast_predicate(ast):
            items = ref.t_ast_expr
            predicate = ref.t_ast_expr
        class t_ast_axis(ast):
            context = ref.t_ast_expr
        class t_ast_nametest(ast): pass
        class t_ast_flagtest(ast): pass
        class t_ast_instance_of(ast): pass
        class t_ast_castable_as(ast): pass
        class t_ast_cast_as(ast): pass

main (locals())
