public Ast.AstPredicate parse_Predicate1(SpecObject specObject, String property)
    {
        int at = m_current;
        if (!ok())
            {
            return null;
            }
        int tat;

        // Predicate1 : Expression Relation...Relation Expression

        Ast.AstExpression enode = parse_Expression(specObject, property);
        if (enode != null)
            {
            Ast.AstRelation rnode;
            Ast.AstRelationsP node = m_ast.new AstRelationsP(specObject, property);
            node.m_expressionL = enode;
            rnode = parse_Relation();
            if (rnode != null)
                {
                while (true)
                    {
                    node.m_relations.add(rnode);
                    tat = m_current;
                    rnode = parse_Relation();
                    if (rnode == null)
                        {
                        reset(tat);
                        break;
                        }
                    }
                node.m_expressionR = parse_Expression(specObject, property);
                if (ok())
                    {
                    return node;
                    }
                }
            }

        // Predicate1 : Expression.INIT

        reset(at);
        enode = parse_Expression(specObject, property);
        if (ok())
            {
            Ast.AstInitP node = m_ast.new AstInitP(specObject, property);
            node.m_expression = enode;
            next(TozeTokenizer.TOKEN_DOTINIT);
            if (ok())
                {
                return node;
                }
            }

        reset(at);
        Ast.AstPredicateExpression node = m_ast.new AstPredicateExpression(specObject, property);
        node.m_expression = parse_Expression(specObject, property);
        if (ok())
            {
            return node;
            }

        return parse_Predicate1sub1(at, specObject, property);
    }